From e824271bae6ceba695e1f755f252e8af0a4baf5a Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 12 Sep 2026 21:25:56 +0200 Subject: [PATCH] Add Agents section to API reference - Add Agents endpoint groups (custom agents, agent files, agent threads, agent thread files, agent runtime) as the first entry in the API v1 reference layout - Add Agents overview page with verified examples for creating and copying agents, starting threads (incl. project/doc context), sending messages with inline entity mentions and file attachments, status polling, cancelling runs, files, and connectors - Document thread visibility rules for project/task-linked threads and the API key vs OAuth distinction for personal agents - Pull v1 OpenAPI spec from the develop CDN origin and bump Fern to 5.117.0 Co-Authored-By: Claude Fable 5 --- fern/apis/v1/generators.yml | 2 +- fern/apis/v1/openapi/openapi.json | 45425 +++++++++++++++++----------- fern/assets/api/agents01.jpg | Bin 0 -> 1443947 bytes fern/docs.yml | 9 +- fern/fern.config.json | 2 +- fern/pages/api/agents.mdx | 250 + 6 files changed, 27756 insertions(+), 17932 deletions(-) create mode 100644 fern/assets/api/agents01.jpg create mode 100644 fern/pages/api/agents.mdx diff --git a/fern/apis/v1/generators.yml b/fern/apis/v1/generators.yml index 466375b..45f345c 100644 --- a/fern/apis/v1/generators.yml +++ b/fern/apis/v1/generators.yml @@ -1,7 +1,7 @@ api: specs: - openapi: openapi/openapi.json - origin: https://app.awork.com/openapi/v1 + origin: https://cdn.awork.com/assets/awork-openapi-v1-develop.json?cacheBust=1789240490 settings: title-as-schema-name: true type-dates-as-strings: true diff --git a/fern/apis/v1/openapi/openapi.json b/fern/apis/v1/openapi/openapi.json index bb420a7..73c63ee 100644 --- a/fern/apis/v1/openapi/openapi.json +++ b/fern/apis/v1/openapi/openapi.json @@ -14,7 +14,7 @@ "servers": [ { "url": "https://api.awork.com/api/v1", - "description": "awork Production" + "description": "awork" } ], "paths": { @@ -1156,14 +1156,14 @@ } } }, - "/apiusers": { + "/agents": { "get": { "tags": [ - "ApiUsers" + "Custom Agents" ], - "summary": "Returns all API users.", - "description": "Returns all API users.\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetApiUsers", + "summary": "Returns all custom agents.", + "description": "Lists custom agents visible to the requesting user in the current workspace, including visible global agents.\r\n Results are ordered by name and include the user's access level for each agent.\r\n Use an agent id from this response to retrieve or update its configuration.\r\n\r\nAny authenticated user.", + "operationId": "GetAgents", "responses": { "200": { "description": "OK", @@ -1172,7 +1172,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ApiUser" + "$ref": "#/components/schemas/AgentSummaryResponseModel" } } } @@ -1190,23 +1190,22 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } }, "post": { "tags": [ - "ApiUsers" + "Custom Agents" ], - "summary": "Creates an API user.", - "description": "Beware: API users will also be returned in the /users response when including\r\n archived users.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostApiUser", + "summary": "Creates a new custom agent.", + "description": "Creates a custom agent in the current workspace and returns its configuration and id.\r\n Provide a name and either PresetKey or both ModelProvider and ModelName. Do not combine these model selection options.\r\n\r\nAny authenticated user.", + "operationId": "PostAgents", "requestBody": { - "description": "The model to create the API user.", + "description": "The configuration for the new agent.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiUserPostForm" + "$ref": "#/components/schemas/CreateAgentRequestModel" } } }, @@ -1218,7 +1217,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiUser" + "$ref": "#/components/schemas/AgentSummaryResponseModel" } } } @@ -1232,16 +1231,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -1255,37 +1244,34 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/apiusers/{apiUserId}": { - "delete": { + "/agents/connectors": { + "get": { "tags": [ - "ApiUsers" - ], - "summary": "Deletes the API user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "DeleteApiUserById", - "parameters": [ - { - "name": "apiUserId", - "in": "path", - "description": "The id of the API user to delete.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "AgentRuntime" ], + "summary": "Lists the connectors visible to the requesting user in the current workspace.", + "description": "Lists connectors visible to the requesting user in the current workspace.\r\n Use the returned connector ids to link existing connectors to custom agents.\r\n The user must have access to the custom-agent feature.\r\n\r\nAny authenticated user.", + "operationId": "GetConnectors", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectorResponseModel" + } + } + } + } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1306,42 +1292,31 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } - }, + } + }, + "/agents/connectors/presets": { "get": { "tags": [ - "ApiUsers" - ], - "summary": "Returns the API user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetApiUserById", - "parameters": [ - { - "name": "apiUserId", - "in": "path", - "description": "The id of the API user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "AgentRuntime" ], + "summary": "Lists the predefined connector presets available to the workspace.", + "description": "Lists predefined connector presets and the OAuth callback URI used for connector setup.\r\n Create connectors in the awork app.\r\n The response describes setup options; it does not create a connector.\r\n\r\nAny authenticated user.", + "operationId": "GetConnectorsPresets", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiUser" + "$ref": "#/components/schemas/ConnectorPresetsResponseModel" } } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1362,22 +1337,23 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } - }, + } + }, + "/agents/connectors/{connectorId}/sharing": { "put": { "tags": [ - "ApiUsers" + "AgentRuntime" ], - "summary": "Updates the API user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PutApiUserById", + "summary": "Makes a custom connector workspace-visible or private.", + "description": "Updates whether a custom connector is visible to the workspace or private and returns its sharing configuration.\r\n Set IsSharedWithWorkspace to the desired visibility. Making a connector private fails while connections remain shared or another user has a connection or agent using it.\r\n The user must own the connector or be a workspace administrator, and must have permission to contribute to the agent library.", + "operationId": "PutConnectorsSharingByConnectorId", "parameters": [ { - "name": "apiUserId", + "name": "connectorId", "in": "path", - "description": "The id of the API user to update.", + "description": "The connector id.", "required": true, "schema": { "type": "string", @@ -1386,11 +1362,11 @@ } ], "requestBody": { - "description": "The model to update the API user.", + "description": "The connector sharing configuration.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiUserForm" + "$ref": "#/components/schemas/ConnectorSharingRequestModel" } } }, @@ -1402,7 +1378,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiUser" + "$ref": "#/components/schemas/ConnectorSharingModel" } } } @@ -1417,6 +1393,16 @@ } } }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -1439,26 +1425,75 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/automations/catalog": { + "/agents/defaults": { "get": { "tags": [ - "Project Automations" + "AgentRuntime" + ], + "summary": "Gets the default agent options for a personal or custom agent.", + "description": "Returns default model, tool access, connector, and skill options for a personal-agent or custom-agent conversation.\r\n Set type to 'personal-agent' for the requesting user's defaults, or 'custom-agent' and provide agentId for a custom agent.\r\n The response also includes the effective model catalog for the workspace.\r\n The user must have read access to the selected custom agent.", + "operationId": "GetAgentDefaults", + "parameters": [ + { + "name": "type", + "in": "query", + "description": "The agent type to resolve defaults for ('personal-agent' or 'custom-agent').", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "agentId", + "in": "query", + "description": "The id of the custom agent when is 'custom-agent'.", + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Returns all supported automation trigger and action types.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetAutomationsCatalog", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutomationCatalogModel" + "$ref": "#/components/schemas/AgentDefaultsResponseModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -1479,14 +1514,14 @@ } } }, - "/autopilot/availablealerts": { + "/agents/management/threads": { "get": { "tags": [ - "Autopilot" + "AgentThreads" ], - "summary": "Returns all available alerts for autopilots.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetAutopilotAvailableAlerts", + "summary": "Returns thread metadata for usage analytics.", + "description": "Returns thread metadata for usage analytics, including the thread Id, name, credits, and creation timestamp.\r\n\r\nThe user must be an admin.", + "operationId": "GetAgentsManagementThreads", "responses": { "200": { "description": "OK", @@ -1495,13 +1530,9 @@ "schema": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/AiThreadAdminMetadataResponseModel" } - }, - "example": [ - "behind_schedule", - "overdue" - ] + } } } } @@ -1517,75 +1548,35 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } } }, - "/autopilot/{autopilotId}": { + "/agents/models": { "get": { "tags": [ - "Autopilot" - ], - "summary": "Returns the autopilot with the specified id.", - "description": "Returns the autopilot including its alerts.\r\n To get the autopilot data the user needs to be the owner of the project or 'read' permissions\r\n of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", - "operationId": "GetAutopilotByAutopilotId", - "parameters": [ - { - "name": "autopilotId", - "in": "path", - "description": "The id of the autopilot.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "AgentRuntime" ], + "summary": "Returns the AI models available to agents.", + "description": "Returns the agent model catalog with effective availability for the current workspace.\r\n The response includes model providers, model details, defaults, and available image capabilities.\r\n Use these values when selecting a model for an agent or conversation.\r\n\r\nAny authenticated user.", + "operationId": "GetModels", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Autopilot" + "$ref": "#/components/schemas/AgentRuntimeModelsResponseModel" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/clientapplications": { - "get": { - "tags": [ - "Client Applications" - ], - "summary": "Returns all client applications.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetClientApplications", - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ClientApplication" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -1602,41 +1593,45 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } - }, + } + }, + "/agents/models/settings/disable": { "post": { "tags": [ - "Client Applications" + "AgentRuntime" ], - "summary": "Registers a new client application.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostClientApplications", + "summary": "Disables a model, vendor, or region and updates settings that use it.", + "description": "Disables a model, vendor, or region for the workspace and updates settings that use it.\r\n Use the model settings in the awork app to review affected configurations and eligible replacements before disabling.\r\n Specify the required replacement models in the request. Returns no content when the changes are saved.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostAgentsModelsSettingsDisable", "requestBody": { - "description": "The client application model.", + "description": "The disable and migration command.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientApplicationCreateForm" + "$ref": "#/components/schemas/DisableModelsRequestModel" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientApplicationCreateResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1662,38 +1657,52 @@ } } }, - "/clientapplications/register": { - "post": { + "/agents/models/settings/presets/{presetKey}": { + "put": { "tags": [ - "Client Applications" + "AgentRuntime" + ], + "summary": "Sets a workspace preset to Auto or a selected active text model.", + "description": "Updates a workspace model preset to use central Auto selection or an explicit active text model.\r\n Identify the preset by its catalog key and provide the assignment in the request body.\r\n Returns no content when the assignment is saved, or a validation error if the selection is invalid.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PutAgentsModelsSettingsPresetsByPresetKey", + "parameters": [ + { + "name": "presetKey", + "in": "path", + "description": "The preset key.", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Dynamically registers a new OAuth 2.0 client according to RFC 7591.", - "description": "\r\n\r\nAllows unauthenticated access.", - "operationId": "PostClientApplicationsRegister", "requestBody": { - "description": "The dynamic client registration request.", + "description": "The preset assignment.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DynamicClientRegistrationEndpointRequest" + "$ref": "#/components/schemas/SetModelPresetRequestModel" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DynamicClientRegistrationResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1714,23 +1723,24 @@ "v1" ], "x-access": { - "anonymous": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/clientapplications/{clientId}": { - "delete": { + "/agents/models/settings/regions/{regionKey}/enable": { + "post": { "tags": [ - "Client Applications" + "AgentRuntime" ], - "summary": "Deletes the specified client application.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "DeleteClientApplicationsByClientId", + "summary": "Enables an AI model region for the workspace.", + "description": "Enables an AI model serving region in the workspace's model policy.\r\n Use the stable region key from the model catalog. Returns no content when the policy is saved.\r\n Read [GET /agents/models](#/AgentRuntime/GetModels) to inspect the resulting model availability.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostAgentsModelsSettingsRegionsEnableByRegionKey", "parameters": [ { - "name": "clientId", + "name": "regionKey", "in": "path", - "description": "The id of the client application.", + "description": "The stable serving-region key.", "required": true, "schema": { "type": "string" @@ -1751,8 +1761,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1776,19 +1786,21 @@ "admin": "true", "workspace-manage-config": "write" } - }, - "get": { + } + }, + "/agents/models/settings/vendors/{vendorKey}/enable": { + "post": { "tags": [ - "Client Applications" + "AgentRuntime" ], - "summary": "Returns the client application with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetClientApplicationsByClientId", + "summary": "Enables one AI model vendor for the workspace.", + "description": "Enables an AI model vendor in the workspace's model policy.\r\n Use the stable vendor key from the model catalog. Returns no content when the policy is saved.\r\n Read [GET /agents/models](#/AgentRuntime/GetModels) to inspect the resulting model availability.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostAgentsModelsSettingsVendorsEnableByVendorKey", "parameters": [ { - "name": "clientId", + "name": "vendorKey", "in": "path", - "description": "The id of the client application.", + "description": "The stable vendor key.", "required": true, "schema": { "type": "string" @@ -1796,18 +1808,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientApplication" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1829,48 +1844,32 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "read" + "workspace-manage-config": "write" } - }, - "put": { + } + }, + "/agents/models/{modelKey}/enable": { + "post": { "tags": [ - "Client Applications" + "AgentRuntime" ], - "summary": "Updates the client application with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PutClientApplicationsByClientId", + "summary": "Enables one AI model for the workspace.", + "description": "Enables one catalog model for the workspace and returns no content when the policy is saved.\r\n Use the stable model key from [GET /agents/models](#/AgentRuntime/GetModels). The model's vendor and serving region must be enabled first.\r\n Removed models and models that cannot be changed in the current rollout state return a validation error.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostAgentsModelsEnableByModelKey", "parameters": [ { - "name": "clientId", + "name": "modelKey", "in": "path", - "description": "The id of the client application.", + "description": "The stable, URL-safe catalog key.", "required": true, "schema": { "type": "string" } } ], - "requestBody": { - "description": "The client application model.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClientApplicationUpdateForm" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClientApplication" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -1882,8 +1881,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -1909,31 +1908,20 @@ } } }, - "/clientapplications/{clientId}/generateapikey": { + "/agents/threads": { "post": { "tags": [ - "Client Applications" - ], - "summary": "Generates an API key for the specified client application.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "PostClientApplicationsGenerateApiKeyByClientId", - "parameters": [ - { - "name": "clientId", - "in": "path", - "description": "The id of the client application.", - "required": true, - "schema": { - "type": "string" - } - } + "AgentThreads" ], + "summary": "Creates a conversation with the awork Agent or a custom agent.", + "description": "Creates a conversation with the awork Agent or a custom agent and optionally submits the first message.\r\n Supply content or attachments to submit the first message and start processing.\r\n awork Agent threads can be created without a message. Custom Agent threads require text or an attachment.\r\n The response contains the thread and accepted first-message identifiers, not the agent's reply.\r\n See [GET /agents/threads/{threadId}/messages](api:GET/agents/threads/{threadId}/messages) to retrieve replies.\r\n Each request creates a new thread. Retrying after a lost response can create another thread.\r\n\r\nAny authenticated user.", + "operationId": "PostAgentsThreads", "requestBody": { - "description": "The model to generate an API key.", + "description": "The thread creation payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientApplicationApiKeyForm" + "$ref": "#/components/schemas/AiThreadCreateRequestModel" } } }, @@ -1945,7 +1933,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TokenResponse" + "$ref": "#/components/schemas/AiThreadCreatedResponseModel" } } } @@ -1960,6 +1948,16 @@ } } }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -1969,6 +1967,16 @@ } } } + }, + "503": { + "description": "Service Unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -1982,27 +1990,27 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } } }, - "/clientapplications/{clientId}/generatesecret": { - "post": { + "/agents/threads/{threadId}": { + "get": { "tags": [ - "Client Applications" + "AgentThreads" ], - "summary": "Generates a new secret for the specified client application.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostClientApplicationsGenerateSecretByClientId", + "summary": "Gets an agent thread.", + "description": "Returns details of the specified agent conversation.\r\n Use the thread id returned when creating a conversation. Retrieve its messages separately with [GET /agents/threads/{threadId}/messages](api:GET/agents/threads/{threadId}/messages).\r\n Returns not found if the thread is missing or is not visible to the user.\r\n\r\nAny authenticated user.", + "operationId": "GetAgentsThreadsByThreadId", "parameters": [ { - "name": "clientId", + "name": "threadId", "in": "path", - "description": "The id of the client application.", + "description": "The id of the thread to retrieve.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -2012,17 +2020,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientApplicationGeneratePasswordResponse" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/AgentThreadResponseModel" } } } @@ -2049,31 +2047,28 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/companies": { - "get": { + "/agents/threads/{threadId}/cancel": { + "post": { "tags": [ - "Companies" + "AgentThreads" ], - "summary": "Returns all companies.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", - "operationId": "GetCompanies", + "summary": "Cancels the active run for the specified agent thread.", + "description": "Cancels the active run in the specified personal-agent or custom-agent conversation and returns the thread.\r\n A successful cancellation also pauses dispatch of the next queued message.\r\n The user must have permission to contribute to the thread.", + "operationId": "PostAgentsThreadsCancelByThreadId", "parameters": [ { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "threadId", + "in": "path", + "description": "The thread id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -2082,10 +2077,17 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Company" - } + "$ref": "#/components/schemas/AgentThreadResponseModel" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2102,95 +2104,47 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "read" + "any": "true" } - }, - "post": { + } + }, + "/agents/threads/{threadId}/files/{fileId}": { + "get": { "tags": [ - "Companies" + "Agent Thread Files" ], - "summary": "Creates a new company.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PostCompany", - "requestBody": { - "description": "The company to create.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CompanyForm" - } + "summary": "Returns a file of the specified agent thread.", + "description": "Returns file metadata for a file attached to the specified agent thread.\r\n Both the thread id and file id must match the attachment. Returns not found if the file is not attached to that thread.\r\n The user must have `read` access to the agent thread.", + "operationId": "GetAgentsThreadsFilesByThreadIdAndFileId", + "parameters": [ + { + "name": "threadId", + "in": "path", + "description": "The agent thread id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Company" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ { - "oauth2": [ - "full_access" - ] + "name": "fileId", + "in": "path", + "description": "The file id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "company-master-data": "write" - } - } - }, - "/companies/deletetags": { - "post": { - "tags": [ - "CompanyTags" - ], - "summary": "Removes a tag from all companies.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PostCompaniesDeleteTags", - "requestBody": { - "description": "The model with the tag to be removed.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteTagForm" - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -2204,42 +2158,13 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "company-master-data": "write" - } - } - }, - "/companies/industries": { - "get": { - "tags": [ - "Companies" - ], - "summary": "Returns all company industries that are currently in use.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", - "operationId": "GetCompaniesIndustries", - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2256,78 +2181,74 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "read" + "any": "true" } } }, - "/companies/tags": { + "/agents/threads/{threadId}/files/{fileId}/download": { "get": { "tags": [ - "CompanyTags" + "Agent Thread Files" ], - "summary": "Returns all tags that are currently in use by companies.", - "description": "Returns all tags that are currently in use by companies ordered by count.\r\n\r\nAny authenticated user.", - "operationId": "GetCompanyTags", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } + "summary": "Returns the content of a file from the specified agent thread.", + "description": "Returns the binary content of a file attached to the specified agent thread.\nUse the thread id and file id from the attachment metadata. For images, width, height, and crop control resizing.\nThe user must have read access to the agent thread.", + "operationId": "GetAgentThreadFileContent", + "parameters": [ + { + "name": "threadId", + "in": "path", + "description": "The agent thread id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - } - }, - "security": [ + }, { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/companies/updatetags": { - "post": { - "tags": [ - "CompanyTags" - ], - "summary": "Updates a tag globally for all companies.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PostCompaniesUpdateTags", - "requestBody": { - "description": "The model containing the tag updates.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TagUpdateForm" - } + "name": "fileId", + "in": "path", + "description": "The file id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + { + "name": "width", + "in": "query", + "description": "The optional image width.", + "schema": { + "type": "number", + "format": "double" + } }, - "401": { - "description": "Unauthorized", + { + "name": "height", + "in": "query", + "description": "The optional image height.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -2344,24 +2265,23 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "write" + "any": "true" } } }, - "/companies/{companyId}": { + "/agents/threads/{threadId}/messages": { "get": { "tags": [ - "Companies" + "AgentThreads" ], - "summary": "Returns the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", - "operationId": "GetCompanyById", + "summary": "Lists agent thread messages.", + "description": "Lists messages from the specified personal-agent or custom-agent conversation.\r\n Use this endpoint to retrieve replies after creating a thread or submitting a message.\r\n Returns not found if the thread is missing or the user cannot read it.\r\n\r\nAny authenticated user.", + "operationId": "GetAgentsThreadsMessagesByThreadId", "parameters": [ { - "name": "companyId", + "name": "threadId", "in": "path", - "description": "The id of the company.", + "description": "The thread id.", "required": true, "schema": { "type": "string", @@ -2375,7 +2295,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Company" + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentThreadMessageResponseModel" + } } } } @@ -2402,22 +2325,21 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "read" + "any": "true" } }, - "put": { + "post": { "tags": [ - "Companies" + "AgentThreads" ], - "summary": "Updates the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PutCompanyById", + "summary": "Submits a message to an agent conversation.", + "description": "Submits a new message to an existing agent conversation for processing.\r\n Provide text, attachments, or both. The message starts processing or enters the thread's queue.\r\n The response confirms acceptance; it does not contain the agent's reply.\r\n Read [GET /agents/threads/{threadId}/messages](api:GET/agents/threads/{threadId}/messages) to retrieve replies.\r\n Each request submits a new message. Retrying after a lost response can submit the message again.\r\n Processing is subject to the workspace's AI availability and usage limits.\r\n The user must have permission to contribute to the thread.", + "operationId": "PostAgentsThreadsMessagesByThreadId", "parameters": [ { - "name": "companyId", + "name": "threadId", "in": "path", - "description": "The id of the company to update.", + "description": "The id of the thread to send the message in.", "required": true, "schema": { "type": "string", @@ -2426,11 +2348,11 @@ } ], "requestBody": { - "description": "The model with updated company data.", + "description": "The model with the content to send to the agent thread.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CompanyForm" + "$ref": "#/components/schemas/AgentThreadMessageRequestModel" } } }, @@ -2442,7 +2364,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Company" + "$ref": "#/components/schemas/AiThreadMessageAcceptedResponseModel" } } } @@ -2456,6 +2378,26 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service Unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -2469,24 +2411,33 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "write" + "any": "true" } } }, - "/companies/{companyId}/addtags": { - "post": { + "/agents/threads/{threadId}/messages/{messageId}/status": { + "get": { "tags": [ - "CompanyTags" + "AgentThreads" ], - "summary": "Adds a batch of new tags to the company with the specified id.", - "description": "The request fails if one of the tags is invalid (e.g. empty or duplicate).\r\n To add tags to a company the user must have `company-master-data:write` permissions on the specified company.", - "operationId": "PostCompanyAddTagsByCompanyId", + "summary": "Gets agent thread message status.", + "description": "Returns the processing status of a submitted agent thread message, including messages still in the queue.\r\n Use the accepted message id returned by the server when creating a thread or submitting a message.\r\n The response indicates whether an agent response exists and includes its id and error details when available.\r\n Retrieve reply content with [GET /agents/threads/{threadId}/messages](api:GET/agents/threads/{threadId}/messages).\r\n\r\nAny authenticated user.", + "operationId": "GetAgentsThreadsMessagesStatusByThreadIdAndMessageId", "parameters": [ { - "name": "companyId", + "name": "threadId", "in": "path", - "description": "The id of the company to add tags to.", + "description": "The id of the thread that contains the message.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "messageId", + "in": "path", + "description": "The accepted message id returned by the server.", "required": true, "schema": { "type": "string", @@ -2494,46 +2445,19 @@ } } ], - "requestBody": { - "description": "The model containing the tags to be added.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagForm" - } - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/AiThreadMessageProcessingStatusResponseModel" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -2558,36 +2482,24 @@ } } }, - "/companies/{companyId}/contactinfo": { + "/agents/{agentId}": { "get": { "tags": [ - "Companies" + "Custom Agents" ], - "summary": "Returns the contact infos of the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", - "operationId": "GetCompanyContactInfoByCompanyId", + "summary": "Returns the custom agent's configuration.", + "description": "Returns the specified custom agent's configuration, including the requesting user's access level.\r\n Use this response to inspect the agent's model, prompt, and linked capabilities before working with it.\r\n The user must have read access to the agent.", + "operationId": "GetAgentsByAgentId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The agent id.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -2596,10 +2508,27 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ContactInfoForCompanies" - } + "$ref": "#/components/schemas/AgentSummaryResponseModel" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2616,22 +2545,21 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "read" + "any": "true" } }, - "post": { + "put": { "tags": [ - "Companies" + "Custom Agents" ], - "summary": "Creates a new contact info for the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PostCompanyContactInfoByCompanyId", + "summary": "Updates the custom agent's configuration.", + "description": "Updates the custom agent's configuration and returns the saved agent.\r\n Saves a new system prompt version if the prompt changes.\r\n The user must have manage access to the agent. Changing workspace sharing also requires permission to contribute to the agent library.", + "operationId": "PutAgentsByAgentId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The agent id.", "required": true, "schema": { "type": "string", @@ -2640,11 +2568,11 @@ } ], "requestBody": { - "description": "The contact info to create.", + "description": "The new agent configuration.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfoForm" + "$ref": "#/components/schemas/UpdateAgentRequestModel" } } }, @@ -2656,7 +2584,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfoForCompanies" + "$ref": "#/components/schemas/AgentSummaryResponseModel" } } } @@ -2670,6 +2598,26 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -2683,24 +2631,23 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "write" + "any": "true" } } }, - "/companies/{companyId}/contactinfo/{contactInfoId}": { + "/agents/{agentId}/connectors/{connectorId}": { "delete": { "tags": [ - "Companies" + "Custom Agents" ], - "summary": "Deletes the contact info of the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "DeleteCompanyContactInfoByCompanyIdAndContactInfoId", + "summary": "Unlinks a connector from an agent.", + "description": "Removes the connector link from the specified agent.\r\n Returns no content when the link is removed or is already absent.\r\n The user must have manage access to the agent.", + "operationId": "DeleteConnectorsByConnectorIdAndAgentId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The agent id.", "required": true, "schema": { "type": "string", @@ -2708,9 +2655,9 @@ } }, { - "name": "contactInfoId", + "name": "connectorId", "in": "path", - "description": "The id of the contact info.", + "description": "The connector id.", "required": true, "schema": { "type": "string", @@ -2722,8 +2669,8 @@ "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -2754,22 +2701,21 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "write" + "any": "true" } }, - "get": { + "post": { "tags": [ - "Companies" + "Custom Agents" ], - "summary": "Returns the specified contact info of the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", - "operationId": "GetCompanyContactInfoByCompanyIdAndContactInfoId", + "summary": "Links a connector to an agent.", + "description": "Links an existing connector to the specified agent and returns the linked connector.\r\n Use [GET /agents/connectors](#/AgentRuntime/GetConnectors) to find a connector id.\r\n The user must have manage access to the agent.", + "operationId": "PostConnectorsByConnectorIdAndAgentId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The agent id.", "required": true, "schema": { "type": "string", @@ -2777,26 +2723,14 @@ } }, { - "name": "contactInfoId", + "name": "connectorId", "in": "path", - "description": "The id of the contact info.", + "description": "The connector id.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -2805,13 +2739,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfoForCompanies" + "$ref": "#/components/schemas/ConnectorResponseModel" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -2842,32 +2776,23 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "read" + "any": "true" } - }, - "put": { + } + }, + "/agents/{agentId}/copy": { + "post": { "tags": [ - "Companies" + "Custom Agents" ], - "summary": "Updates the contact info for the company with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PutCompanyContactInfoByCompanyIdAndContactInfoId", + "summary": "Copies an existing custom agent.", + "description": "Creates a copy of an existing custom agent in the current workspace.\r\n Provide the new name and optional description in the request body. The source agent supplies the initial configuration and system prompt.\r\n Returns the new agent with its own id.\r\n The user must have read access to the source agent.", + "operationId": "PostAgentsCopyByAgentId", "parameters": [ { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "contactInfoId", + "name": "agentId", "in": "path", - "description": "The id of the contact info.", + "description": "The source agent id.", "required": true, "schema": { "type": "string", @@ -2876,11 +2801,11 @@ } ], "requestBody": { - "description": "The updated contact info data.", + "description": "The name and description for the copy.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfoForm" + "$ref": "#/components/schemas/CopyAgentRequestModel" } } }, @@ -2892,7 +2817,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfoForCompanies" + "$ref": "#/components/schemas/AgentSummaryResponseModel" } } } @@ -2906,16 +2831,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -2929,72 +2844,52 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "write" + "any": "true" } } }, - "/companies/{companyId}/delete": { - "post": { + "/agents/{agentId}/files": { + "get": { "tags": [ - "Companies" + "AgentFiles" ], - "summary": "Deletes the company with the specified id.", - "description": "There are several ways to delete a company.\r\n Look into the property description of the post model to get detailed information.\r\n
If the post is executed without a model, the default process 'delete-only-company' will be executed.\r\n
For the operation 'delete-all-without-timeentries' project-master-data write permissions are required on all projects of the company.\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", - "operationId": "PostCompanyDeleteByCompanyId", + "summary": "Returns all files of the agent with the specified id.", + "description": "Returns all file metadata of the agent with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetAgentFiles", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The id of the agent.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model describing how to delete the company.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CompanyDeleteForm" - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } } } } @@ -3011,24 +2906,23 @@ "v1" ], "x-access": { - "admin": "true", - "company-master-data": "write" + "any": "true" } } }, - "/companies/{companyId}/deletetags": { + "/agents/{agentId}/files/byuploadid": { "post": { "tags": [ - "CompanyTags" + "FileUpload" ], - "summary": "Removes tags from the company with the specified id.", - "description": "Removes tags from the company with the specified id.\r\n \r\n Returns 204 NoContent if all tags have been removed successfully.\r\n Returns 207 MultiStatus if at least one tag could not be removed, including the reasons.\r\n \r\n To remove tags from a company the user must have `company-master-data:write` permissions on the specified company.", - "operationId": "PostCompanyDeleteTagsByCompanyId", + "summary": "Creates a file from an upload id.", + "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file agent from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", + "operationId": "PostUploadByUploadId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The id of the agent to attach the file to.", "required": true, "schema": { "type": "string", @@ -3037,38 +2931,29 @@ } ], "requestBody": { - "description": "The tags to remove.", + "description": "The model describing the uploaded file metadata.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DeleteTagForm" - } + "$ref": "#/components/schemas/UploadByUploadIdForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "207": { - "description": "Multi-Status" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -3093,87 +2978,29 @@ } } }, - "/companies/{companyId}/externalfiles": { - "post": { + "/agents/{agentId}/files/{fileId}": { + "delete": { "tags": [ - "CompanyFiles" + "AgentFiles" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Deletes the agent file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteAgentFile", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The id of the agent.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "List of file forms.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileInfo" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/companies/{companyId}/files": { - "delete": { - "tags": [ - "CompanyFiles" - ], - "summary": "Deletes the files of the specified company.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCompanyFiles", - "parameters": [ + }, { - "name": "companyId", + "name": "fileId", "in": "path", - "description": "The id of the company.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -3199,19 +3026,21 @@ "x-access": { "any": "true" } - }, + } + }, + "/agents/{agentId}/setarchived": { "post": { "tags": [ - "CompanyFiles" + "Custom Agents" ], - "summary": "Creates a new company file for the company with the specified id..", - "description": "Uploads a new company file for the company with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateCompanyFile", + "summary": "Archives or unarchives an agent.", + "description": "Archives or unarchives the specified custom agent and returns its updated configuration.\r\n Set IsArchived to true to archive the agent, or false to unarchive it.\r\n The user must have manage access to the agent.", + "operationId": "PostAgentsSetArchivedByAgentId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The agent id.", "required": true, "schema": { "type": "string", @@ -3220,27 +3049,15 @@ } ], "requestBody": { + "description": "Whether to archive or unarchive the agent.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/SetAgentArchivedRequestModel" } } - } + }, + "required": true }, "responses": { "200": { @@ -3248,13 +3065,40 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/AgentSummaryResponseModel" } } } }, "400": { - "description": "Bad Request" + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -3272,19 +3116,19 @@ } } }, - "/companies/{companyId}/files/byurl": { - "post": { + "/agents/{agentId}/systempromptversions": { + "get": { "tags": [ - "CompanyFiles" + "Custom Agents" ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateCompanyFileByUrl", + "summary": "Lists the agent's saved system prompt versions.", + "description": "Lists the saved system prompt versions for the specified custom agent.\r\n Use a returned version id with the system prompt restore endpoint to restore an earlier prompt.\r\n The user must have read access to the agent.", + "operationId": "GetAgentsSystemPromptVersionsByAgentId", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company the file is linked to.", + "description": "The agent id.", "required": true, "schema": { "type": "string", @@ -3292,28 +3136,36 @@ } } ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemPromptVersionResponseModel" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3334,19 +3186,19 @@ } } }, - "/companies/{companyId}/files/{fileId}": { - "delete": { + "/agents/{agentId}/systempromptversions/{systemPromptVersionId}/restore": { + "post": { "tags": [ - "CompanyFiles" + "Custom Agents" ], - "summary": "Deletes the company file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCompanyFile", + "summary": "Restores a previous system prompt version.", + "description": "Restores a saved system prompt version as the agent's current prompt.\r\n The restore records a new history version and returns that version. Use the system prompt versions endpoint to find a version id.\r\n The user must have manage access to the agent.", + "operationId": "PostAgentsSystemPromptVersionRestore", "parameters": [ { - "name": "companyId", + "name": "agentId", "in": "path", - "description": "The id of the company.", + "description": "The agent id.", "required": true, "schema": { "type": "string", @@ -3354,9 +3206,9 @@ } }, { - "name": "fileId", + "name": "systemPromptVersionId", "in": "path", - "description": "The id of the file.", + "description": "The prompt version id.", "required": true, "schema": { "type": "string", @@ -3365,8 +3217,35 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemPromptVersionResponseModel" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -3382,49 +3261,77 @@ "x-access": { "any": "true" } - }, + } + }, + "/apiusers": { "get": { "tags": [ - "Company Files" + "ApiUsers" ], - "summary": "Returns the file with the specified id of the company with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByCompanyNameAndCompanyIdAndFileId", - "parameters": [ - { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Returns all API users.", + "description": "Returns all API users.\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetApiUsers", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiUser" + } + } + } } - }, + } + }, + "security": [ { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "oauth2": [ + "full_access" + ] } ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "workspace-manage-config": "read" + } + }, + "post": { + "tags": [ + "ApiUsers" + ], + "summary": "Creates an API user.", + "description": "Beware: API users will also be returned in the /users response when including\r\n archived users.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostApiUser", + "requestBody": { + "description": "The model to create the API user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiUserPostForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ApiUser" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -3455,31 +3362,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } - }, - "put": { + } + }, + "/apiusers/{apiUserId}": { + "delete": { "tags": [ - "CompanyFiles" + "ApiUsers" ], - "summary": "Updates the metadata of the company file with the specified id.", - "description": "Updates the metadata of the company file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateCompanyFile", + "summary": "Deletes the API user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "DeleteApiUserById", "parameters": [ { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "apiUserId", "in": "path", - "description": "The id of the file.", + "description": "The id of the API user to delete.", "required": true, "schema": { "type": "string", @@ -3487,28 +3387,16 @@ } } ], - "requestBody": { - "description": "The model to update the file with the specified id.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - } - } - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3525,33 +3413,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } - } - }, - "/companies/{companyId}/files/{fileId}/changeentity": { - "post": { + }, + "get": { "tags": [ - "CompanyFiles" + "ApiUsers" ], - "summary": "Changes the company this file belongs to.", - "description": "Changes the company this file belongs to.\nSwitch to the specified company or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeCompany", + "summary": "Returns the API user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetApiUserById", "parameters": [ { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "apiUserId", "in": "path", - "description": "The id of the file.", + "description": "The id of the API user.", "required": true, "schema": { "type": "string", @@ -3559,28 +3436,23 @@ } } ], - "requestBody": { - "description": "The model to change the entity information of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ApiUser" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3597,33 +3469,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } - } - }, - "/companies/{companyId}/files/{fileId}/copy": { - "post": { + }, + "put": { "tags": [ - "CompanyFiles" + "ApiUsers" ], - "summary": "Copies the file to a new company.", - "description": "Copies the file to a new company (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToCompany", + "summary": "Updates the API user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PutApiUserById", "parameters": [ { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "apiUserId", "in": "path", - "description": "The id of the file.", + "description": "The id of the API user to update.", "required": true, "schema": { "type": "string", @@ -3632,19 +3493,15 @@ } ], "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The model to update the API user.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" + "$ref": "#/components/schemas/ApiUserForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -3652,7 +3509,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ApiUser" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3669,74 +3546,26 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/companies/{companyId}/files/{fileId}/download": { + "/automations/catalog": { "get": { "tags": [ - "CompanyFiles" - ], - "summary": "Returns the content of the company file with the specified id.", - "description": "Returns the content of the company file. Uses the latest file version.\nIf the company file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetCompanyFileContent", - "parameters": [ - { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", - "schema": { - "type": "boolean" - } - } + "Project Automations" ], + "summary": "Returns all supported automation trigger and action types.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetAutomationsCatalog", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/AutomationCatalogModel" } } } @@ -3757,54 +3586,29 @@ } } }, - "/companies/{companyId}/files/{fileId}/pdf": { + "/autopilot/availablealerts": { "get": { "tags": [ - "CompanyFiles" - ], - "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the company file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetCompanyFileContent", - "parameters": [ - { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "inline", - "in": "query", - "description": "If inline is false, content-disposition header is attachment.", - "schema": { - "type": "boolean", - "default": false - } - } + "Autopilot" ], + "summary": "Returns all available alerts for autopilots.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetAutopilotAvailableAlerts", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" - } + "type": "array", + "items": { + "type": "string" + } + }, + "example": [ + "behind_schedule", + "overdue" + ] } } } @@ -3824,29 +3628,19 @@ } } }, - "/companies/{companyId}/files/{fileId}/shareurl": { + "/autopilot/{autopilotId}": { "get": { "tags": [ - "CompanyFiles" + "Autopilot" ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", + "summary": "Returns the autopilot with the specified id.", + "description": "Returns the autopilot including its alerts.\r\n To get the autopilot data the user needs to be the owner of the project or 'read' permissions\r\n of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", + "operationId": "GetAutopilotByAutopilotId", "parameters": [ { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "autopilotId", "in": "path", - "description": "The id of the file.", + "description": "The id of the autopilot.", "required": true, "schema": { "type": "string", @@ -3860,7 +3654,7 @@ "content": { "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/Autopilot" } } } @@ -3881,48 +3675,14 @@ } } }, - "/companies/{companyId}/files/{fileId}/versions": { + "/clientapplications": { "get": { "tags": [ - "CompanyFiles" - ], - "summary": "Returns all file versions of the specified company file.", - "description": "Returns all file versions of the specified company file.\r\n\r\nAny authenticated user.", - "operationId": "GetCompanyFileVersions", - "parameters": [ - { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } + "Client Applications" ], + "summary": "Returns all client applications.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetClientApplications", "responses": { "200": { "description": "OK", @@ -3931,7 +3691,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/ClientApplication" } } } @@ -3949,60 +3709,27 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } }, "post": { "tags": [ - "CompanyFiles" - ], - "summary": "Uploads a new version of the company file with the specified id.", - "description": "Uploads a new version of an company file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateCompanyFileVersion", - "parameters": [ - { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Client Applications" ], + "summary": "Registers a new client application.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostClientApplications", "requestBody": { + "description": "The client application model.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/ClientApplicationCreateForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -4010,13 +3737,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/ClientApplicationCreateResponse" } } } }, "400": { - "description": "Bad Request" + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -4030,73 +3764,43 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/companies/{companyId}/files/{fileId}/versions/{versionId}": { - "get": { + "/clientapplications/register": { + "post": { "tags": [ - "Company Files" - ], - "summary": "Returns the company file version with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByCompanyNameAndCompanyIdAndFileIdAndVersionId", - "parameters": [ - { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Client Applications" ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } + "summary": "Dynamically registers a new OAuth 2.0 client according to RFC 7591.", + "description": "\r\n\r\nAllows unauthenticated access.", + "operationId": "PostClientApplicationsRegister", + "requestBody": { + "description": "The dynamic client registration request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DynamicClientRegistrationEndpointRequest" } } }, - "401": { - "description": "Unauthorized", + "required": true + }, + "responses": { + "201": { + "description": "Created", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/DynamicClientRegistrationResponse" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -4117,58 +3821,49 @@ "v1" ], "x-access": { - "any": "true" + "anonymous": "true" } } }, - "/companies/{companyId}/files/{fileId}/versions/{versionId}/download": { - "get": { + "/clientapplications/{clientId}": { + "delete": { "tags": [ - "CompanyFiles" + "Client Applications" ], - "summary": "Returns the content of the company file version with the specified id.", - "description": "Returns the content of the company file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetCompanyFileVersionContent", + "summary": "Deletes the specified client application.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "DeleteClientApplicationsByClientId", "parameters": [ { - "name": "companyId", - "in": "path", - "description": "The id of the company.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "versionId", + "name": "clientId", "in": "path", - "description": "The id of the file version.", + "description": "The id of the client application.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -4185,27 +3880,25 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } - } - }, - "/companies/{companyId}/tags": { + }, "get": { "tags": [ - "CompanyTags" + "Client Applications" ], - "summary": "Returns the tags of the company with the specified id.", - "description": "Returns the tags of the company with the specified id ordered by name.\r\n To read tags of a company the user must have `company-master-data:read` permissions on the specified company.", - "operationId": "GetCompanyTagsByCompanyId", + "summary": "Returns the client application with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetClientApplicationsByClientId", "parameters": [ { - "name": "companyId", + "name": "clientId", "in": "path", - "description": "The id of the company.", + "description": "The id of the client application.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -4215,16 +3908,13 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } + "$ref": "#/components/schemas/ClientApplication" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -4245,71 +3935,34 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } - } - }, - "/customfielddefinitions": { - "get": { + }, + "put": { "tags": [ - "CustomFields" + "Client Applications" ], - "summary": "Returns all custom field definitions.", - "description": "The 'linkedProjectIds' are the project Ids that are linked to the custom field definition.\r\n The 'linkedProjectIds' property will only be included when the 'includeLinkedProjectIds' parameter is set to 'true'.\r\n\r\nAny authenticated user.", - "operationId": "GetCustomFieldDefinitions", + "summary": "Updates the client application with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PutClientApplicationsByClientId", "parameters": [ { - "name": "includeLinkedProjectIds", - "in": "query", - "description": "Whether to include linked project Ids in the response.", + "name": "clientId", + "in": "path", + "description": "The id of the client application.", + "required": true, "schema": { - "type": "boolean", - "default": false - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptionsAndLinkedProjectIds" - } - } - } + "type": "string" } } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "CustomFields" ], - "summary": "Creates a new custom field definition.", - "description": "Creates a new custom field definition. This custom field definition can then be linked to project templates and to tasks.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostCustomFieldDefinition", "requestBody": { - "description": "The model containing the details for creating a new custom field definition.", + "description": "The client application model.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldDefinitionPostForm" + "$ref": "#/components/schemas/ClientApplicationUpdateForm" } } }, @@ -4321,7 +3974,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" + "$ref": "#/components/schemas/ClientApplication" } } } @@ -4335,47 +3988,6 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "project-manage-config": "write" - } - } - }, - "/customfielddefinitions/{customFieldDefinitionId}": { - "delete": { - "tags": [ - "CustomFields" - ], - "summary": "Deletes the custom field definition with the specified Id.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteCustomFieldDefinitionById", - "parameters": [ - { - "name": "customFieldDefinitionId", - "in": "path", - "description": "The id of the custom field definition to delete.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" }, "404": { "description": "Not Found", @@ -4400,34 +4012,35 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "workspace-manage-config": "write" } - }, - "put": { + } + }, + "/clientapplications/{clientId}/generateapikey": { + "post": { "tags": [ - "CustomFields" + "Client Applications" ], - "summary": "Updates the custom field definition with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutCustomFieldDefinitionById", + "summary": "Generates an API key for the specified client application.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "PostClientApplicationsGenerateApiKeyByClientId", "parameters": [ { - "name": "customFieldDefinitionId", + "name": "clientId", "in": "path", - "description": "The id of the custom field definition to update.", + "description": "The id of the client application.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "requestBody": { - "description": "The model to change the custom field definition.", + "description": "The model to generate an API key.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldDefinitionPutForm" + "$ref": "#/components/schemas/ClientApplicationApiKeyForm" } } }, @@ -4439,7 +4052,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldDefinition" + "$ref": "#/components/schemas/TokenResponse" } } } @@ -4477,48 +4090,46 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "workspace-manage-config": "read" } } }, - "/customfielddefinitions/{customFieldDefinitionId}/selectionoptions": { + "/clientapplications/{clientId}/generatesecret": { "post": { "tags": [ - "CustomFields" + "Client Applications" ], - "summary": "Creates a custom field selection option for an existing custom field definition.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostCustomFieldDefinitionSelectionOptionsByCustomFieldDefinitionId", + "summary": "Generates a new secret for the specified client application.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostClientApplicationsGenerateSecretByClientId", "parameters": [ { - "name": "customFieldDefinitionId", + "name": "clientId", "in": "path", - "description": "The id of the custom field definition to add a selection option to.", + "description": "The id of the client application.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "description": "The model describing the selection option to create.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CustomFieldSelectionOptionsForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldSelectionOption" + "$ref": "#/components/schemas/ClientApplicationGeneratePasswordResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -4546,50 +4157,42 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "workspace-manage-config": "write" } } }, - "/customfielddefinitions/{customFieldDefinitionId}/selectionoptions/{selectionOptionId}": { - "delete": { + "/companies": { + "get": { "tags": [ - "CustomFields" + "Companies" ], - "summary": "Deletes a custom field selection option for an existing custom field definition.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteCustomFieldDefinitionSelectionOptionByCustomFieldDefinitionIdAndSelectionOptionId", + "summary": "Returns all companies.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", + "operationId": "GetCompanies", "parameters": [ { - "name": "customFieldDefinitionId", - "in": "path", - "description": "The id of the custom field definition containing the selection option.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "selectionOptionId", - "in": "path", - "description": "The id of the selection option to delete.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { - "204": { - "description": "No Content" - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/Company" + } } } } @@ -4607,44 +4210,22 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "company-master-data": "read" } }, - "put": { + "post": { "tags": [ - "CustomFields" - ], - "summary": "Updates a custom field selection option for an existing custom field definition.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutCustomFieldDefinitionSelectionOptionByCustomFieldDefinitionIdAndSelectionOptionId", - "parameters": [ - { - "name": "customFieldDefinitionId", - "in": "path", - "description": "The id of the custom field definition containing the selection option.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "selectionOptionId", - "in": "path", - "description": "The id of the selection option to update.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Companies" ], + "summary": "Creates a new company.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PostCompany", "requestBody": { - "description": "The model describing the updated selection option.", + "description": "The company to create.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldSelectionOptionsForm" + "$ref": "#/components/schemas/CompanyForm" } } }, @@ -4656,13 +4237,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldSelectionOption" + "$ref": "#/components/schemas/Company" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -4684,41 +4265,78 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "company-master-data": "write" } } }, - "/documents": { - "get": { + "/companies/deletetags": { + "post": { "tags": [ - "Documents" + "CompanyTags" ], - "summary": "Returns all documents.", - "description": "The user must have at least `read` permissions to see a document.", - "operationId": "GetDocuments", - "parameters": [ - { - "name": "includeTrashedDocuments", - "in": "query", - "description": "Whether to include trashed documents in the result.", - "schema": { - "type": "boolean", - "default": false + "summary": "Removes a tag from all companies.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PostCompaniesDeleteTags", + "requestBody": { + "description": "The model with the tag to be removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTagForm" + } } }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" + "required": true + }, + "responses": { + "204": { + "description": "No Content" }, - { - "$ref": "#/components/parameters/orderby" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ { - "$ref": "#/components/parameters/filterby" + "oauth2": [ + "full_access" + ] } ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "company-master-data": "write" + } + } + }, + "/companies/industries": { + "get": { + "tags": [ + "Companies" + ], + "summary": "Returns all company industries that are currently in use.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", + "operationId": "GetCompaniesIndustries", "responses": { "200": { "description": "OK", @@ -4727,7 +4345,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/DocumentModel" + "type": "string" } } } @@ -4745,32 +4363,29 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "read" } - }, - "post": { + } + }, + "/companies/tags": { + "get": { "tags": [ - "Documents" + "CompanyTags" ], - "summary": "Creates a new document with optional HTML or Markdown content.", - "description": "When content is provided, set `contentFormat` to `html` or `markdown`. HTML is the default. Canonical awork Markdown preserves safe editor structures during re-import.\r\n\r\nAny authenticated user.", - "operationId": "PostDocument", - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/DocumentPostForm" - } - } - } - }, + "summary": "Returns all tags that are currently in use by companies.", + "description": "Returns all tags that are currently in use by companies ordered by count.\r\n\r\nAny authenticated user.", + "operationId": "GetCompanyTags", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentModel" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } } } } @@ -4791,35 +4406,25 @@ } } }, - "/documents/trash/{documentId}/restore": { + "/companies/updatetags": { "post": { "tags": [ - "Documents" + "CompanyTags" ], - "summary": "Restores the document with the specified id from the trash.", - "description": "Please note that restoring a document using this method will asynchronously and eventually update or recreate the document and the related entities such as document versions or its content.\r\n This operation is idempotent, if applied to an already restored document, it will return a NoContent result.\r\n \r\n The user must have at least `write` permissions for the specified document.", - "operationId": "PostDocumentsTrashRestoreByDocumentId", - "parameters": [ - { - "name": "documentId", - "in": "path", - "description": "The id of the document to restore.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Updates a tag globally for all companies.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PostCompaniesUpdateTags", + "requestBody": { + "description": "The model containing the tag updates.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TagUpdateForm" + } } }, - { - "name": "alsoRestoreChildren", - "in": "query", - "description": "Whether to also restore children documents.", - "schema": { - "type": "boolean", - "default": true - } - } - ], + "required": true + }, "responses": { "204": { "description": "No Content" @@ -4846,49 +4451,38 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "write" } } }, - "/documents/{documentId}": { - "delete": { + "/companies/{companyId}": { + "get": { "tags": [ - "Documents" + "Companies" ], - "summary": "Deletes the document with the specified id.", - "description": "This operation moves the document to the trash.\r\n The document itself is moved to the trash synchronously, while its children and related entities will be moved to the trash asynchronously.\r\n \r\n The user must have at least `manage` permissions for the specified document.", - "operationId": "DeleteDocumentById", + "summary": "Returns the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", + "operationId": "GetCompanyById", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to delete.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "alsoDeleteChildren", - "in": "query", - "description": "Whether to also delete children documents. If false, the children's parent references are updated to point to the deleted document's parent.", - "schema": { - "type": "boolean", - "default": true - } } ], "responses": { - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Company" } } } @@ -4915,21 +4509,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "read" } }, - "get": { + "put": { "tags": [ - "Documents" + "Companies" ], - "summary": "Returns the document with the specified id.", - "description": "The user must have at least `read` permissions for the specified document.", - "operationId": "GetDocumentById", + "summary": "Updates the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PutCompanyById", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to retrieve.", + "description": "The id of the company to update.", "required": true, "schema": { "type": "string", @@ -4937,29 +4532,30 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentModel" - } + "requestBody": { + "description": "The model with updated company data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanyForm" } } }, - "401": { - "description": "Unauthorized", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Company" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -4980,21 +4576,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "write" } - }, - "put": { + } + }, + "/companies/{companyId}/addtags": { + "post": { "tags": [ - "Documents" + "CompanyTags" ], - "summary": "Updates the document with the specified id.", - "description": "The user must have at least `write` permissions for the specified document.", - "operationId": "PutDocumentById", + "summary": "Adds a batch of new tags to the company with the specified id.", + "description": "The request fails if one of the tags is invalid (e.g. empty or duplicate).\r\n To add tags to a company the user must have `company-master-data:write` permissions on the specified company.", + "operationId": "PostCompanyAddTagsByCompanyId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to update.", + "description": "The id of the company to add tags to.", "required": true, "schema": { "type": "string", @@ -5003,11 +4602,14 @@ } ], "requestBody": { - "description": "The document form data with the updated information.", + "description": "The model containing the tags to be added.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/TagForm" + } } } }, @@ -5019,7 +4621,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentModel" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } } } } @@ -5043,16 +4648,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -5070,84 +4665,36 @@ } } }, - "/documents/{documentId}/comments": { - "delete": { + "/companies/{companyId}/contactinfo": { + "get": { "tags": [ - "DocumentComments" + "Companies" ], - "summary": "Deletes all comments of the specified document.", - "description": "Deletes all comments of the specified document.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCommentsByDocumentNameAndDocumentId", + "summary": "Returns the contact infos of the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", + "operationId": "GetCompanyContactInfoByCompanyId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "get": { - "tags": [ - "DocumentComments" - ], - "summary": "Returns all comments of the document with the specified id.", - "description": "Returns all comments of the document with the specified id. The user needs read permissions on the document.\r\n\r\nAny authenticated user.", - "operationId": "GetCommentsByDocumentNameAndDocumentId", - "parameters": [ - { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -5158,31 +4705,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/ContactInfoForCompanies" } } } } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -5196,21 +4723,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "read" } }, "post": { "tags": [ - "DocumentComments" + "Companies" ], - "summary": "Creates a new comment on the document with the specified id.", - "description": "Creates a new comment on the document with the specified id.\r\n A user can only create a comment for him/herself, except for admins and api users.\r\n \r\n To create a comment the user must have at least `read` permissions on the specified document.", - "operationId": "PostCommentsByDocumentNameAndDocumentId", + "summary": "Creates a new contact info for the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PostCompanyContactInfoByCompanyId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to create the comment for.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5219,11 +4747,11 @@ } ], "requestBody": { - "description": "The model to create the comment.", + "description": "The contact info to create.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CommentForm" + "$ref": "#/components/schemas/ContactInfoForm" } } }, @@ -5235,7 +4763,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/ContactInfoForCompanies" } } } @@ -5249,26 +4777,6 @@ } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -5282,23 +4790,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "write" } } }, - "/documents/{documentId}/comments/{commentId}": { + "/companies/{companyId}/contactinfo/{contactInfoId}": { "delete": { "tags": [ - "DocumentComments" + "Companies" ], - "summary": "Deletes the comment with the specified id on the document with the specified id.", - "description": "Deletes the comment with the specified id on the document with the specified id.\r\n The delete includes the reactions of the comment.\r\n If there are any replies to the comment, they will be deleted as well.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCommentByDocumentNameAndDocumentIdAndCommentId", + "summary": "Deletes the contact info of the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "DeleteCompanyContactInfoByCompanyIdAndContactInfoId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5306,9 +4815,9 @@ } }, { - "name": "commentId", + "name": "contactInfoId", "in": "path", - "description": "The id of the comment.", + "description": "The id of the contact info.", "required": true, "schema": { "type": "string", @@ -5320,8 +4829,8 @@ "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -5352,21 +4861,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "write" } }, "get": { "tags": [ - "DocumentComments" + "Companies" ], - "summary": "Returns the comment with the specified id of the document with the specified id.", - "description": "Returns the comment with the specified id of the document with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetCommentByDocumentNameAndDocumentIdAndCommentId", + "summary": "Returns the specified contact info of the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:read` permissions.", + "operationId": "GetCompanyContactInfoByCompanyIdAndContactInfoId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5374,14 +4884,26 @@ } }, { - "name": "commentId", + "name": "contactInfoId", "in": "path", - "description": "The id of the comment.", + "description": "The id of the contact info.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -5390,13 +4912,23 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/ContactInfoForCompanies" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -5417,21 +4949,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "read" } }, "put": { "tags": [ - "DocumentComments" + "Companies" ], - "summary": "Updates the comment with the specified id on the document with the specified id.", - "description": "To update a comment the user must either have at least `read` permissions on the specified document, be the creator of the comment or be admin.", - "operationId": "PutCommentByDocumentNameAndDocumentIdAndCommentId", + "summary": "Updates the contact info for the company with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PutCompanyContactInfoByCompanyIdAndContactInfoId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5439,9 +4972,9 @@ } }, { - "name": "commentId", + "name": "contactInfoId", "in": "path", - "description": "The id of the comment.", + "description": "The id of the contact info.", "required": true, "schema": { "type": "string", @@ -5450,11 +4983,11 @@ } ], "requestBody": { - "description": "The model with the updated comment information.", + "description": "The updated contact info data.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CommentPutForm" + "$ref": "#/components/schemas/ContactInfoForm" } } }, @@ -5466,13 +4999,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/ContactInfoForCompanies" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -5503,33 +5036,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "write" } } }, - "/documents/{documentId}/comments/{commentId}/react": { + "/companies/{companyId}/delete": { "post": { "tags": [ - "DocumentComments" + "Companies" ], - "summary": "Updates the reactions of the comment with the specified id on the document with the specified id.", - "description": "To update a reaction of a comment the user must have at least `read` permissions on the specified document.", - "operationId": "PostCommentReactByDocumentNameAndDocumentIdAndCommentId", + "summary": "Deletes the company with the specified id.", + "description": "There are several ways to delete a company.\r\n Look into the property description of the post model to get detailed information.\r\n
If the post is executed without a model, the default process 'delete-only-company' will be executed.\r\n
For the operation 'delete-all-without-timeentries' project-master-data write permissions are required on all projects of the company.\r\n\r\nThe user must be an admin or have `company-master-data:write` permissions.", + "operationId": "PostCompanyDeleteByCompanyId", "parameters": [ { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "commentId", + "name": "companyId", "in": "path", - "description": "The id of the comment.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5538,11 +5062,11 @@ } ], "requestBody": { - "description": "The model used to update the reactions of the comment with the specified id.", + "description": "The model describing how to delete the company.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ReactionForm" + "$ref": "#/components/schemas/CompanyDeleteForm" } } }, @@ -5552,6 +5076,16 @@ "204": { "description": "No Content" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "401": { "description": "Unauthorized", "content": { @@ -5584,33 +5118,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "company-master-data": "write" } } }, - "/documents/{documentId}/comments/{commentId}/setresolved": { + "/companies/{companyId}/deletetags": { "post": { "tags": [ - "DocumentComments" + "CompanyTags" ], - "summary": "Sets the resolved status of a comment.", - "description": "Sets the resolved status of a comment. Users need write permissions on the document to resolve/unresolve comments.\r\n Currently, the IsResolved property is only available for document comments.\r\n\r\nAny authenticated user.", - "operationId": "PostCommentSetResolvedByDocumentNameAndDocumentIdAndCommentId", + "summary": "Removes tags from the company with the specified id.", + "description": "Removes tags from the company with the specified id.\r\n \r\n Returns 204 NoContent if all tags have been removed successfully.\r\n Returns 207 MultiStatus if at least one tag could not be removed, including the reasons.\r\n \r\n To remove tags from a company the user must have `company-master-data:write` permissions on the specified company.", + "operationId": "PostCompanyDeleteTagsByCompanyId", "parameters": [ { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "commentId", + "name": "companyId", "in": "path", - "description": "The id of the comment.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5619,29 +5144,28 @@ } ], "requestBody": { - "description": "The resolved status.", + "description": "The tags to remove.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetResolvedForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/DeleteTagForm" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Comment" - } - } - } + "204": { + "description": "No Content" }, - "401": { - "description": "Unauthorized", + "207": { + "description": "Multi-Status" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -5650,8 +5174,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -5676,88 +5200,98 @@ } } }, - "/documents/{documentId}/content": { - "get": { + "/companies/{companyId}/externalfiles": { + "post": { "tags": [ - "Documents" + "CompanyFiles" ], - "summary": "Returns the content of the current version of the document with the specified id.", - "description": "The user must have at least `read` permissions for the specified document.", - "operationId": "GetDocumentContentByDocumentId", + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "streamAsFile", - "in": "query", - "description": "Whether to stream the content as a file. By default, the document's content is returned in a model containing a property `Content` holding the content as a string.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "format", - "in": "query", - "description": "The response format. Supported values are `html` and `markdown`.", - "schema": { - "type": "string", - "default": "html" - } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "string" + "requestBody": { + "description": "List of file forms.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" } } - } - }, - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" } } } - }, - "401": { - "description": "Unauthorized", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/companies/{companyId}/files": { + "delete": { + "tags": [ + "CompanyFiles" + ], + "summary": "Deletes the files of the specified company.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCompanyFiles", + "parameters": [ + { + "name": "companyId", + "in": "path", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } + ], + "responses": { + "204": { + "description": "No Content" + } }, "security": [ { @@ -5773,18 +5307,18 @@ "any": "true" } }, - "put": { + "post": { "tags": [ - "Documents" + "CompanyFiles" ], - "summary": "Updates document content using UTF-8 HTML or Markdown.", - "description": "Set `contentFormat` to `html` or `markdown`. HTML is the default. Canonical awork Markdown preserves safe editor structures during re-import.\r\n \r\n The user must have at least `write` permissions for the specified document.", - "operationId": "PutDocumentContentByDocumentId", + "summary": "Creates a new company file for the company with the specified id..", + "description": "Uploads a new company file for the company with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateCompanyFile", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to update.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5796,7 +5330,21 @@ "content": { "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/DocumentContentForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } } @@ -5807,20 +5355,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentModel" + "$ref": "#/components/schemas/FileInfo" } } } }, "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "description": "Bad Request" } }, "security": [ @@ -5838,19 +5379,19 @@ } } }, - "/documents/{documentId}/contributors": { + "/companies/{companyId}/files/byurl": { "post": { "tags": [ - "Documents" + "CompanyFiles" ], - "summary": "Adds a list of document contributors to the document with the specified id.", - "description": "Adding document contributors will grant them access to the document.\r\n There will be a recalculation of permissions for related entities considering the updated document contributor.\r\n \r\n The user must have at least `write` permissions for this document.", - "operationId": "PostDocumentContributorsByDocumentId", + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateCompanyFileByUrl", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to add contributors to.", + "description": "The id of the company the file is linked to.", "required": true, "schema": { "type": "string", @@ -5859,18 +5400,19 @@ } ], "requestBody": { - "description": "The model used to add the document contributors.", + "description": "The url, name and description of the file.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ContributorPostForm" - } + "$ref": "#/components/schemas/FilePostForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -5878,40 +5420,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MinimalContributorModel" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -5932,19 +5441,19 @@ } } }, - "/documents/{documentId}/contributors/{documentContributorId}": { + "/companies/{companyId}/files/{fileId}": { "delete": { "tags": [ - "Documents" + "CompanyFiles" ], - "summary": "Deletes the document contributor with the specified id from a document.", - "description": "This operation cannot be performed on inherited document contributors, only explicit ones.\r\n There will be recalculation of permissions for related entities considering the deleted document contributor.\r\n \r\n The user must have at least `write` permissions for the specified document.", - "operationId": "DeleteDocumentContributorByDocumentIdAndDocumentContributorId", + "summary": "Deletes the company file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCompanyFile", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to delete the contributor from.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -5952,9 +5461,9 @@ } }, { - "name": "documentContributorId", + "name": "fileId", "in": "path", - "description": "The id of the document contributor to delete.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -5965,13 +5474,58 @@ "responses": { "204": { "description": "No Content" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "Company Files" + ], + "summary": "Returns the file with the specified id of the company with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByCompanyNameAndCompanyIdAndFileId", + "parameters": [ + { + "name": "companyId", + "in": "path", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, - "400": { - "description": "Bad Request", + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -6013,16 +5567,16 @@ }, "put": { "tags": [ - "Documents" + "CompanyFiles" ], - "summary": "Updates the access of a document contributor with the specified id to a document.", - "description": "Updating a document contributor will affect their access to the document.\r\n There will be a recalculation of permissions for related entities considering the updated document contributor.\r\n \r\n The user must have at least `write` permissions for the specified document.", - "operationId": "PutDocumentContributorByDocumentIdAndDocumentContributorId", + "summary": "Updates the metadata of the company file with the specified id.", + "description": "Updates the metadata of the company file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateCompanyFile", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to update.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -6030,9 +5584,9 @@ } }, { - "name": "documentContributorId", + "name": "fileId", "in": "path", - "description": "The id of the document contributor to update.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -6041,15 +5595,19 @@ } ], "requestBody": { - "description": "The model used to update the document contributor's access.", + "description": "The model to update the file with the specified id.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContributorForm" + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -6057,37 +5615,79 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinimalContributorModel" + "$ref": "#/components/schemas/FileInfo" } } } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/companies/{companyId}/files/{fileId}/changeentity": { + "post": { + "tags": [ + "CompanyFiles" + ], + "summary": "Changes the company this file belongs to.", + "description": "Changes the company this file belongs to.\nSwitch to the specified company or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeCompany", + "parameters": [ + { + "name": "companyId", + "in": "path", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -6108,19 +5708,29 @@ } } }, - "/documents/{documentId}/duplicate": { + "/companies/{companyId}/files/{fileId}/copy": { "post": { "tags": [ - "Documents" + "CompanyFiles" ], - "summary": "Duplicates the document with the specified id.", - "description": "Duplicates the document content, permissions and children documents.\r\n \r\n The user has at least `read` permissions for the specified document.", - "operationId": "PostDocumentDuplicateByDocumentId", + "summary": "Copies the file to a new company.", + "description": "Copies the file to a new company (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToCompany", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to duplicate.", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -6128,43 +5738,112 @@ } } ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentModel" + "$ref": "#/components/schemas/FileInfo" } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/companies/{companyId}/files/{fileId}/download": { + "get": { + "tags": [ + "CompanyFiles" + ], + "summary": "Returns the content of the company file with the specified id.", + "description": "Returns the content of the company file. Uses the latest file version.\nIf the company file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetCompanyFileContent", + "parameters": [ + { + "name": "companyId", + "in": "path", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "width", + "in": "query", + "description": "Set width to resize.", + "schema": { + "type": "number", + "format": "double" } }, - "404": { - "description": "Not Found", + { + "name": "height", + "in": "query", + "description": "Set height to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -6185,54 +5864,53 @@ } } }, - "/documents/{documentId}/externalfiles": { - "post": { + "/companies/{companyId}/files/{fileId}/pdf": { + "get": { "tags": [ - "DocumentFiles" + "CompanyFiles" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", + "description": "Returns the content of the company file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetCompanyFileContent", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "List of file forms.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "inline", + "in": "query", + "description": "If inline is false, content-disposition header is attachment.", + "schema": { + "type": "boolean", + "default": false } } - }, + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "string", + "format": "binary" } } } @@ -6253,19 +5931,29 @@ } } }, - "/documents/{documentId}/files": { - "delete": { + "/companies/{companyId}/files/{fileId}/shareurl": { + "get": { "tags": [ - "DocumentFiles" + "CompanyFiles" ], - "summary": "Deletes the files of the specified document.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteDocumentFiles", + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -6274,8 +5962,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } } }, "security": [ @@ -6291,19 +5986,31 @@ "x-access": { "any": "true" } - }, + } + }, + "/companies/{companyId}/files/{fileId}/versions": { "get": { "tags": [ - "DocumentFiles" + "CompanyFiles" ], - "summary": "Returns all files of the document with the specified id.", - "description": "Returns all file metadata of the document with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetDocumentFiles", + "summary": "Returns all file versions of the specified company file.", + "description": "Returns all file versions of the specified company file.\r\n\r\nAny authenticated user.", + "operationId": "GetCompanyFileVersions", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -6331,7 +6038,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/FileVersion" } } } @@ -6354,16 +6061,26 @@ }, "post": { "tags": [ - "DocumentFiles" + "CompanyFiles" ], - "summary": "Creates a new document file for the document with the specified id..", - "description": "Uploads a new document file for the document with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateDocumentFile", + "summary": "Uploads a new version of the company file with the specified id.", + "description": "Uploads a new version of an company file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateCompanyFileVersion", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document.", + "description": "The id of the company.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -6400,7 +6117,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/FileVersion" } } } @@ -6424,44 +6141,63 @@ } } }, - "/documents/{documentId}/files/byuploadid": { - "post": { + "/companies/{companyId}/files/{fileId}/versions/{versionId}": { + "get": { "tags": [ - "FileUpload" + "Company Files" ], - "summary": "Creates a file from an upload id.", - "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file document from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", - "operationId": "PostUploadByUploadId", + "summary": "Returns the company file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByCompanyNameAndCompanyIdAndFileIdAndVersionId", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document to attach the file to.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The model describing the uploaded file metadata.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UploadByUploadIdForm" - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/FileVersion" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6492,48 +6228,54 @@ } } }, - "/documents/{documentId}/files/byurl": { - "post": { + "/companies/{companyId}/files/{fileId}/versions/{versionId}/download": { + "get": { "tags": [ - "DocumentFiles" + "CompanyFiles" ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateDocumentFileByUrl", + "summary": "Returns the content of the company file version with the specified id.", + "description": "Returns the content of the company file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetCompanyFileVersionContent", "parameters": [ { - "name": "documentId", + "name": "companyId", "in": "path", - "description": "The id of the document the file is linked to.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "string", + "format": "binary" } } } @@ -6554,29 +6296,19 @@ } } }, - "/documents/{documentId}/files/{fileId}": { - "delete": { + "/companies/{companyId}/tags": { + "get": { "tags": [ - "DocumentFiles" + "CompanyTags" ], - "summary": "Deletes the document file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteDocumentFile", + "summary": "Returns the tags of the company with the specified id.", + "description": "Returns the tags of the company with the specified id ordered by name.\r\n To read tags of a company the user must have `company-master-data:read` permissions on the specified company.", + "operationId": "GetCompanyTagsByCompanyId", "parameters": [ { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "companyId", "in": "path", - "description": "The id of the file.", + "description": "The id of the company.", "required": true, "schema": { "type": "string", @@ -6585,8 +6317,28 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -6602,33 +6354,24 @@ "x-access": { "any": "true" } - }, + } + }, + "/customfielddefinitions": { "get": { "tags": [ - "Document Files" + "CustomFields" ], - "summary": "Returns the file with the specified id of the document with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByDocumentNameAndDocumentIdAndFileId", + "summary": "Returns all custom field definitions.", + "description": "The 'linkedProjectIds' are the project Ids that are linked to the custom field definition.\r\n The 'linkedProjectIds' property will only be included when the 'includeLinkedProjectIds' parameter is set to 'true'.\r\n\r\nAny authenticated user.", + "operationId": "GetCustomFieldDefinitions", "parameters": [ { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, + "name": "includeLinkedProjectIds", + "in": "query", + "description": "Whether to include linked project Ids in the response.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } } ], @@ -6638,23 +6381,60 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptionsAndLinkedProjectIds" + } } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "CustomFields" + ], + "summary": "Creates a new custom field definition.", + "description": "Creates a new custom field definition. This custom field definition can then be linked to project templates and to tasks.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostCustomFieldDefinition", + "requestBody": { + "description": "The model containing the details for creating a new custom field definition.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldDefinitionPostForm" + } + } }, - "401": { - "description": "Unauthorized", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -6675,31 +6455,73 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } - }, - "put": { + } + }, + "/customfielddefinitions/{customFieldDefinitionId}": { + "delete": { "tags": [ - "DocumentFiles" + "CustomFields" ], - "summary": "Updates the metadata of the document file with the specified id.", - "description": "Updates the metadata of the document file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateDocumentFile", + "summary": "Deletes the custom field definition with the specified Id.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteCustomFieldDefinitionById", "parameters": [ { - "name": "documentId", + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the document.", + "description": "The id of the custom field definition to delete.", "required": true, "schema": { "type": "string", "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ { - "name": "fileId", + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + }, + "put": { + "tags": [ + "CustomFields" + ], + "summary": "Updates the custom field definition with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutCustomFieldDefinitionById", + "parameters": [ + { + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the file.", + "description": "The id of the custom field definition to update.", "required": true, "schema": { "type": "string", @@ -6708,19 +6530,15 @@ } ], "requestBody": { - "description": "The model to update the file with the specified id.", + "description": "The model to change the custom field definition.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" + "$ref": "#/components/schemas/CustomFieldDefinitionPutForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -6728,7 +6546,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/CustomFieldDefinition" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6745,33 +6583,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/documents/{documentId}/files/{fileId}/copy": { + "/customfielddefinitions/{customFieldDefinitionId}/selectionoptions": { "post": { "tags": [ - "DocumentFiles" + "CustomFields" ], - "summary": "Copies the file to a new document.", - "description": "Copies the file to a new document (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToDocument", + "summary": "Creates a custom field selection option for an existing custom field definition.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostCustomFieldDefinitionSelectionOptionsByCustomFieldDefinitionId", "parameters": [ { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the file.", + "description": "The id of the custom field definition to add a selection option to.", "required": true, "schema": { "type": "string", @@ -6780,19 +6609,15 @@ } ], "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The model describing the selection option to create.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" + "$ref": "#/components/schemas/CustomFieldSelectionOptionsForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -6800,7 +6625,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/CustomFieldSelectionOption" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6817,23 +6652,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/documents/{documentId}/files/{fileId}/download": { - "get": { + "/customfielddefinitions/{customFieldDefinitionId}/selectionoptions/{selectionOptionId}": { + "delete": { "tags": [ - "DocumentFiles" + "CustomFields" ], - "summary": "Returns the content of the document file with the specified id.", - "description": "Returns the content of the document file. Uses the latest file version.\nIf the document file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetDocumentFileContent", + "summary": "Deletes a custom field selection option for an existing custom field definition.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteCustomFieldDefinitionSelectionOptionByCustomFieldDefinitionIdAndSelectionOptionId", "parameters": [ { - "name": "documentId", + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the document.", + "description": "The id of the custom field definition containing the selection option.", "required": true, "schema": { "type": "string", @@ -6841,50 +6677,26 @@ } }, { - "name": "fileId", + "name": "selectionOptionId", "in": "path", - "description": "The id of the file.", + "description": "The id of the selection option to delete.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", - "schema": { - "type": "boolean" - } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6901,23 +6713,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } - } - }, - "/documents/{documentId}/files/{fileId}/shareurl": { - "get": { + }, + "put": { "tags": [ - "DocumentFiles" + "CustomFields" ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", + "summary": "Updates a custom field selection option for an existing custom field definition.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutCustomFieldDefinitionSelectionOptionByCustomFieldDefinitionIdAndSelectionOptionId", "parameters": [ { - "name": "documentId", + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the document.", + "description": "The id of the custom field definition containing the selection option.", "required": true, "schema": { "type": "string", @@ -6925,9 +6736,9 @@ } }, { - "name": "fileId", + "name": "selectionOptionId", "in": "path", - "description": "The id of the file.", + "description": "The id of the selection option to update.", "required": true, "schema": { "type": "string", @@ -6935,13 +6746,34 @@ } } ], + "requestBody": { + "description": "The model describing the updated selection option.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldSelectionOptionsForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/CustomFieldSelectionOption" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6958,37 +6790,27 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/documents/{documentId}/files/{fileId}/versions": { + "/documents": { "get": { "tags": [ - "DocumentFiles" + "Documents" ], - "summary": "Returns all file versions of the specified document file.", - "description": "Returns all file versions of the specified document file.\r\n\r\nAny authenticated user.", - "operationId": "GetDocumentFileVersions", + "summary": "Returns all documents.", + "description": "The user must have at least `read` permissions to see a document.", + "operationId": "GetDocuments", "parameters": [ { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, + "name": "includeTrashedDocuments", + "in": "query", + "description": "Whether to include trashed documents in the result.", "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } }, { @@ -7012,7 +6834,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/DocumentModel" } } } @@ -7035,52 +6857,16 @@ }, "post": { "tags": [ - "DocumentFiles" - ], - "summary": "Uploads a new version of the document file with the specified id.", - "description": "Uploads a new version of an document file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateDocumentFileVersion", - "parameters": [ - { - "name": "documentId", - "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Documents" ], + "summary": "Creates a new document with optional HTML or Markdown content.", + "description": "When content is provided, set `contentFormat` to `html` or `markdown`. HTML is the default. Canonical awork Markdown preserves safe editor structures during re-import.\r\n\r\nAny authenticated user.", + "operationId": "PostDocument", "requestBody": { "content": { "multipart/form-data": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/DocumentPostForm" } } } @@ -7091,13 +6877,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/DocumentModel" } } } - }, - "400": { - "description": "Bad Request" } }, "security": [ @@ -7115,29 +6898,19 @@ } } }, - "/documents/{documentId}/files/{fileId}/versions/{versionId}": { - "get": { + "/documents/trash/{documentId}/restore": { + "post": { "tags": [ - "Document Files" + "Documents" ], - "summary": "Returns the document file version with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByDocumentNameAndDocumentIdAndFileIdAndVersionId", + "summary": "Restores the document with the specified id from the trash.", + "description": "Please note that restoring a document using this method will asynchronously and eventually update or recreate the document and the related entities such as document versions or its content.\r\n This operation is idempotent, if applied to an already restored document, it will return a NoContent result.\r\n \r\n The user must have at least `write` permissions for the specified document.", + "operationId": "PostDocumentsTrashRestoreByDocumentId", "parameters": [ { "name": "documentId", "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", + "description": "The id of the document to restore.", "required": true, "schema": { "type": "string", @@ -7145,26 +6918,18 @@ } }, { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, + "name": "alsoRestoreChildren", + "in": "query", + "description": "Whether to also restore children documents.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": true } } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -7175,16 +6940,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -7202,29 +6957,19 @@ } } }, - "/documents/{documentId}/files/{fileId}/versions/{versionId}/download": { - "get": { + "/documents/{documentId}": { + "delete": { "tags": [ - "DocumentFiles" + "Documents" ], - "summary": "Returns the content of the document file version with the specified id.", - "description": "Returns the content of the document file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetDocumentFileVersionContent", + "summary": "Deletes the document with the specified id.", + "description": "This operation moves the document to the trash.\r\n The document itself is moved to the trash synchronously, while its children and related entities will be moved to the trash asynchronously.\r\n \r\n The user must have at least `manage` permissions for the specified document.", + "operationId": "DeleteDocumentById", "parameters": [ { "name": "documentId", "in": "path", - "description": "The id of the document.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", + "description": "The id of the document to delete.", "required": true, "schema": { "type": "string", @@ -7232,24 +6977,35 @@ } }, { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, + "name": "alsoDeleteChildren", + "in": "query", + "description": "Whether to also delete children documents. If false, the children's parent references are updated to point to the deleted document's parent.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": true } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -7268,21 +7024,19 @@ "x-access": { "any": "true" } - } - }, - "/documents/{documentId}/teams": { - "post": { + }, + "get": { "tags": [ "Documents" ], - "summary": "Adds a list of document teams to a document with the specified id.", - "description": "Adding document teams will affect their access to the document.\r\n Recalculation of permissions for related entities considering the new document teams\r\n will be done in the background asynchronously.\r\n \r\n The user must have at least `write` permissions for the specified document.", - "operationId": "PostDocumentTeamsByDocumentId", + "summary": "Returns the document with the specified id.", + "description": "The user must have at least `read` permissions for the specified document.", + "operationId": "GetDocumentById", "parameters": [ { "name": "documentId", "in": "path", - "description": "The id of the document.", + "description": "The id of the document to retrieve.", "required": true, "schema": { "type": "string", @@ -7290,40 +7044,13 @@ } } ], - "requestBody": { - "description": "The model used to add document teams to the document.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EntityToTeamPostForm" - } - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MinimalEntityToTeamModel" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/DocumentModel" } } } @@ -7362,31 +7089,19 @@ "x-access": { "any": "true" } - } - }, - "/documents/{documentId}/teams/{documentToTeamId}": { - "delete": { + }, + "put": { "tags": [ "Documents" ], - "summary": "Deletes the document team with the specified id from a document.", - "description": "Deletes the specific document team from a document. Deleting a document team will affect their access to the document.\r\n This operation cannot be performed on inherited document teams, only explicit ones.\r\n There will be recalculation of permissions for related entities considering the deleted document team.\r\n \r\n The user must have at least `write` permissions for the specified document.", - "operationId": "DeleteDocumentTeamByDocumentIdAndDocumentToTeamId", + "summary": "Updates the document with the specified id.", + "description": "The user must have at least `write` permissions for the specified document.", + "operationId": "PutDocumentById", "parameters": [ { "name": "documentId", "in": "path", - "description": "The id of the document to delete the team from.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "documentToTeamId", - "in": "path", - "description": "The id of the document to team connection.", + "description": "The id of the document to update.", "required": true, "schema": { "type": "string", @@ -7394,9 +7109,27 @@ } } ], + "requestBody": { + "description": "The document form data with the updated information.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentForm" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentModel" + } + } + } }, "400": { "description": "Bad Request", @@ -7442,14 +7175,16 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/documents/{documentId}/comments": { + "delete": { "tags": [ - "Documents" + "DocumentComments" ], - "summary": "Updates the document team with the specified id.", - "description": "Updates the specific document team of a document. Updating a document team will affect their access to the document.\r\n There will be recalculation of permissions for related entities considering the updated document team.\r\n \r\n The user must have at least `write` permissions for this document.", - "operationId": "PutDocumentTeamByDocumentIdAndDocumentToTeamId", + "summary": "Deletes all comments of the specified document.", + "description": "Deletes all comments of the specified document.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCommentsByDocumentNameAndDocumentId", "parameters": [ { "name": "documentId", @@ -7460,49 +7195,11 @@ "type": "string", "format": "uuid" } - }, - { - "name": "documentToTeamId", - "in": "path", - "description": "The id of the document to team connection to update.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "description": "The model used to update document teams of a document.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EntityToTeamForm" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MinimalEntityToTeamModel" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -7513,16 +7210,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -7538,17 +7225,25 @@ "x-access": { "any": "true" } - } - }, - "/documentspaces": { + }, "get": { "tags": [ - "DocumentSpaces" + "DocumentComments" ], - "summary": "Returns all document spaces.", - "description": "The user must have at least `read` permissions to see a document space.", - "operationId": "GetDocumentSpaces", + "summary": "Returns all comments of the document with the specified id.", + "description": "Returns all comments of the document with the specified id. The user needs read permissions on the document.\r\n\r\nAny authenticated user.", + "operationId": "GetCommentsByDocumentNameAndDocumentId", "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -7570,11 +7265,31 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/DocumentSpaceModel" + "$ref": "#/components/schemas/Comment" } } } } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -7593,17 +7308,29 @@ }, "post": { "tags": [ - "DocumentSpaces" + "DocumentComments" + ], + "summary": "Creates a new comment on the document with the specified id.", + "description": "Creates a new comment on the document with the specified id.\r\n A user can only create a comment for him/herself, except for admins and api users.\r\n \r\n To create a comment the user must have at least `read` permissions on the specified document.", + "operationId": "PostCommentsByDocumentNameAndDocumentId", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document to create the comment for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Creates a new document space.", - "description": "\r\n\r\nThe user must be an admin.", - "operationId": "PostDocumentSpace", "requestBody": { - "description": "The model used to create the document space.", + "description": "The model to create the comment.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentSpaceForm" + "$ref": "#/components/schemas/CommentForm" } } }, @@ -7615,7 +7342,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentSpaceModel" + "$ref": "#/components/schemas/Comment" } } } @@ -7639,6 +7366,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -7652,23 +7389,33 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/documentspaces/{documentSpaceId}": { + "/documents/{documentId}/comments/{commentId}": { "delete": { "tags": [ - "DocumentSpaces" + "DocumentComments" ], - "summary": "Deletes the document space with the specified id.", - "description": "The documents in this space and their related entities (comments, etc.) will be unrecoverably deleted in the background asynchronously.\r\n\r\nThe user must be an admin.", - "operationId": "DeleteDocumentSpaceById", + "summary": "Deletes the comment with the specified id on the document with the specified id.", + "description": "Deletes the comment with the specified id on the document with the specified id.\r\n The delete includes the reactions of the comment.\r\n If there are any replies to the comment, they will be deleted as well.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCommentByDocumentNameAndDocumentIdAndCommentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space to delete.", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -7712,21 +7459,31 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } }, "get": { "tags": [ - "DocumentSpaces" + "DocumentComments" ], - "summary": "Returns the document space with the specified id.", - "description": "The user must have at least `read` permissions for the specified document space.", - "operationId": "GetDocumentSpaceById", + "summary": "Returns the comment with the specified id of the document with the specified id.", + "description": "Returns the comment with the specified id of the document with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetCommentByDocumentNameAndDocumentIdAndCommentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space to retrieve.", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -7740,7 +7497,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentModel" + "$ref": "#/components/schemas/Comment" } } } @@ -7754,16 +7511,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -7782,16 +7529,26 @@ }, "put": { "tags": [ - "DocumentSpaces" + "DocumentComments" ], - "summary": "Updates the document space with the specified id.", - "description": "\r\n\r\nThe user must be an admin.", - "operationId": "PutDocumentSpaceById", + "summary": "Updates the comment with the specified id on the document with the specified id.", + "description": "To update a comment the user must either have at least `read` permissions on the specified document, be the creator of the comment or be admin.", + "operationId": "PutCommentByDocumentNameAndDocumentIdAndCommentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -7800,11 +7557,11 @@ } ], "requestBody": { - "description": "The model used to update the document space.", + "description": "The model with the updated comment information.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentSpaceForm" + "$ref": "#/components/schemas/CommentPutForm" } } }, @@ -7816,7 +7573,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DocumentSpaceModel" + "$ref": "#/components/schemas/Comment" } } } @@ -7853,23 +7610,33 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/documentspaces/{documentSpaceId}/contributors": { + "/documents/{documentId}/comments/{commentId}/react": { "post": { "tags": [ - "DocumentSpaces" + "DocumentComments" ], - "summary": "Adds a list of document space contributors to a document space.", - "description": "Adding document space contributors will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", - "operationId": "PostDocumentSpaceContributorsByDocumentSpaceId", + "summary": "Updates the reactions of the comment with the specified id on the document with the specified id.", + "description": "To update a reaction of a comment the user must have at least `read` permissions on the specified document.", + "operationId": "PostCommentReactByDocumentNameAndDocumentIdAndCommentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -7878,39 +7645,19 @@ } ], "requestBody": { - "description": "The model with the list of contributors to add.", + "description": "The model used to update the reactions of the comment with the specified id.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ContributorPostForm" - } + "$ref": "#/components/schemas/ReactionForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MinimalContributorModel" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -7944,23 +7691,23 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/documentspaces/{documentSpaceId}/contributors/{documentSpaceContributorId}": { - "delete": { + "/documents/{documentId}/comments/{commentId}/setresolved": { + "post": { "tags": [ - "DocumentSpaces" + "DocumentComments" ], - "summary": "Deletes the document space contributor with the specified id from a document space.", - "description": "Deletes the specified document space contributor from a document space.\r\n Deleting a document space contributor will affect their access to the document space and the documents within that space.\r\n\r\nThe user must be an admin.", - "operationId": "DeleteDocumentSpaceContributorByDocumentSpaceIdAndDocumentSpaceContributorId", + "summary": "Sets the resolved status of a comment.", + "description": "Sets the resolved status of a comment. Users need write permissions on the document to resolve/unresolve comments.\r\n Currently, the IsResolved property is only available for document comments.\r\n\r\nAny authenticated user.", + "operationId": "PostCommentSetResolvedByDocumentNameAndDocumentIdAndCommentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -7968,9 +7715,9 @@ } }, { - "name": "documentSpaceContributorId", + "name": "commentId", "in": "path", - "description": "The id of the document space contributor to delete.", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -7978,16 +7725,24 @@ } } ], - "responses": { - "204": { - "description": "No Content" + "requestBody": { + "description": "The resolved status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetResolvedForm" + } + } }, - "400": { - "description": "Bad Request", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Comment" } } } @@ -8024,21 +7779,23 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } - }, - "put": { + } + }, + "/documents/{documentId}/content": { + "get": { "tags": [ - "DocumentSpaces" + "Documents" ], - "summary": "Updates the access of a document space contributor to the document space with the specified id.", - "description": "Updates the access of the specified document space contributor to the specified document space.\r\n Updating a document space contributor will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", - "operationId": "PutDocumentSpaceContributorByDocumentSpaceIdAndDocumentSpaceContributorId", + "summary": "Returns the content of the current version of the document with the specified id.", + "description": "The user must have at least `read` permissions for the specified document.", + "operationId": "GetDocumentContentByDocumentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -8046,38 +7803,38 @@ } }, { - "name": "documentSpaceContributorId", - "in": "path", - "description": "The id of the document space contributor.", - "required": true, + "name": "streamAsFile", + "in": "query", + "description": "Whether to stream the content as a file. By default, the document's content is returned in a model containing a property `Content` holding the content as a string.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "format", + "in": "query", + "description": "The response format. Supported values are `html` and `markdown`.", "schema": { "type": "string", - "format": "uuid" + "default": "html" } } ], - "requestBody": { - "description": "The model with the updated contributor data.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ContributorForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinimalContributorModel" + "type": "string" } } } }, + "204": { + "description": "No Content" + }, "400": { "description": "Bad Request", "content": { @@ -8120,114 +7877,54 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } - } - }, - "/documentspaces/{documentSpaceId}/documents": { - "get": { + }, + "put": { "tags": [ "Documents" ], - "summary": "Returns all documents that belong to the document space with the specified id.", - "description": "The user must have at least `read` permissions for the specified document space.", - "operationId": "GetDocumentSpaceDocumentsByDocumentSpaceId", + "summary": "Updates document content using UTF-8 HTML or Markdown.", + "description": "Set `contentFormat` to `html` or `markdown`. HTML is the default. Canonical awork Markdown preserves safe editor structures during re-import.\r\n \r\n The user must have at least `write` permissions for the specified document.", + "operationId": "PutDocumentContentByDocumentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space to retrieve documents from.", + "description": "The id of the document to update.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/DocumentContentForm" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DocumentModel" - } + "$ref": "#/components/schemas/DocumentModel" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/documentspaces/{documentSpaceId}/documents/trash": { - "get": { - "tags": [ - "Documents" - ], - "summary": "Returns all deleted documents of the document space with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetDocumentSpaceDocumentsTrashByDocumentSpaceId", - "parameters": [ - { - "name": "documentSpaceId", - "in": "path", - "description": "The id of the document space to retrieve trashed documents from.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DocumentModel" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -8248,19 +7945,19 @@ } } }, - "/documentspaces/{documentSpaceId}/teams": { + "/documents/{documentId}/contributors": { "post": { "tags": [ - "DocumentSpaces" + "Documents" ], - "summary": "Adds teams to the document space with the specified id.", - "description": "Adding teams to a document space will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", - "operationId": "PostDocumentSpaceTeamsByDocumentSpaceId", + "summary": "Adds a list of document contributors to the document with the specified id.", + "description": "Adding document contributors will grant them access to the document.\r\n There will be a recalculation of permissions for related entities considering the updated document contributor.\r\n \r\n The user must have at least `write` permissions for this document.", + "operationId": "PostDocumentContributorsByDocumentId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document to add contributors to.", "required": true, "schema": { "type": "string", @@ -8269,13 +7966,13 @@ } ], "requestBody": { - "description": "The model with the list of teams to add.", + "description": "The model used to add the document contributors.", "content": { "application/json": { "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/EntityToTeamPostForm" + "$ref": "#/components/schemas/ContributorPostForm" } } } @@ -8288,7 +7985,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinimalEntityToTeamModel" + "type": "array", + "items": { + "$ref": "#/components/schemas/MinimalContributorModel" + } } } } @@ -8335,23 +8035,23 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/documentspaces/{documentSpaceId}/teams/{documentSpaceToTeamId}": { + "/documents/{documentId}/contributors/{documentContributorId}": { "delete": { "tags": [ - "DocumentSpaces" + "Documents" ], - "summary": "Deletes the team with the specified id from a document space.", - "description": "Deletes the specified team from a document space.\r\n Deleting a team from a document space will affect their access to the document space and the documents within that space.\r\n\r\nThe user must be an admin.", - "operationId": "DeleteDocumentSpaceTeamByDocumentSpaceIdAndDocumentSpaceToTeamId", + "summary": "Deletes the document contributor with the specified id from a document.", + "description": "This operation cannot be performed on inherited document contributors, only explicit ones.\r\n There will be recalculation of permissions for related entities considering the deleted document contributor.\r\n \r\n The user must have at least `write` permissions for the specified document.", + "operationId": "DeleteDocumentContributorByDocumentIdAndDocumentContributorId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document to delete the contributor from.", "required": true, "schema": { "type": "string", @@ -8359,9 +8059,9 @@ } }, { - "name": "documentSpaceToTeamId", + "name": "documentContributorId", "in": "path", - "description": "The id of the document space to team connection.", + "description": "The id of the document contributor to delete.", "required": true, "schema": { "type": "string", @@ -8415,21 +8115,21 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } }, "put": { "tags": [ - "DocumentSpaces" + "Documents" ], - "summary": "Updates the access of a team to the document space with the specified id.", - "description": "Updates the specified document space to team connection of a document space.\r\n Updating a document space team will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", - "operationId": "PutDocumentSpaceTeamByDocumentSpaceIdAndDocumentSpaceToTeamId", + "summary": "Updates the access of a document contributor with the specified id to a document.", + "description": "Updating a document contributor will affect their access to the document.\r\n There will be a recalculation of permissions for related entities considering the updated document contributor.\r\n \r\n The user must have at least `write` permissions for the specified document.", + "operationId": "PutDocumentContributorByDocumentIdAndDocumentContributorId", "parameters": [ { - "name": "documentSpaceId", + "name": "documentId", "in": "path", - "description": "The id of the document space.", + "description": "The id of the document to update.", "required": true, "schema": { "type": "string", @@ -8437,9 +8137,9 @@ } }, { - "name": "documentSpaceToTeamId", + "name": "documentContributorId", "in": "path", - "description": "The id of the document space to team connection.", + "description": "The id of the document contributor to update.", "required": true, "schema": { "type": "string", @@ -8448,11 +8148,11 @@ } ], "requestBody": { - "description": "The model with the updated team access.", + "description": "The model used to update the document contributor's access.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EntityToTeamForm" + "$ref": "#/components/schemas/ContributorForm" } } }, @@ -8464,7 +8164,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinimalEntityToTeamModel" + "$ref": "#/components/schemas/MinimalContributorModel" } } } @@ -8511,25 +8211,67 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/files/generateuploadurl": { + "/documents/{documentId}/duplicate": { "post": { "tags": [ - "FileUpload" + "Documents" + ], + "summary": "Duplicates the document with the specified id.", + "description": "Duplicates the document content, permissions and children documents.\r\n \r\n The user has at least `read` permissions for the specified document.", + "operationId": "PostDocumentDuplicateByDocumentId", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document to duplicate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Generates a URL to upload a file to.", - "description": "Generates a URL that can be used to upload a file. Use the returned upload id to create a file entry. See for more information.\r\n\r\nAny authenticated user.", - "operationId": "PostGenerateUploadURL", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GenerateUploadUrlResponseModel" + "$ref": "#/components/schemas/DocumentModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -8550,27 +8292,19 @@ } } }, - "/files/images/{entityName}/{entityId}": { - "delete": { + "/documents/{documentId}/externalfiles": { + "post": { "tags": [ - "Images" + "DocumentFiles" ], - "summary": "Deletes the profile image of the entity with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "DeleteFilesImagesByEntityNameAndEntityId", + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", "parameters": [ { - "name": "entityName", - "in": "path", - "required": true, - "schema": { - "pattern": "^[A-Za-z]*$", - "type": "string" - } - }, - { - "name": "entityId", + "name": "documentId", "in": "path", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -8578,26 +8312,34 @@ } } ], - "responses": { - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "requestBody": { + "description": "List of file forms.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" } } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -8616,27 +8358,59 @@ "x-access": { "any": "true" } - }, - "get": { + } + }, + "/documents/{documentId}/files": { + "delete": { "tags": [ - "Images" + "DocumentFiles" ], - "summary": "Returns the image of the entity with the specified id.", - "description": "\r\n\r\nAllows unauthenticated access.", - "operationId": "GetFilesImagesByEntityNameAndEntityId", + "summary": "Deletes the files of the specified document.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteDocumentFiles", "parameters": [ { - "name": "entityName", + "name": "documentId", "in": "path", + "description": "The id of the document.", "required": true, "schema": { - "pattern": "^[A-Za-z]*$", - "type": "string" + "type": "string", + "format": "uuid" } - }, + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ { - "name": "entityId", + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "DocumentFiles" + ], + "summary": "Returns all files of the document with the specified id.", + "description": "Returns all file metadata of the document with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetDocumentFiles", + "parameters": [ + { + "name": "documentId", "in": "path", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -8644,27 +8418,16 @@ } }, { - "name": "width", - "in": "query", - "schema": { - "type": "number", - "format": "double" - } + "$ref": "#/components/parameters/page" }, { - "name": "height", - "in": "query", - "schema": { - "type": "number", - "format": "double" - } + "$ref": "#/components/parameters/pageSize" }, { - "name": "crop", - "in": "query", - "schema": { - "type": "boolean" - } + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -8673,38 +8436,139 @@ "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } } } } - }, - "304": { - "description": "Not Modified", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "DocumentFiles" + ], + "summary": "Creates a new document file for the document with the specified id..", + "description": "Uploads a new document file for the document with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateDocumentFile", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "400": { - "description": "Bad Request", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/documents/{documentId}/files/byuploadid": { + "post": { + "tags": [ + "FileUpload" + ], + "summary": "Creates a file from an upload id.", + "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file document from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", + "operationId": "PostUploadByUploadId", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document to attach the file to.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model describing the uploaded file metadata.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UploadByUploadIdForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -8731,29 +8595,23 @@ "v1" ], "x-access": { - "anonymous": "true" + "any": "true" } - }, + } + }, + "/documents/{documentId}/files/byurl": { "post": { "tags": [ - "Images" + "DocumentFiles" ], - "summary": "Uploads a new profile image.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostFilesImagesByEntityNameAndEntityId", + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateDocumentFileByUrl", "parameters": [ { - "name": "entityName", - "in": "path", - "required": true, - "schema": { - "pattern": "^[A-Za-z]*$", - "type": "string" - } - }, - { - "name": "entityId", + "name": "documentId", "in": "path", + "description": "The id of the document the file is linked to.", "required": true, "schema": { "type": "string", @@ -8762,10 +8620,16 @@ } ], "requestBody": { + "description": "The url, name and description of the file.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "$ref": "#/components/schemas/FileUploadModel" + "$ref": "#/components/schemas/FilePostForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } } } @@ -8780,26 +8644,6 @@ } } } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -8817,27 +8661,29 @@ } } }, - "/files/images/{entityName}/{entityId}/byuploadid": { - "post": { + "/documents/{documentId}/files/{fileId}": { + "delete": { "tags": [ - "Images" + "DocumentFiles" ], - "summary": "Sets a profile image from a previously uploaded file.", - "description": "After an image has been uploaded to an upload URL generated by the /files/generateuploadurl endpoint, this endpoint sets the uploaded image as the profile image of the entity by providing the upload id.\r\n\r\nAny authenticated user.", - "operationId": "PostFilesImagesByUploadIdByEntityNameAndEntityId", + "summary": "Deletes the document file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteDocumentFile", "parameters": [ { - "name": "entityName", + "name": "documentId", "in": "path", + "description": "The id of the document.", "required": true, "schema": { - "pattern": "^[A-Za-z]*$", - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "entityId", + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -8845,16 +8691,54 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UploadByUploadIdForm" - } + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "Document Files" + ], + "summary": "Returns the file with the specified id of the document with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByDocumentNameAndDocumentIdAndFileId", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", @@ -8866,8 +8750,8 @@ } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -8876,8 +8760,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -8900,56 +8784,130 @@ "x-access": { "any": "true" } - } - }, - "/files/images/{entityType}": { - "get": { + }, + "put": { "tags": [ - "SharedFiles" + "DocumentFiles" ], - "summary": "Returns the public profile image.", - "description": "\r\n\r\nAllows unauthenticated access.", - "operationId": "GetFilesImagesByEntityType", + "summary": "Updates the metadata of the document file with the specified id.", + "description": "Updates the metadata of the document file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateDocumentFile", "parameters": [ { - "name": "entityType", + "name": "documentId", "in": "path", - "description": "The entity type for which we are requesting the image.", + "description": "The id of the document.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "token", - "in": "query", - "description": "The token to allow access.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "description": "The model to update the file with the specified id.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + } + } + }, "responses": { "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/documents/{documentId}/files/{fileId}/copy": { + "post": { + "tags": [ + "DocumentFiles" + ], + "summary": "Copies the file to a new document.", + "description": "Copies the file to a new document (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToDocument", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, - "404": { - "description": "Not Found", + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + } + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -8966,19 +8924,29 @@ "v1" ], "x-access": { - "anonymous": "true" + "any": "true" } } }, - "/files/{fileId}/download": { + "/documents/{documentId}/files/{fileId}/download": { "get": { "tags": [ - "Files" + "DocumentFiles" ], - "summary": "Returns the content of the file with the specified id.", - "description": "Returns the content of the latest file version.\nIf the file is an image and the width and height are set,\nthe image will resized before it is returned.\nThe get the content it is necessary to have the 'read' permissions on the\nentity the file is related to.\r\n\r\nAny authenticated user.", - "operationId": "GetFile", + "summary": "Returns the content of the document file with the specified id.", + "description": "Returns the content of the document file. Uses the latest file version.\nIf the document file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetDocumentFileContent", "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "name": "fileId", "in": "path", @@ -9014,24 +8982,6 @@ "schema": { "type": "boolean" } - }, - { - "name": "enlarge", - "in": "query", - "description": "Whether to enlarge the image if the width/height are bigger than the original image.", - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "inline", - "in": "query", - "description": "If inline is true, content-disposition header is inline, else it is attachment.", - "schema": { - "type": "boolean", - "default": false - } } ], "responses": { @@ -9062,19 +9012,19 @@ } } }, - "/files/{fileId}/pdf": { + "/documents/{documentId}/files/{fileId}/shareurl": { "get": { "tags": [ - "Files" + "DocumentFiles" ], - "summary": "Returns the content of the file with the specified id as pdf.", - "description": "Returns the content of the latest file version as pdf.\nAll kinds of MS Office document types are supported.\nTo get the content you must have the 'read' permissions on the\nentity the file is related to.\r\n\r\nAny authenticated user.", - "operationId": "GetPdf", + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", "parameters": [ { - "name": "fileId", + "name": "documentId", "in": "path", - "description": "The id of the file.", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -9082,12 +9032,13 @@ } }, { - "name": "inline", - "in": "query", - "description": "If inline is true, content-disposition header is inline, else it is attachment.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], @@ -9097,8 +9048,7 @@ "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "type": "string" } } } @@ -9119,15 +9069,35 @@ } } }, - "/filters": { + "/documents/{documentId}/files/{fileId}/versions": { "get": { "tags": [ - "Filters" + "DocumentFiles" ], - "summary": "Returns the current user's filters.", - "description": "Returns the union of filters owned by the requesting user and filters explicitly shared with the requesting user.\r\n Use the specialized created-by-me and shared-with-me endpoints when only one category is needed.\r\n\r\nAny authenticated user.", - "operationId": "GetFilters", + "summary": "Returns all file versions of the specified document file.", + "description": "Returns all file versions of the specified document file.\r\n\r\nAny authenticated user.", + "operationId": "GetDocumentFileVersions", "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -9149,21 +9119,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/FileVersion" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -9179,62 +9139,72 @@ "x-access": { "any": "true" } - } - }, - "/filters/{entityType}": { - "get": { + }, + "post": { "tags": [ - "Filters" + "DocumentFiles" ], - "summary": "Returns the current user's filters for the specified user type.", - "description": "Returns the union of filters owned by the requesting user and filters explicitly shared with the requesting user\r\n for the requested user type.\r\n Use the specialized created-by-me and shared-with-me endpoints when only one category is needed.\r\n\r\nAny authenticated user.", - "operationId": "GetFiltersByUserType", + "summary": "Uploads a new version of the document file with the specified id.", + "description": "Uploads a new version of an document file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateDocumentFileVersion", "parameters": [ { - "name": "entityType", + "name": "documentId", "in": "path", - "description": "The entity type route value.", + "description": "The id of the document.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Filter" + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" } } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileVersion" } } } + }, + "400": { + "description": "Bad Request" } }, "security": [ @@ -9252,49 +9222,59 @@ } } }, - "/filters/{entityType}/evaluate": { - "post": { + "/documents/{documentId}/files/{fileId}/versions/{versionId}": { + "get": { "tags": [ - "Filters" + "Document Files" ], - "summary": "Evaluates a filter definition against the specified user type and returns the filtered results without saving the filter.\n This endpoint is designed for quick filters where the frontend builds a FilterDefinition dynamically\n and needs to evaluate it immediately without persisting it to the database.\n Supports standard paging, ordering, and additional query constraints from query parameters.", - "description": "Evaluates an ad-hoc filter without persisting it. Useful for testing filters before saving or for temporary filtering needs.\r\n\r\nAny authenticated user.", - "operationId": "PostFilterEvaluateByUserType", + "summary": "Returns the document file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByDocumentNameAndDocumentIdAndFileIdAndVersionId", "parameters": [ { - "name": "entityType", + "name": "documentId", "in": "path", - "description": "The entity type name (tasks, projects, companies, users).", + "description": "The id of the document.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } - } - ], - "requestBody": { - "description": "The filter application form containing the FilterDefinition to evaluate.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApplyFilterForm" - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ObjectPagedResult" + "$ref": "#/components/schemas/FileVersion" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -9329,19 +9309,87 @@ } } }, - "/filters/{filterId}/contributors": { + "/documents/{documentId}/files/{fileId}/versions/{versionId}/download": { + "get": { + "tags": [ + "DocumentFiles" + ], + "summary": "Returns the content of the document file version with the specified id.", + "description": "Returns the content of the document file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetDocumentFileVersionContent", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "The id of the document.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/documents/{documentId}/teams": { "post": { "tags": [ - "Filters" + "Documents" ], - "summary": "Adds explicit contributors to the specified filter.", - "description": "Adding filter contributors grants explicit access to the filter with the specified access levels.\r\n Existing explicit contributors are ignored and therefore not recreated.\r\n The filter creator cannot be added as an explicit contributor because ownership is handled implicitly.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", - "operationId": "PostFilterContributorsByFilterId", + "summary": "Adds a list of document teams to a document with the specified id.", + "description": "Adding document teams will affect their access to the document.\r\n Recalculation of permissions for related entities considering the new document teams\r\n will be done in the background asynchronously.\r\n \r\n The user must have at least `write` permissions for the specified document.", + "operationId": "PostDocumentTeamsByDocumentId", "parameters": [ { - "name": "filterId", + "name": "documentId", "in": "path", - "description": "The filter that should receive explicit contributors.", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -9350,13 +9398,13 @@ } ], "requestBody": { - "description": "The contributor permissions to add.", + "description": "The model used to add document teams to the document.", "content": { "application/json": { "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ContributorPostForm" + "$ref": "#/components/schemas/EntityToTeamPostForm" } } } @@ -9371,7 +9419,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/MinimalContributorModel" + "$ref": "#/components/schemas/MinimalEntityToTeamModel" } } } @@ -9423,19 +9471,19 @@ } } }, - "/filters/{filterId}/contributors/{filterContributorId}": { + "/documents/{documentId}/teams/{documentToTeamId}": { "delete": { "tags": [ - "Filters" + "Documents" ], - "summary": "Removes an explicit contributor from the specified filter.", - "description": "Removing a filter contributor revokes that contributor's explicit access to the filter.\r\n The contributor entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", - "operationId": "DeleteFilterContributorByFilterIdAndFilterContributorId", + "summary": "Deletes the document team with the specified id from a document.", + "description": "Deletes the specific document team from a document. Deleting a document team will affect their access to the document.\r\n This operation cannot be performed on inherited document teams, only explicit ones.\r\n There will be recalculation of permissions for related entities considering the deleted document team.\r\n \r\n The user must have at least `write` permissions for the specified document.", + "operationId": "DeleteDocumentTeamByDocumentIdAndDocumentToTeamId", "parameters": [ { - "name": "filterId", + "name": "documentId", "in": "path", - "description": "The filter that owns the contributor entry.", + "description": "The id of the document to delete the team from.", "required": true, "schema": { "type": "string", @@ -9443,9 +9491,9 @@ } }, { - "name": "filterContributorId", + "name": "documentToTeamId", "in": "path", - "description": "The contributor entry to delete.", + "description": "The id of the document to team connection.", "required": true, "schema": { "type": "string", @@ -9457,6 +9505,16 @@ "204": { "description": "No Content" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "401": { "description": "Unauthorized", "content": { @@ -9494,16 +9552,16 @@ }, "put": { "tags": [ - "Filters" + "Documents" ], - "summary": "Updates the access level of an explicit filter contributor.", - "description": "Updating a filter contributor changes that contributor's explicit access level for the filter.\r\n The contributor entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", - "operationId": "PutFilterContributorByFilterIdAndFilterContributorId", + "summary": "Updates the document team with the specified id.", + "description": "Updates the specific document team of a document. Updating a document team will affect their access to the document.\r\n There will be recalculation of permissions for related entities considering the updated document team.\r\n \r\n The user must have at least `write` permissions for this document.", + "operationId": "PutDocumentTeamByDocumentIdAndDocumentToTeamId", "parameters": [ { - "name": "filterId", + "name": "documentId", "in": "path", - "description": "The filter that owns the contributor entry.", + "description": "The id of the document.", "required": true, "schema": { "type": "string", @@ -9511,9 +9569,9 @@ } }, { - "name": "filterContributorId", + "name": "documentToTeamId", "in": "path", - "description": "The contributor entry to update.", + "description": "The id of the document to team connection to update.", "required": true, "schema": { "type": "string", @@ -9522,11 +9580,11 @@ } ], "requestBody": { - "description": "The new contributor permission payload.", + "description": "The model used to update document teams of a document.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContributorForm" + "$ref": "#/components/schemas/EntityToTeamForm" } } }, @@ -9538,7 +9596,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinimalContributorModel" + "$ref": "#/components/schemas/MinimalEntityToTeamModel" } } } @@ -9589,35 +9647,70 @@ } } }, - "/filters/{filterId}/teams": { - "post": { + "/documentspaces": { + "get": { "tags": [ - "Filters" + "DocumentSpaces" ], - "summary": "Adds explicit team permissions to the specified filter.", - "description": "Adding filter teams grants explicit access to the filter for all members of the specified teams.\r\n Existing explicit team permissions are ignored and therefore not recreated.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", - "operationId": "PostFilterTeamsByFilterId", + "summary": "Returns all document spaces.", + "description": "The user must have at least `read` permissions to see a document space.", + "operationId": "GetDocumentSpaces", "parameters": [ { - "name": "filterId", - "in": "path", - "description": "The filter that should receive explicit team permissions.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentSpaceModel" + } + } + } } } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "DocumentSpaces" + ], + "summary": "Creates a new document space.", + "description": "\r\n\r\nThe user must be an admin.", + "operationId": "PostDocumentSpace", "requestBody": { - "description": "The team permissions to add.", + "description": "The model used to create the document space.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EntityToTeamPostForm" - } + "$ref": "#/components/schemas/DocumentSpaceForm" } } }, @@ -9629,10 +9722,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MinimalEntityToTeamModel" - } + "$ref": "#/components/schemas/DocumentSpaceModel" } } } @@ -9656,16 +9746,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -9679,33 +9759,23 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } } }, - "/filters/{filterId}/teams/{filterToTeamId}": { + "/documentspaces/{documentSpaceId}": { "delete": { "tags": [ - "Filters" + "DocumentSpaces" ], - "summary": "Removes an explicit team permission from the specified filter.", - "description": "Removing a filter team permission revokes that team's explicit access to the filter.\r\n The team permission entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", - "operationId": "DeleteFilterTeamByFilterIdAndFilterToTeamId", + "summary": "Deletes the document space with the specified id.", + "description": "The documents in this space and their related entities (comments, etc.) will be unrecoverably deleted in the background asynchronously.\r\n\r\nThe user must be an admin.", + "operationId": "DeleteDocumentSpaceById", "parameters": [ { - "name": "filterId", - "in": "path", - "description": "The filter that owns the team permission entry.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "filterToTeamId", + "name": "documentSpaceId", "in": "path", - "description": "The team permission entry to delete.", + "description": "The id of the document space to delete.", "required": true, "schema": { "type": "string", @@ -9749,31 +9819,21 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } }, - "put": { + "get": { "tags": [ - "Filters" + "DocumentSpaces" ], - "summary": "Updates the access level of an explicit team permission on the specified filter.", - "description": "Updating a filter team permission changes the explicit access level of the referenced team for the filter.\r\n The team permission entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", - "operationId": "PutFilterTeamByFilterIdAndFilterToTeamId", + "summary": "Returns the document space with the specified id.", + "description": "The user must have at least `read` permissions for the specified document space.", + "operationId": "GetDocumentSpaceById", "parameters": [ { - "name": "filterId", - "in": "path", - "description": "The filter that owns the team permission entry.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "filterToTeamId", + "name": "documentSpaceId", "in": "path", - "description": "The team permission entry to update.", + "description": "The id of the document space to retrieve.", "required": true, "schema": { "type": "string", @@ -9781,34 +9841,13 @@ } } ], - "requestBody": { - "description": "The new team permission payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EntityToTeamForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinimalEntityToTeamModel" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/DocumentModel" } } } @@ -9847,17 +9886,58 @@ "x-access": { "any": "true" } - } - }, - "/invitations": { - "get": { + }, + "put": { "tags": [ - "Invitations" + "DocumentSpaces" ], - "summary": "Prevents GET requests to the invitations route from throwing errors.", - "description": "\r\n\r\nAllows unauthenticated access.", - "operationId": "GetInvitations", + "summary": "Updates the document space with the specified id.", + "description": "\r\n\r\nThe user must be an admin.", + "operationId": "PutDocumentSpaceById", + "parameters": [ + { + "name": "documentSpaceId", + "in": "path", + "description": "The id of the document space.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model used to update the document space.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentSpaceForm" + } + } + }, + "required": true + }, "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentSpaceModel" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -9880,70 +9960,57 @@ "v1" ], "x-access": { - "anonymous": "true" + "admin": "true" } } }, - "/invitations/accept": { + "/documentspaces/{documentSpaceId}/contributors": { "post": { "tags": [ - "Invitations" + "DocumentSpaces" + ], + "summary": "Adds a list of document space contributors to a document space.", + "description": "Adding document space contributors will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", + "operationId": "PostDocumentSpaceContributorsByDocumentSpaceId", + "parameters": [ + { + "name": "documentSpaceId", + "in": "path", + "description": "The id of the document space.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Accepts the invitation with the invitation code.", - "operationId": "Accept", "requestBody": { - "description": "The invitation code received when creating the invitation.", + "description": "The model with the list of contributors to add.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AcceptInvitation" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/AcceptInvitation" + "type": "array", + "items": { + "$ref": "#/components/schemas/ContributorPostForm" + } } } - } + }, + "required": true }, - "responses": { - "200": { - "description": "OK" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ] - } - }, - "/me": { - "get": { - "tags": [ - "Users" - ], - "summary": "Returns the currently logged-in user and workspace.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMe", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserAndWorkspace" + "$ref": "#/components/schemas/MinimalContributorModel" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -9951,55 +10018,23 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/me/allavailabletasks": { - "get": { - "tags": [ - "AssignedTasks" - ], - "summary": "Returns all tasks the current user is allowed to see.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMeAllAvailableTasks", - "parameters": [ - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" }, - { - "$ref": "#/components/parameters/orderby" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -10016,75 +10051,66 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } } }, - "/me/assignedtasks": { - "get": { + "/documentspaces/{documentSpaceId}/contributors/{documentSpaceContributorId}": { + "delete": { "tags": [ - "AssignedTasks" + "DocumentSpaces" ], - "summary": "Returns all tasks assigned to the current user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMeAssignedTasks", + "summary": "Deletes the document space contributor with the specified id from a document space.", + "description": "Deletes the specified document space contributor from a document space.\r\n Deleting a document space contributor will affect their access to the document space and the documents within that space.\r\n\r\nThe user must be an admin.", + "operationId": "DeleteDocumentSpaceContributorByDocumentSpaceIdAndDocumentSpaceContributorId", "parameters": [ { - "name": "inProgress", - "in": "query", - "description": "Whether to return only assigned project tasks of running projects. Defaults to true.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "assignedOnFrom", - "in": "query", - "description": "The start date for filtering by assignment date. If set, tasks are returned only when the assignment date is greater or equal than this value.", + "name": "documentSpaceId", + "in": "path", + "description": "The id of the document space.", + "required": true, "schema": { "type": "string", - "format": "date-time" + "format": "uuid" } }, { - "name": "assignedOnTo", - "in": "query", - "description": "The end date for filtering by assignment date. If set, tasks are returned only when the assignment date is less or equal than this value.", + "name": "documentSpaceContributorId", + "in": "path", + "description": "The id of the document space contributor to delete.", + "required": true, "schema": { "type": "string", - "format": "date-time" + "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -10105,23 +10131,31 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } - } - }, - "/me/assignedtasks/{taskId}": { - "get": { + }, + "put": { "tags": [ - "AssignedTasks" + "DocumentSpaces" ], - "summary": "Returns the assigned task with the specified id of the current user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMeAssignedTaskByTaskId", + "summary": "Updates the access of a document space contributor to the document space with the specified id.", + "description": "Updates the access of the specified document space contributor to the specified document space.\r\n Updating a document space contributor will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", + "operationId": "PutDocumentSpaceContributorByDocumentSpaceIdAndDocumentSpaceContributorId", "parameters": [ { - "name": "taskId", + "name": "documentSpaceId", "in": "path", - "description": "The id of the task to return.", + "description": "The id of the document space.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "documentSpaceContributorId", + "in": "path", + "description": "The id of the document space contributor.", "required": true, "schema": { "type": "string", @@ -10129,19 +10163,30 @@ } } ], + "requestBody": { + "description": "The model with the updated contributor data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/MinimalContributorModel" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -10149,52 +10194,23 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/me/dashboards": { - "get": { - "tags": [ - "Dashboards" - ], - "summary": "Returns the dashboards of the current user.", - "description": "Returns the dashboards of the current user.\r\n\r\nThe user must be the creator.", - "operationId": "GetMeDashboards", - "parameters": [ - { - "name": "includeWidgets", - "in": "query", - "description": "Include widgets.", - "schema": { - "type": "boolean", - "default": false + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Dashboard" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -10211,19 +10227,29 @@ "v1" ], "x-access": { - "owner": "true" + "admin": "true" } } }, - "/me/filters": { + "/documentspaces/{documentSpaceId}/documents": { "get": { "tags": [ - "Filters" + "Documents" ], - "summary": "Returns the filters created by the current user.", - "description": "Returns filters that were created by and are owned by the requesting user.\r\n Shared filters are excluded, even if the requesting user also has explicit access through contributor, team, or workspace permissions.\r\n\r\nAny authenticated user.", - "operationId": "GetMeFilters", + "summary": "Returns all documents that belong to the document space with the specified id.", + "description": "The user must have at least `read` permissions for the specified document space.", + "operationId": "GetDocumentSpaceDocumentsByDocumentSpaceId", "parameters": [ + { + "name": "documentSpaceId", + "in": "path", + "description": "The id of the document space to retrieve documents from.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -10245,21 +10271,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/DocumentModel" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -10277,22 +10293,23 @@ } } }, - "/me/filters/{entityType}": { + "/documentspaces/{documentSpaceId}/documents/trash": { "get": { "tags": [ - "Filters" + "Documents" ], - "summary": "Returns the filters created by the current user for the specified user type.", - "description": "Returns filters that were created by and are owned by the requesting user and match the requested user type.\r\n Shared filters are excluded, even if the requesting user also has explicit access through contributor, team, or workspace permissions.\r\n\r\nAny authenticated user.", - "operationId": "GetMeFiltersByUserType", + "summary": "Returns all deleted documents of the document space with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetDocumentSpaceDocumentsTrashByDocumentSpaceId", "parameters": [ { - "name": "entityType", + "name": "documentSpaceId", "in": "path", - "description": "The entity type route value.", + "description": "The id of the document space to retrieve trashed documents from.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { @@ -10316,21 +10333,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/DocumentModel" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -10346,31 +10353,37 @@ "x-access": { "any": "true" } - }, + } + }, + "/documentspaces/{documentSpaceId}/teams": { "post": { "tags": [ - "Filters" + "DocumentSpaces" ], - "summary": "Creates a persisted filter definition for the specified user type.", - "description": "Creates a new filter owned by the current user.\r\n\r\nAny authenticated user.", - "operationId": "PostMeFilterByUserType", + "summary": "Adds teams to the document space with the specified id.", + "description": "Adding teams to a document space will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", + "operationId": "PostDocumentSpaceTeamsByDocumentSpaceId", "parameters": [ { - "name": "entityType", + "name": "documentSpaceId", "in": "path", - "description": "Route segment identifying the entity type (tasks, projects, companies, users).", + "description": "The id of the document space.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], "requestBody": { - "description": "The filter definition payload supplied by the caller.", + "description": "The model with the list of teams to add.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FilterForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityToTeamPostForm" + } } } }, @@ -10382,7 +10395,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/MinimalEntityToTeamModel" } } } @@ -10397,75 +10410,8 @@ } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/me/filters/{entityType}/fromquery": { - "post": { - "tags": [ - "Filters" - ], - "summary": "Creates a persisted filter from an OData query string.\n Convenience endpoint for external API consumers who want to create filters using familiar OData syntax.", - "description": "Creates a filter from an OData filterby query string.\r\n\r\nAny authenticated user.", - "operationId": "PostMeFilterFromQueryByUserType", - "parameters": [ - { - "name": "entityType", - "in": "path", - "description": "Route segment identifying the entity type (tasks, projects, companies, users).", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "The filter query payload containing the filter name, sharing settings, and query string.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilterFromQueryForm" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Filter" - } - } - } - }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -10496,23 +10442,33 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } } }, - "/me/filters/{filterId}": { + "/documentspaces/{documentSpaceId}/teams/{documentSpaceToTeamId}": { "delete": { "tags": [ - "Filters" + "DocumentSpaces" ], - "summary": "Deletes a filter.", - "description": "Deletes the filter when the current user has manage access.\r\n\r\nAny authenticated user.", - "operationId": "DeleteMeFilterById", + "summary": "Deletes the team with the specified id from a document space.", + "description": "Deletes the specified team from a document space.\r\n Deleting a team from a document space will affect their access to the document space and the documents within that space.\r\n\r\nThe user must be an admin.", + "operationId": "DeleteDocumentSpaceTeamByDocumentSpaceIdAndDocumentSpaceToTeamId", "parameters": [ { - "name": "filterId", + "name": "documentSpaceId", "in": "path", - "description": "Identifier of the filter to delete.", + "description": "The id of the document space.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "documentSpaceToTeamId", + "in": "path", + "description": "The id of the document space to team connection.", "required": true, "schema": { "type": "string", @@ -10524,6 +10480,16 @@ "204": { "description": "No Content" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "401": { "description": "Unauthorized", "content": { @@ -10556,21 +10522,31 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } }, - "get": { + "put": { "tags": [ - "Filters" + "DocumentSpaces" ], - "summary": "Returns a single filter by its identifier for the current user.", - "description": "Returns the filter if the current user has read access.\r\n\r\nAny authenticated user.", - "operationId": "GetMeFilterById", + "summary": "Updates the access of a team to the document space with the specified id.", + "description": "Updates the specified document space to team connection of a document space.\r\n Updating a document space team will affect their access to the document space and documents within that space.\r\n\r\nThe user must be an admin.", + "operationId": "PutDocumentSpaceTeamByDocumentSpaceIdAndDocumentSpaceToTeamId", "parameters": [ { - "name": "filterId", + "name": "documentSpaceId", "in": "path", - "description": "The filter identifier.", + "description": "The id of the document space.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "documentSpaceToTeamId", + "in": "path", + "description": "The id of the document space to team connection.", "required": true, "schema": { "type": "string", @@ -10578,13 +10554,34 @@ } } ], + "requestBody": { + "description": "The model with the updated team access.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntityToTeamForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/MinimalEntityToTeamModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -10621,76 +10618,25 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } - }, - "put": { + } + }, + "/files/generateuploadurl": { + "post": { "tags": [ - "Filters" - ], - "summary": "Updates an existing filter definition.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutMeFilterById", - "parameters": [ - { - "name": "filterId", - "in": "path", - "description": "Identifier of the filter to update.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "FileUpload" ], - "requestBody": { - "description": "The updated filter definition supplied by the caller.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilterForm" - } - } - }, - "required": true - }, + "summary": "Generates a URL to upload a file to.", + "description": "Generates a URL that can be used to upload a file. Use the returned upload id to create a file entry. See for more information.\r\n\r\nAny authenticated user.", + "operationId": "PostGenerateUploadURL", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Filter" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/GenerateUploadUrlResponseModel" } } } @@ -10711,19 +10657,27 @@ } } }, - "/me/filters/{filterId}/copy": { - "post": { + "/files/images/{entityName}/{entityId}": { + "delete": { "tags": [ - "Filters" + "Images" ], - "summary": "Creates a copy of an existing filter.", - "description": "Copies the filter definition and query.\r\n The copied filter will be owned only by the requesting user.\r\n The name of the copied filter will be \"{original name} (Copy)\" or \"{original name} (Kopie)\" for German users.\r\n\r\nAny authenticated user.", - "operationId": "PostMeFilterCopyByFilterId", + "summary": "Deletes the profile image of the entity with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "DeleteFilesImagesByEntityNameAndEntityId", "parameters": [ { - "name": "filterId", + "name": "entityName", + "in": "path", + "required": true, + "schema": { + "pattern": "^[A-Za-z]*$", + "type": "string" + } + }, + { + "name": "entityId", "in": "path", - "description": "The identifier of the filter to copy.", "required": true, "schema": { "type": "string", @@ -10732,25 +10686,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Filter" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -10786,34 +10723,54 @@ "x-access": { "any": "true" } - } - }, - "/me/filters/{filterId}/{entityType}": { + }, "get": { "tags": [ - "Filters" + "Images" ], - "summary": "Evaluates a filter by applying it to the specified target user type and returning the filtered results.\n Supports standard paging, ordering, and additional query constraints from query parameters.", - "description": "Retrieves and evaluates a saved filter to return matching entities.\r\n\r\nAny authenticated user.", - "operationId": "GetMeFilterByFilterIdAndUserType", + "summary": "Returns the image of the entity with the specified id.", + "description": "\r\n\r\nAllows unauthenticated access.", + "operationId": "GetFilesImagesByEntityNameAndEntityId", "parameters": [ { - "name": "filterId", + "name": "entityName", "in": "path", - "description": "The identifier of the filter to evaluate.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "pattern": "^[A-Za-z]*$", + "type": "string" } }, { - "name": "entityType", + "name": "entityId", "in": "path", - "description": "The entity type name (tasks, projects, companies, users).", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "width", + "in": "query", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "height", + "in": "query", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "schema": { + "type": "boolean" } } ], @@ -10823,7 +10780,18 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ObjectPagedResult" + "type": "string", + "format": "binary" + } + } + } + }, + "304": { + "description": "Not Modified", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -10870,48 +10838,58 @@ "v1" ], "x-access": { - "any": "true" + "anonymous": "true" } - } - }, - "/me/otherprivatetasks": { - "get": { + }, + "post": { "tags": [ - "PrivateTasks" + "Images" ], - "summary": "Returns all private tasks that the current user created and assigned to someone else.", - "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns all private tasks that were originally created by the user but were reassigned to someone else.\r\n\r\nAny authenticated user.", - "operationId": "GetMeOtherPrivateTasks", + "summary": "Uploads a new profile image.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostFilesImagesByEntityNameAndEntityId", "parameters": [ { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" + "name": "entityName", + "in": "path", + "required": true, + "schema": { + "pattern": "^[A-Za-z]*$", + "type": "string" + } }, { - "$ref": "#/components/parameters/filterby" + "name": "entityId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/FileUploadModel" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/FileInfo" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -10920,8 +10898,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -10946,19 +10924,27 @@ } } }, - "/me/otherprivatetasks/{taskId}": { - "get": { + "/files/images/{entityName}/{entityId}/byuploadid": { + "post": { "tags": [ - "PrivateTasks" + "Images" ], - "summary": "Returns a private task that the current user created and assigned to someone else.", - "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns a private task that was originally created by the user but was reassigned to someone else.\r\n\r\nAny authenticated user.", - "operationId": "GetMeOtherPrivateTaskByTaskId", + "summary": "Sets a profile image from a previously uploaded file.", + "description": "After an image has been uploaded to an upload URL generated by the /files/generateuploadurl endpoint, this endpoint sets the uploaded image as the profile image of the entity by providing the upload id.\r\n\r\nAny authenticated user.", + "operationId": "PostFilesImagesByUploadIdByEntityNameAndEntityId", "parameters": [ { - "name": "taskId", + "name": "entityName", + "in": "path", + "required": true, + "schema": { + "pattern": "^[A-Za-z]*$", + "type": "string" + } + }, + { + "name": "entityId", "in": "path", - "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -10966,19 +10952,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UploadByUploadIdForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/FileInfo" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -10987,8 +10983,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -11013,51 +11009,40 @@ } } }, - "/me/otherprivatetasks/{taskId}/checklistitems": { + "/files/images/{entityType}": { "get": { "tags": [ - "ChecklistItems" + "SharedFiles" ], - "summary": "Returns the checklist items for a private task with the specified id.", - "description": "The user must be the creator of the task.", - "operationId": "GetMyOtherPrivateTaskChecklistItemsByUserIdAndTaskId", + "summary": "Returns the public profile image.", + "description": "\r\n\r\nAllows unauthenticated access.", + "operationId": "GetFilesImagesByEntityType", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", + "name": "entityType", + "in": "path", + "description": "The entity type for which we are requesting the image.", + "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "taskId", - "in": "path", - "description": "The id of the task.", + "name": "token", + "in": "query", + "description": "The token to allow access.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "responses": { "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - } + "description": "OK" }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -11088,46 +11073,71 @@ "v1" ], "x-access": { - "any": "true" + "anonymous": "true" } } }, - "/me/otherprivatetasks/{taskId}/checklistitems/{checklistItemId}": { + "/files/{fileId}/download": { "get": { "tags": [ - "ChecklistItems" + "Files" ], - "summary": "Returns a checklist item for a private task with the specified id.", - "description": "The user must be the creator of the task.", - "operationId": "GetMyOtherPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", + "summary": "Returns the content of the file with the specified id.", + "description": "Returns the content of the latest file version.\nIf the file is an image and the width and height are set,\nthe image will resized before it is returned.\nThe get the content it is necessary to have the 'read' permissions on the\nentity the file is related to.\r\n\r\nAny authenticated user.", + "operationId": "GetFile", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, "schema": { "type": "string", "format": "uuid" } }, { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, + "name": "width", + "in": "query", + "description": "Set width to resize.", "schema": { - "type": "string", - "format": "uuid" + "type": "number", + "format": "double" } }, { - "name": "checklistItemId", - "in": "path", - "description": "The id of the checklist item.", - "required": true, + "name": "height", + "in": "query", + "description": "Set height to resize.", "schema": { - "type": "string", - "format": "uuid" + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + }, + { + "name": "enlarge", + "in": "query", + "description": "Whether to enlarge the image if the width/height are bigger than the original image.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "name": "inline", + "in": "query", + "description": "If inline is true, content-disposition header is inline, else it is attachment.", + "schema": { + "type": "boolean", + "default": false } } ], @@ -11137,30 +11147,25 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" + "type": "string", + "format": "binary" } } } }, - "401": { - "description": "Unauthorized", + "206": { + "description": "Partial Content", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "416": { + "description": "Range Not Satisfiable" } }, "security": [ @@ -11178,31 +11183,43 @@ } } }, - "/me/permissions": { + "/files/{fileId}/pdf": { "get": { "tags": [ - "Permissions" + "Files" + ], + "summary": "Returns the content of the file with the specified id as pdf.", + "description": "Returns the content of the latest file version as pdf.\nAll kinds of MS Office document types are supported.\nTo get the content you must have the 'read' permissions on the\nentity the file is related to.\r\n\r\nAny authenticated user.", + "operationId": "GetPdf", + "parameters": [ + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "inline", + "in": "query", + "description": "If inline is true, content-disposition header is inline, else it is attachment.", + "schema": { + "type": "boolean", + "default": false + } + } ], - "summary": "Returns the permissions of the currently logged-in user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMePermissions", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserPermissionInfoExternal" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -11223,14 +11240,14 @@ } } }, - "/me/privatedocuments": { + "/filters": { "get": { "tags": [ - "Documents" + "Filters" ], - "summary": "Returns the requesting user's private documents.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMePrivateDocuments", + "summary": "Returns the current user's filters.", + "description": "Returns the union of filters owned by the requesting user and filters explicitly shared with the requesting user.\r\n Use the specialized created-by-me and shared-with-me endpoints when only one category is needed.\r\n\r\nAny authenticated user.", + "operationId": "GetFilters", "parameters": [ { "$ref": "#/components/parameters/page" @@ -11253,11 +11270,21 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/DocumentModel" + "$ref": "#/components/schemas/Filter" } } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -11275,15 +11302,24 @@ } } }, - "/me/privatedocuments/trash": { + "/filters/{entityType}": { "get": { "tags": [ - "Documents" + "Filters" ], - "summary": "Returns the requesting user's private trashed documents.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMePrivateDocumentsTrash", + "summary": "Returns the current user's filters for the specified user type.", + "description": "Returns the union of filters owned by the requesting user and filters explicitly shared with the requesting user\r\n for the requested user type.\r\n Use the specialized created-by-me and shared-with-me endpoints when only one category is needed.\r\n\r\nAny authenticated user.", + "operationId": "GetFiltersByUserType", "parameters": [ + { + "name": "entityType", + "in": "path", + "description": "The entity type route value.", + "required": true, + "schema": { + "type": "string" + } + }, { "$ref": "#/components/parameters/page" }, @@ -11305,11 +11341,21 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/DocumentModel" + "$ref": "#/components/schemas/Filter" } } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -11327,44 +11373,49 @@ } } }, - "/me/privatetasks": { - "get": { + "/filters/{entityType}/evaluate": { + "post": { "tags": [ - "PrivateTasks" + "Filters" ], - "summary": "Returns all private tasks of the current user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMePrivateTasks", + "summary": "Evaluates a filter definition against the specified user type and returns the filtered results without saving the filter.\n This endpoint is designed for quick filters where the frontend builds a FilterDefinition dynamically\n and needs to evaluate it immediately without persisting it to the database.\n Supports standard paging, ordering, and additional query constraints from query parameters.", + "description": "Evaluates an ad-hoc filter without persisting it. Useful for testing filters before saving or for temporary filtering needs.\r\n\r\nAny authenticated user.", + "operationId": "PostFilterEvaluateByUserType", "parameters": [ { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "entityType", + "in": "path", + "description": "The entity type name (tasks, projects, companies, users).", + "required": true, + "schema": { + "type": "string" + } } ], + "requestBody": { + "description": "The filter application form containing the FilterDefinition to evaluate.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplyFilterForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/ObjectPagedResult" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -11399,28 +11450,53 @@ } } }, - "/me/privatetasks/deletetags": { + "/filters/{filterId}/contributors": { "post": { "tags": [ - "TaskTags" + "Filters" + ], + "summary": "Adds explicit contributors to the specified filter.", + "description": "Adding filter contributors grants explicit access to the filter with the specified access levels.\r\n Existing explicit contributors are ignored and therefore not recreated.\r\n The filter creator cannot be added as an explicit contributor because ownership is handled implicitly.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", + "operationId": "PostFilterContributorsByFilterId", + "parameters": [ + { + "name": "filterId", + "in": "path", + "description": "The filter that should receive explicit contributors.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Removes a tag from all private tasks.", - "description": "Removes a tag from all private tasks of the current user.\r\n\r\nAny authenticated user.", - "operationId": "PostMePrivateTasksDeleteTags", "requestBody": { - "description": "The model to remove the tag from all private tasks.", + "description": "The contributor permissions to add.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteTagForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/ContributorPostForm" + } } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MinimalContributorModel" + } + } + } + } }, "400": { "description": "Bad Request", @@ -11441,41 +11517,13 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/me/privatetasks/tags": { - "get": { - "tags": [ - "TaskTags" - ], - "summary": "Returns all tags of the private tasks of the current user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMePrivateTasksTags", - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModelWithCount" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -11496,47 +11544,56 @@ } } }, - "/me/privatetasks/taskstatuses": { - "get": { + "/filters/{filterId}/contributors/{filterContributorId}": { + "delete": { "tags": [ - "PrivateTasks" + "Filters" ], - "summary": "Returns the task statuses for private tasks for the specified user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMyPrivateTaskStatuses", + "summary": "Removes an explicit contributor from the specified filter.", + "description": "Removing a filter contributor revokes that contributor's explicit access to the filter.\r\n The contributor entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", + "operationId": "DeleteFilterContributorByFilterIdAndFilterContributorId", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", + "name": "filterId", + "in": "path", + "description": "The filter that owns the contributor entry.", + "required": true, "schema": { "type": "string", "format": "uuid" } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "filterContributorId", + "in": "path", + "description": "The contributor entry to delete.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskStatus" - } + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -11555,33 +11612,57 @@ "x-access": { "any": "true" } - } - }, - "/me/privatetasks/updatetags": { - "post": { + }, + "put": { "tags": [ - "TaskTags" + "Filters" + ], + "summary": "Updates the access level of an explicit filter contributor.", + "description": "Updating a filter contributor changes that contributor's explicit access level for the filter.\r\n The contributor entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", + "operationId": "PutFilterContributorByFilterIdAndFilterContributorId", + "parameters": [ + { + "name": "filterId", + "in": "path", + "description": "The filter that owns the contributor entry.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "filterContributorId", + "in": "path", + "description": "The contributor entry to update.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Updates a tag for all private tasks.", - "description": "Updates a tag for all private tasks of the current user.\r\n\r\nAny authenticated user.", - "operationId": "PostMePrivateTasksUpdateTags", "requestBody": { - "description": "The model to update the tag including the old and new tag names.", + "description": "The new contributor permission payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TagUpdateForm" + "$ref": "#/components/schemas/ContributorForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "207": { - "description": "Multi-Status" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MinimalContributorModel" + } + } + } }, "400": { "description": "Bad Request", @@ -11592,6 +11673,26 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -11609,19 +11710,19 @@ } } }, - "/me/privatetasks/{taskId}": { - "get": { + "/filters/{filterId}/teams": { + "post": { "tags": [ - "PrivateTasks" + "Filters" ], - "summary": "Returns the private task with the specified id for the current user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetMePrivateTaskByTaskId", + "summary": "Adds explicit team permissions to the specified filter.", + "description": "Adding filter teams grants explicit access to the filter for all members of the specified teams.\r\n Existing explicit team permissions are ignored and therefore not recreated.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", + "operationId": "PostFilterTeamsByFilterId", "parameters": [ { - "name": "taskId", + "name": "filterId", "in": "path", - "description": "The id of the task.", + "description": "The filter that should receive explicit team permissions.", "required": true, "schema": { "type": "string", @@ -11629,13 +11730,40 @@ } } ], + "requestBody": { + "description": "The team permissions to add.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityToTeamPostForm" + } + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "type": "array", + "items": { + "$ref": "#/components/schemas/MinimalEntityToTeamModel" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -11676,28 +11804,29 @@ } } }, - "/me/privatetasks/{taskId}/checklistitems": { - "get": { + "/filters/{filterId}/teams/{filterToTeamId}": { + "delete": { "tags": [ - "ChecklistItems" + "Filters" ], - "summary": "Returns the checklist for a private task with the specified id.", - "description": "The user must be be assigned to the task.", - "operationId": "GetMyPrivateTaskChecklistItemsByUserIdAndTaskId", + "summary": "Removes an explicit team permission from the specified filter.", + "description": "Removing a filter team permission revokes that team's explicit access to the filter.\r\n The team permission entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", + "operationId": "DeleteFilterTeamByFilterIdAndFilterToTeamId", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", + "name": "filterId", + "in": "path", + "description": "The filter that owns the team permission entry.", + "required": true, "schema": { "type": "string", "format": "uuid" } }, { - "name": "taskId", + "name": "filterToTeamId", "in": "path", - "description": "The id of the task.", + "description": "The team permission entry to delete.", "required": true, "schema": { "type": "string", @@ -11706,18 +11835,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -11753,30 +11872,19 @@ "x-access": { "any": "true" } - } - }, - "/me/privatetasks/{taskId}/checklistitems/{checklistItemId}": { - "get": { + }, + "put": { "tags": [ - "ChecklistItems" + "Filters" ], - "summary": "Retrieves a checklist item from a private task.", - "description": "The user must be assigned to the task.", - "operationId": "GetMyPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", + "summary": "Updates the access level of an explicit team permission on the specified filter.", + "description": "Updating a filter team permission changes the explicit access level of the referenced team for the filter.\r\n The team permission entry must belong to the specified filter.\r\n \r\n The user must have at least `manage` permissions for the specified filter.", + "operationId": "PutFilterTeamByFilterIdAndFilterToTeamId", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", + "name": "filterId", "in": "path", - "description": "The id of the task.", + "description": "The filter that owns the team permission entry.", "required": true, "schema": { "type": "string", @@ -11784,9 +11892,9 @@ } }, { - "name": "checklistItemId", + "name": "filterToTeamId", "in": "path", - "description": "The id of the checklist item to retrieve.", + "description": "The team permission entry to update.", "required": true, "schema": { "type": "string", @@ -11794,13 +11902,34 @@ } } ], + "requestBody": { + "description": "The new team permission payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntityToTeamForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" + "$ref": "#/components/schemas/MinimalEntityToTeamModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -11841,38 +11970,21 @@ } } }, - "/me/projecttasks": { + "/invitations": { "get": { "tags": [ - "ProjectTasks" - ], - "summary": "Returns all project tasks that the current user can see.", - "description": "The user must have `project-planning-data:read` permissions, otherwise only assigned tasks will be returned.", - "operationId": "GetMeProjectTasks", - "parameters": [ - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } + "Invitations" ], + "summary": "Prevents GET requests to the invitations route from throwing errors.", + "description": "\r\n\r\nAllows unauthenticated access.", + "operationId": "GetInvitations", "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -11889,42 +12001,74 @@ "v1" ], "x-access": { - "any": "true" + "anonymous": "true" } } }, - "/me/shareddocuments": { - "get": { + "/invitations/accept": { + "post": { "tags": [ - "Documents" + "Invitations" ], - "summary": "Returns all documents that were shared with the requesting user.", - "description": "Returns documents where the user has been explicitly granted document-level permissions\r\n (direct user permissions, team permissions, or workspace permissions on the document).\r\n Excludes the user's own private documents.\r\n Note: Also includes documents the user can access through their project or space memberships.\r\n\r\nAny authenticated user.", - "operationId": "GetMeSharedDocuments", - "parameters": [ - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, + "summary": "Accepts the invitation with the invitation code.", + "operationId": "Accept", + "requestBody": { + "description": "The invitation code received when creating the invitation.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AcceptInvitation" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/AcceptInvitation" + } + } + } + }, + "responses": { + "200": { + "description": "OK" + } + }, + "security": [ { - "$ref": "#/components/parameters/filterby" + "oauth2": [ + "full_access" + ] } ], + "x-api-versions": [ + "v1" + ] + } + }, + "/me": { + "get": { + "tags": [ + "Users" + ], + "summary": "Returns the currently logged-in user and workspace.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMe", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DocumentModel" - } + "$ref": "#/components/schemas/UserAndWorkspace" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -11945,14 +12089,14 @@ } } }, - "/me/sharedfilters": { + "/me/allavailabletasks": { "get": { "tags": [ - "Filters" + "AssignedTasks" ], - "summary": "Returns filters explicitly shared with the current user.", - "description": "Returns filters where the requesting user has been granted explicit access through user permissions,\r\n team permissions, or workspace-wide filter permissions.\r\n Excludes filters owned by the requesting user.\r\n\r\nAny authenticated user.", - "operationId": "GetMeSharedFilters", + "summary": "Returns all tasks the current user is allowed to see.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMeAllAvailableTasks", "parameters": [ { "$ref": "#/components/parameters/page" @@ -11975,21 +12119,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/TaskModel" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -12007,22 +12141,40 @@ } } }, - "/me/sharedfilters/{entityType}": { + "/me/assignedtasks": { "get": { "tags": [ - "Filters" + "AssignedTasks" ], - "summary": "Returns filters explicitly shared with the current user for the specified user type.", - "description": "Returns filters where the requesting user has been granted explicit access through user permissions,\r\n team permissions, or workspace-wide filter permissions and that match the requested user type.\r\n Excludes filters owned by the requesting user.\r\n\r\nAny authenticated user.", - "operationId": "GetMeSharedFiltersByUserType", + "summary": "Returns all tasks assigned to the current user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMeAssignedTasks", "parameters": [ { - "name": "entityType", - "in": "path", - "description": "The entity type route value.", - "required": true, + "name": "inProgress", + "in": "query", + "description": "Whether to return only assigned project tasks of running projects. Defaults to true.", "schema": { - "type": "string" + "type": "boolean", + "default": false + } + }, + { + "name": "assignedOnFrom", + "in": "query", + "description": "The start date for filtering by assignment date. If set, tasks are returned only when the assignment date is greater or equal than this value.", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "assignedOnTo", + "in": "query", + "description": "The end date for filtering by assignment date. If set, tasks are returned only when the assignment date is less or equal than this value.", + "schema": { + "type": "string", + "format": "date-time" } }, { @@ -12046,14 +12198,14 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Filter" + "$ref": "#/components/schemas/TaskModel" } } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -12078,57 +12230,20 @@ } } }, - "/me/tasks/tags": { + "/me/assignedtasks/{taskId}": { "get": { "tags": [ "AssignedTasks" ], - "summary": "Returns all task tags the current user is allowed to see.", - "description": "The tags can be filtered by the properties of the task model.\r\n\r\nAny authenticated user.", - "operationId": "GetMeTasksTags", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/me/timeentries/last": { - "get": { - "tags": [ - "TimeEntries" - ], - "summary": "Returns the last time entry of a specified user.", - "description": "The last time entry is always the last one that was started.\r\n Time entries which are started in the future are ignored.\r\n If a time entry does not have a start time, 12.00 am is automatically assumed as the start time\r\n for comparison with other time entries from the same day.\r\n\r\nThe user must be an admin or the creator.", - "operationId": "GetMyLastTimeEntries", + "summary": "Returns the assigned task with the specified id of the current user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMeAssignedTaskByTaskId", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", + "name": "taskId", + "in": "path", + "description": "The id of the task to return.", + "required": true, "schema": { "type": "string", "format": "uuid" @@ -12141,63 +12256,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/TaskModel" } } } }, - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "owner": "true" - } - } - }, - "/me/timetracking/pause": { - "post": { - "tags": [ - "TimeTracking" - ], - "summary": "Pauses a running time tracking for a user.", - "description": "If there is already a paused time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", - "operationId": "PostPauseMyTimeTracking", - "parameters": [ - { - "name": "userId", - "in": "query", - "description": "The id of the user.", - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/ErrorResponse" } } } - }, - "204": { - "description": "No Content" } }, "security": [ @@ -12211,26 +12283,26 @@ "v1" ], "x-access": { - "owner": "true" + "any": "true" } } }, - "/me/timetracking/resume": { - "post": { + "/me/dashboards": { + "get": { "tags": [ - "TimeTracking" + "Dashboards" ], - "summary": "Resumes a paused time tracking for a user.", - "description": "If there is already a running time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", - "operationId": "PostResumeMyTimeTracking", + "summary": "Returns the dashboards of the current user.", + "description": "Returns the dashboards of the current user.\r\n\r\nThe user must be the creator.", + "operationId": "GetMeDashboards", "parameters": [ { - "name": "userId", + "name": "includeWidgets", "in": "query", - "description": "The id of the user.", + "description": "Include widgets.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } } ], @@ -12240,13 +12312,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "type": "array", + "items": { + "$ref": "#/components/schemas/Dashboard" + } } } } - }, - "204": { - "description": "No Content" } }, "security": [ @@ -12264,131 +12336,28 @@ } } }, - "/me/timetracking/start": { - "post": { + "/me/filters": { + "get": { "tags": [ - "TimeTracking" + "Filters" ], - "summary": "Starts a new time tracking for a user.", - "description": "If there is already a running/paused time tracking it will be stopped automatically in order to start the new one.\r\n\r\nThe user must be an admin or the creator.", - "operationId": "PostStartMyTimeTracking", + "summary": "Returns the filters created by the current user.", + "description": "Returns filters that were created by and are owned by the requesting user.\r\n Shared filters are excluded, even if the requesting user also has explicit access through contributor, team, or workspace permissions.\r\n\r\nAny authenticated user.", + "operationId": "GetMeFilters", "parameters": [ { - "name": "userId", - "in": "query", - "description": "The id of the user.", - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "The model describing the time tracking to start.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StartTimeTrackingForm" - } - } + "$ref": "#/components/parameters/page" }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeTracking" - } - } - } - } - }, - "security": [ { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "owner": "true" - } - } - }, - "/me/timetracking/stop": { - "post": { - "tags": [ - "TimeTracking" - ], - "summary": "Stops the currently running time tracking of the specified user.", - "description": "The request body is optional. You can provide a stopReason to indicate how the tracking was stopped.\r\n For external API clients, the stopReason is automatically set to \"external-api\" regardless of what is provided.\r\n For this operation to work there must be a running time tracking for the user.\r\n\r\nThe user must be an admin or the creator.", - "operationId": "PostStopMyTimeTracking", - "parameters": [ + "$ref": "#/components/parameters/pageSize" + }, { - "name": "userId", - "in": "query", - "description": "The id of the user.", - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StopTimeTrackingForm" - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeTracking" - } - } - } + "$ref": "#/components/parameters/orderby" }, - "204": { - "description": "No Content" - } - }, - "security": [ { - "oauth2": [ - "full_access" - ] + "$ref": "#/components/parameters/filterby" } ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "owner": "true" - } - } - }, - "/permissions/features": { - "get": { - "tags": [ - "Permissions" - ], - "summary": "Returns all available features.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetPermissionsFeatures", "responses": { "200": { "description": "OK", @@ -12397,53 +12366,19 @@ "schema": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/Filter" } - }, - "example": [ - "https://www.awork.com" - ] + } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/permissions/projectfeatures": { - "get": { - "tags": [ - "Permissions" - ], - "summary": "Returns all available project features.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetPermissionsProjectFeatures", - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "example": [ - "https://www.awork.com" - ] + "$ref": "#/components/schemas/ErrorResponse" + } } } } @@ -12463,15 +12398,24 @@ } } }, - "/projectmilestones": { + "/me/filters/{entityType}": { "get": { "tags": [ - "ProjectMilestones" + "Filters" ], - "summary": "Retrieves all project milestones.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectMilestones", + "summary": "Returns the filters created by the current user for the specified user type.", + "description": "Returns filters that were created by and are owned by the requesting user and match the requested user type.\r\n Shared filters are excluded, even if the requesting user also has explicit access through contributor, team, or workspace permissions.\r\n\r\nAny authenticated user.", + "operationId": "GetMeFiltersByUserType", "parameters": [ + { + "name": "entityType", + "in": "path", + "description": "The entity type route value.", + "required": true, + "schema": { + "type": "string" + } + }, { "$ref": "#/components/parameters/page" }, @@ -12493,11 +12437,21 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ProjectMilestone" + "$ref": "#/components/schemas/Filter" } } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -12516,17 +12470,28 @@ }, "post": { "tags": [ - "ProjectMilestones" + "Filters" + ], + "summary": "Creates a persisted filter definition for the specified user type.", + "description": "Creates a new filter owned by the current user.\r\n\r\nAny authenticated user.", + "operationId": "PostMeFilterByUserType", + "parameters": [ + { + "name": "entityType", + "in": "path", + "description": "Route segment identifying the entity type (tasks, projects, companies, users).", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Creates a new project milestone.", - "description": "The user must either be admin, have 'project-planning-data:write' permissions on the project or be the creator.", - "operationId": "PostProjectMilestone", "requestBody": { - "description": "The model containing milestone details.", + "description": "The filter definition payload supplied by the caller.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestonePostForm" + "$ref": "#/components/schemas/FilterForm" } } }, @@ -12538,7 +12503,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestone" + "$ref": "#/components/schemas/Filter" } } } @@ -12552,6 +12517,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -12569,39 +12544,49 @@ } } }, - "/projectmilestones/{milestoneId}": { - "get": { + "/me/filters/{entityType}/fromquery": { + "post": { "tags": [ - "ProjectMilestones" + "Filters" ], - "summary": "Returns the specified project milestone.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectMilestoneByMilestoneId", + "summary": "Creates a persisted filter from an OData query string.\n Convenience endpoint for external API consumers who want to create filters using familiar OData syntax.", + "description": "Creates a filter from an OData filterby query string.\r\n\r\nAny authenticated user.", + "operationId": "PostMeFilterFromQueryByUserType", "parameters": [ { - "name": "milestoneId", + "name": "entityType", "in": "path", - "description": "The id of the milestone.", + "description": "Route segment identifying the entity type (tasks, projects, companies, users).", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], + "requestBody": { + "description": "The filter query payload containing the filter name, sharing settings, and query string.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterFromQueryForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestone" + "$ref": "#/components/schemas/Filter" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -12636,19 +12621,19 @@ } } }, - "/projectmilestones/{projectMilestoneId}": { + "/me/filters/{filterId}": { "delete": { "tags": [ - "ProjectMilestones" + "Filters" ], - "summary": "Deletes a project milestone.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectMilestoneById", + "summary": "Deletes a filter.", + "description": "Deletes the filter when the current user has manage access.\r\n\r\nAny authenticated user.", + "operationId": "DeleteMeFilterById", "parameters": [ { - "name": "projectMilestoneId", + "name": "filterId", "in": "path", - "description": "The id of the project milestone to delete.", + "description": "Identifier of the filter to delete.", "required": true, "schema": { "type": "string", @@ -12660,8 +12645,8 @@ "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -12695,18 +12680,18 @@ "any": "true" } }, - "put": { + "get": { "tags": [ - "ProjectMilestones" + "Filters" ], - "summary": "Updates an existing project milestone.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutProjectMilestoneById", + "summary": "Returns a single filter by its identifier for the current user.", + "description": "Returns the filter if the current user has read access.\r\n\r\nAny authenticated user.", + "operationId": "GetMeFilterById", "parameters": [ { - "name": "projectMilestoneId", + "name": "filterId", "in": "path", - "description": "The id of the project milestone.", + "description": "The filter identifier.", "required": true, "schema": { "type": "string", @@ -12714,30 +12699,19 @@ } } ], - "requestBody": { - "description": "The model containing milestone details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectMilestonePutForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestone" + "$ref": "#/components/schemas/Filter" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -12770,49 +12744,74 @@ "x-access": { "any": "true" } - } - }, - "/projectroles": { - "get": { + }, + "put": { "tags": [ - "ProjectRoles" + "Filters" ], - "summary": "Returns all project roles.", + "summary": "Updates an existing filter definition.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectRoles", + "operationId": "PutMeFilterById", "parameters": [ { - "name": "includeMembers", - "in": "query", - "description": "Whether to include the members of each project role in the response.", + "name": "filterId", + "in": "path", + "description": "Identifier of the filter to update.", + "required": true, "schema": { - "type": "boolean", - "default": true + "type": "string", + "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "description": "The updated filter definition supplied by the caller.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectRole" - } + "$ref": "#/components/schemas/Filter" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12831,32 +12830,35 @@ "x-access": { "any": "true" } - }, + } + }, + "/me/filters/{filterId}/copy": { "post": { "tags": [ - "ProjectRoles" + "Filters" ], - "summary": "Creates a new project role.", - "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostProjectRole", - "requestBody": { - "description": "The model to create the project role.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectRoleForm" - } + "summary": "Creates a copy of an existing filter.", + "description": "Copies the filter definition and query.\r\n The copied filter will be owned only by the requesting user.\r\n The name of the copied filter will be \"{original name} (Copy)\" or \"{original name} (Kopie)\" for German users.\r\n\r\nAny authenticated user.", + "operationId": "PostMeFilterCopyByFilterId", + "parameters": [ + { + "name": "filterId", + "in": "path", + "description": "The identifier of the filter to copy.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectRole" + "$ref": "#/components/schemas/Filter" } } } @@ -12870,6 +12872,26 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -12883,32 +12905,37 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" - }, - "x-subscriptionlevel": { - "minimumPlan": "standard" + "any": "true" } } }, - "/projectroles/byuserid/{userId}": { + "/me/filters/{filterId}/{entityType}": { "get": { "tags": [ - "ProjectRoles" + "Filters" ], - "summary": "Returns all project roles assigned to the specified user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectRolesByUserIdByUserId", + "summary": "Evaluates a filter by applying it to the specified target user type and returning the filtered results.\n Supports standard paging, ordering, and additional query constraints from query parameters.", + "description": "Retrieves and evaluates a saved filter to return matching entities.\r\n\r\nAny authenticated user.", + "operationId": "GetMeFilterByFilterIdAndUserType", "parameters": [ { - "name": "userId", + "name": "filterId", "in": "path", - "description": "The id of the user.", + "description": "The identifier of the filter to evaluate.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "entityType", + "in": "path", + "description": "The entity type name (tasks, projects, companies, users).", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -12917,10 +12944,27 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectRole" - } + "$ref": "#/components/schemas/ObjectPagedResult" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12951,24 +12995,26 @@ } } }, - "/projectroles/{projectRoleId}": { + "/me/otherprivatetasks": { "get": { "tags": [ - "ProjectRoles" + "PrivateTasks" ], - "summary": "Returns a project role by its id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectRoleById", + "summary": "Returns all private tasks that the current user created and assigned to someone else.", + "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns all private tasks that were originally created by the user but were reassigned to someone else.\r\n\r\nAny authenticated user.", + "operationId": "GetMeOtherPrivateTasks", "parameters": [ { - "name": "projectRoleId", - "in": "path", - "description": "The id of the project role.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -12977,7 +13023,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectRole" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskModel" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -13006,19 +13065,21 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/me/otherprivatetasks/{taskId}": { + "get": { "tags": [ - "ProjectRoles" + "PrivateTasks" ], - "summary": "Updates an existing project role.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PutProjectRoleById", + "summary": "Returns a private task that the current user created and assigned to someone else.", + "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns a private task that was originally created by the user but was reassigned to someone else.\r\n\r\nAny authenticated user.", + "operationId": "GetMeOtherPrivateTaskByTaskId", "parameters": [ { - "name": "projectRoleId", + "name": "taskId", "in": "path", - "description": "The id of the project role.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -13026,30 +13087,19 @@ } } ], - "requestBody": { - "description": "The model to update the project role.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectRoleForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectRole" + "$ref": "#/components/schemas/TaskModel" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -13080,24 +13130,32 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/projectroles/{projectRoleId}/delete": { - "post": { + "/me/otherprivatetasks/{taskId}/checklistitems": { + "get": { "tags": [ - "ProjectRoles" + "ChecklistItems" ], - "summary": "Deletes a project role and migrates its members to a new role.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostProjectRoleDeleteByProjectRoleId", + "summary": "Returns the checklist items for a private task with the specified id.", + "description": "The user must be the creator of the task.", + "operationId": "GetMyOtherPrivateTaskChecklistItemsByUserIdAndTaskId", "parameters": [ { - "name": "projectRoleId", + "name": "userId", + "in": "query", + "description": "The id of the user.", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", "in": "path", - "description": "The id of the project role.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -13105,23 +13163,22 @@ } } ], - "requestBody": { - "description": "The model to delete the project role.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectRoleDeleteForm" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "OK" + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChecklistItem" + } + } + } + } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -13152,41 +13209,47 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/projectroles/{projectRoleId}/permissions": { + "/me/otherprivatetasks/{taskId}/checklistitems/{checklistItemId}": { "get": { "tags": [ - "ProjectRoles" + "ChecklistItems" ], - "summary": "Returns all permissions assigned to a project role.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectRolePermissionsByProjectRoleId", + "summary": "Returns a checklist item for a private task with the specified id.", + "description": "The user must be the creator of the task.", + "operationId": "GetMyOtherPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", "parameters": [ { - "name": "projectRoleId", - "in": "path", - "description": "The id of the project role.", - "required": true, + "name": "userId", + "in": "query", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, { - "$ref": "#/components/parameters/filterby" + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -13195,10 +13258,17 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PermissionOfProjectRole" - } + "$ref": "#/components/schemas/ChecklistItem" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -13227,44 +13297,23 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/me/permissions": { + "get": { "tags": [ - "ProjectRoles" - ], - "summary": "Creates or updates a permission for a project role.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectRolePermissionsByProjectRoleId", - "parameters": [ - { - "name": "projectRoleId", - "in": "path", - "description": "The id of the project role.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Permissions" ], - "requestBody": { - "description": "The model to create or update the project role permission.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PermissionOfProjectRoleForm" - } - } - }, - "required": true - }, + "summary": "Returns the permissions of the currently logged-in user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMePermissions", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PermissionOfProjectRole" + "$ref": "#/components/schemas/UserPermissionInfoExternal" } } } @@ -13278,16 +13327,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -13301,19 +13340,18 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projects": { + "/me/privatedocuments": { "get": { "tags": [ - "Projects" + "Documents" ], - "summary": "Returns all projects.", - "description": "Returns all projects the user has `read` permissions for.", - "operationId": "GetProjects", + "summary": "Returns the requesting user's private documents.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMePrivateDocuments", "parameters": [ { "$ref": "#/components/parameters/page" @@ -13336,7 +13374,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/DocumentModel" } } } @@ -13356,42 +13394,40 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/me/privatedocuments/trash": { + "get": { "tags": [ - "Projects" + "Documents" ], - "summary": "Creates a new project.", - "description": "Creates a new project.\r\n\r\nThe user must be an admin or have `project-create:write` permissions.", - "operationId": "PostProject", - "requestBody": { - "description": "The model to create the project.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExtendedProjectForm" - } - } + "summary": "Returns the requesting user's private trashed documents.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMePrivateDocumentsTrash", + "parameters": [ + { + "$ref": "#/components/parameters/page" }, - "required": true - }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentModel" + } } } } @@ -13408,54 +13444,48 @@ "v1" ], "x-access": { - "admin": "true", - "project-create": "write" + "any": "true" } } }, - "/projects/batch/{operation}": { - "post": { + "/me/privatetasks": { + "get": { "tags": [ - "Projects" + "PrivateTasks" ], - "summary": "Edits multiple projects using the specified operation.", - "description": "Returns MultiStatus including the list of successful and failed projects.\r\n \r\n Supported operations:\r\n
    \r\n
  • changeprojectstatus: changes the status of all selected projects.
  • \r\n
  • changeprojecttype: changes the type of all selected projects.
  • \r\n
  • linkworkflow: links a workflow to all selected projects.
  • \r\n
  • setclient: sets the client for all selected projects.
  • \r\n
  • setprojectlead: changes the responsible project member for all selected projects.
  • \r\n
  • addteams: adds teams to all selected projects.
  • \r\n
  • removeteams: removes teams from all selected projects.
  • \r\n
  • setdates: sets or removes project start and due dates.
  • \r\n
  • adjustdates: offsets project start and due dates by the specified amount of days.
  • \r\n
  • addtags: adds tags to all selected projects.
  • \r\n
  • removetags: removes tags from all selected projects.
  • \r\n
  • delete: deletes all selected projects.
  • \r\n
The user must have `write` permissions on all projects as well as related entities modified by the operation.", - "operationId": "PostProjectsBatchByOperation", + "summary": "Returns all private tasks of the current user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMePrivateTasks", "parameters": [ { - "name": "operation", - "in": "path", - "description": "Batch operation route key.", - "required": true, - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "Validated request body for the selected operation.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectBatchOperationForm" - } - } - }, - "required": true - }, "responses": { - "207": { - "description": "Multi-Status", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MultiStatusResult" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskModel" + } } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -13464,8 +13494,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -13490,16 +13520,16 @@ } } }, - "/projects/deletetags": { + "/me/privatetasks/deletetags": { "post": { "tags": [ - "ProjectTags" + "TaskTags" ], - "summary": "Removes a tag from all projects.", - "description": "\r\n\r\nThe user must be an admin or have `project-master-data:write` permissions.", - "operationId": "PostProjectsDeleteTags", + "summary": "Removes a tag from all private tasks.", + "description": "Removes a tag from all private tasks of the current user.\r\n\r\nAny authenticated user.", + "operationId": "PostMePrivateTasksDeleteTags", "requestBody": { - "description": "The model to remove the tag from all projects.", + "description": "The model to remove the tag from all private tasks.", "content": { "application/json": { "schema": { @@ -13545,67 +13575,28 @@ "v1" ], "x-access": { - "admin": "true", - "project-master-data": "write" + "any": "true" } } }, - "/projects/key/{projectKey}": { + "/me/privatetasks/tags": { "get": { "tags": [ - "Projects" + "TaskTags" ], - "summary": "Returns the project with the specified key.", + "summary": "Returns all tags of the private tasks of the current user.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectsKeyByProjectKey", - "parameters": [ - { - "name": "projectKey", - "in": "path", - "description": "The project key to lookup.", - "required": true, - "schema": { - "type": "string" - } - } - ], + "operationId": "GetMePrivateTasksTags", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModelWithCount" + } } } } @@ -13626,23 +13617,35 @@ } } }, - "/projects/projecttasks/tags": { + "/me/privatetasks/taskstatuses": { "get": { "tags": [ - "ProjectTasks" + "PrivateTasks" ], - "summary": "Returns all tags of the project tasks.", + "summary": "Returns the task statuses for private tasks for the specified user.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectsProjectTasksTags", + "operationId": "GetMyPrivateTaskStatuses", "parameters": [ { - "name": "projectId", + "name": "userId", "in": "query", - "description": "The id of the project to filter tags by. Returns tags of all projects if not provided.", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -13653,7 +13656,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/TaskStatus" } } } @@ -13675,28 +13678,32 @@ } } }, - "/projects/tags": { - "get": { + "/me/privatetasks/updatetags": { + "post": { "tags": [ - "ProjectTags" + "TaskTags" ], - "summary": "Returns all tags currently in use by projects.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectsTags", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModelWithCount" - } - } + "summary": "Updates a tag for all private tasks.", + "description": "Updates a tag for all private tasks of the current user.\r\n\r\nAny authenticated user.", + "operationId": "PostMePrivateTasksUpdateTags", + "requestBody": { + "description": "The model to update the tag including the old and new tag names.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TagUpdateForm" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "207": { + "description": "Multi-Status" + }, "400": { "description": "Bad Request", "content": { @@ -13706,16 +13713,6 @@ } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -13733,35 +13730,33 @@ } } }, - "/projects/updatetags": { - "post": { + "/me/privatetasks/{taskId}": { + "get": { "tags": [ - "ProjectTags" + "PrivateTasks" ], - "summary": "Updates a tag globally for all projects.", - "description": "\r\n\r\nThe user must be an admin or have `project-master-data:write` permissions.", - "operationId": "PostProjectsUpdateTags", - "requestBody": { - "description": "The model containing the tag updates.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TagUpdateForm" - } + "summary": "Returns the private task with the specified id for the current user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetMePrivateTaskByTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskModel" } } } @@ -13775,6 +13770,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -13788,24 +13793,32 @@ "v1" ], "x-access": { - "admin": "true", - "project-master-data": "write" + "any": "true" } } }, - "/projects/{projectId}": { + "/me/privatetasks/{taskId}/checklistitems": { "get": { "tags": [ - "Projects" + "ChecklistItems" ], - "summary": "Returns the project with the specified id.", - "description": "The user must either be admin, have `project-master-data:read` permissions or be the creator of the project.", - "operationId": "GetProjectById", + "summary": "Returns the checklist for a private task with the specified id.", + "description": "The user must be be assigned to the task.", + "operationId": "GetMyPrivateTaskChecklistItemsByUserIdAndTaskId", "parameters": [ { - "name": "projectId", + "name": "userId", + "in": "query", + "description": "The id of the user.", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", "in": "path", - "description": "The id of the project.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -13819,7 +13832,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" + "type": "array", + "items": { + "$ref": "#/components/schemas/ChecklistItem" + } } } } @@ -13858,19 +13874,40 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/me/privatetasks/{taskId}/checklistitems/{checklistItemId}": { + "get": { "tags": [ - "Projects" + "ChecklistItems" ], - "summary": "Updates the project with the specified id.", - "description": "Updates the project with the specified id.\r\n Special handling for retainer projects:\r\n If the project has at least one Retainer, the IsRetainer flag is automatically set to true.\r\n For retainer projects, the TimeBudget cannot be set. Instead the TimeBudget is the sum of all retainer budgets.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", - "operationId": "PutProjectById", + "summary": "Retrieves a checklist item from a private task.", + "description": "The user must be assigned to the task.", + "operationId": "GetMyPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", "parameters": [ { - "name": "projectId", + "name": "userId", + "in": "query", + "description": "The id of the user.", + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", "in": "path", - "description": "The id of the project.", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item to retrieve.", "required": true, "schema": { "type": "string", @@ -13878,34 +13915,13 @@ } } ], - "requestBody": { - "description": "The model containing the new project details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectPutForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ChecklistItem" } } } @@ -13946,25 +13962,15 @@ } } }, - "/projects/{projectId}/activities": { + "/me/projecttasks": { "get": { "tags": [ - "Project Activities" + "ProjectTasks" ], - "summary": "Returns all activities of the project with the specified id.", - "description": "The activities contain information about the type of the activity, which property was changed and by whom.\r\n This contains changes to first-level properties of the project, like name, description, status, etc., as well as several related entities, such as tags, assignments, etc.\r\n This does not include activities of sub-entities, like tasks of a project or comments on a task.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectActivities", + "summary": "Returns all project tasks that the current user can see.", + "description": "The user must have `project-planning-data:read` permissions, otherwise only assigned tasks will be returned.", + "operationId": "GetMeProjectTasks", "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, { "$ref": "#/components/parameters/page" }, @@ -13986,41 +13992,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ActivityModel" + "$ref": "#/components/schemas/TaskModel" } } } } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -14038,44 +14014,38 @@ } } }, - "/projects/{projectId}/addprojectmember": { - "post": { + "/me/shareddocuments": { + "get": { "tags": [ - "ProjectMembers" + "Documents" ], - "summary": "Adds a project member to the project with the specified id.", - "description": "Adds a project member to the project with the specified id.\r\n The new project member can also be set as a responsible project member, but only if no other member of this project is responsible.\r\n It is necessary that the project role is available in this project, otherwise the member cannot be added.\r\n A project role is available when they are connected to the specified project type of the project.\r\n A user can only be added to the project once.\r\n \r\n The user has to be the creator or needs `project-master-data:manage` permissions on the project.", - "operationId": "PostProjectAddProjectMemberByProjectId", + "summary": "Returns all documents that were shared with the requesting user.", + "description": "Returns documents where the user has been explicitly granted document-level permissions\r\n (direct user permissions, team permissions, or workspace permissions on the document).\r\n Excludes the user's own private documents.\r\n Note: Also includes documents the user can access through their project or space memberships.\r\n\r\nAny authenticated user.", + "operationId": "GetMeSharedDocuments", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model containing project member details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectMemberForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMember" + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentModel" + } } } } @@ -14096,40 +14066,28 @@ } } }, - "/projects/{projectId}/addtags": { - "post": { + "/me/sharedfilters": { + "get": { "tags": [ - "ProjectTags" + "Filters" ], - "summary": "Adds a batch of tags to the project with the specified id.", - "description": "To add tags to a project the user must have `project-master-data:write` permissions on the specified project.", - "operationId": "PostProjectAddTagsByProjectId", + "summary": "Returns filters explicitly shared with the current user.", + "description": "Returns filters where the requesting user has been granted explicit access through user permissions,\r\n team permissions, or workspace-wide filter permissions.\r\n Excludes filters owned by the requesting user.\r\n\r\nAny authenticated user.", + "operationId": "GetMeSharedFilters", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project to add tags for.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model containing the tags to add.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagForm" - } - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -14138,32 +14096,12 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/Filter" } } } } }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -14190,57 +14128,47 @@ } } }, - "/projects/{projectId}/addtaskbundle": { - "post": { + "/me/sharedfilters/{entityType}": { + "get": { "tags": [ - "TaskBundles" + "Filters" ], - "summary": "Adds a task bundle to a project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectAddTaskBundleByProjectId", + "summary": "Returns filters explicitly shared with the current user for the specified user type.", + "description": "Returns filters where the requesting user has been granted explicit access through user permissions,\r\n team permissions, or workspace-wide filter permissions and that match the requested user type.\r\n Excludes filters owned by the requesting user.\r\n\r\nAny authenticated user.", + "operationId": "GetMeSharedFiltersByUserType", "parameters": [ { - "name": "projectId", + "name": "entityType", "in": "path", - "description": "The id of the project.", + "description": "The entity type route value.", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "The add Task Bundle form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddTaskBundleForm" - } + "type": "string" } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + { + "$ref": "#/components/parameters/page" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + { + "$ref": "#/components/parameters/pageSize" }, - "401": { - "description": "Unauthorized", + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/Filter" + } } } } @@ -14271,38 +14199,14 @@ } } }, - "/projects/{projectId}/allfiles": { + "/me/tasks/tags": { "get": { "tags": [ - "ProjectFiles" - ], - "summary": "Returns all files of the project with the specified id.", - "description": "Returns all files of the project including the ones of tasks linked to that project, with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetAllProjectFiles", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the entity.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } + "AssignedTasks" ], + "summary": "Returns all task tags the current user is allowed to see.", + "description": "The tags can be filtered by the properties of the task model.\r\n\r\nAny authenticated user.", + "operationId": "GetMeTasksTags", "responses": { "200": { "description": "OK", @@ -14311,7 +14215,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/BaseTagModel" } } } @@ -14333,20 +14237,19 @@ } } }, - "/projects/{projectId}/automations": { + "/me/timeentries/last": { "get": { "tags": [ - "Project Automations" + "TimeEntries" ], - "summary": "Returns all automations of the specified project.", - "description": "The user must be owner of the project or must have `project-master-data:read` permissions on the specified project.", - "operationId": "GetProjectAutomations", + "summary": "Returns the last time entry of a specified user.", + "description": "The last time entry is always the last one that was started.\r\n Time entries which are started in the future are ignored.\r\n If a time entry does not have a start time, 12.00 am is automatically assumed as the start time\r\n for comparison with other time entries from the same day.\r\n\r\nThe user must be an admin or the creator.", + "operationId": "GetMyLastTimeEntries", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, + "name": "userId", + "in": "query", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" @@ -14359,13 +14262,13 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Automation" - } + "$ref": "#/components/schemas/TimeTracking" } } } + }, + "204": { + "description": "No Content" } }, "security": [ @@ -14379,59 +14282,43 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "owner": "true" } - }, + } + }, + "/me/timetracking/pause": { "post": { "tags": [ - "Project Automations" + "TimeTracking" ], - "summary": "Creates a new automation for the specified project.", - "description": "Creates a new automation for the project with the specified id.\r\n The user needs to be the owner of the project or have 'write' permissions of\r\n the feature 'project-master-data' globally or in the project.\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectAutomation", + "summary": "Pauses a running time tracking for a user.", + "description": "If there is already a paused time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", + "operationId": "PostPauseMyTimeTracking", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, + "name": "userId", + "in": "query", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" } } ], - "requestBody": { - "description": "The model to create the automation.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationTriggerForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/TimeTracking" } } } }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -14445,37 +14332,23 @@ "v1" ], "x-access": { - "any": "true" - }, - "x-subscriptionlevel": { - "minimumPlan": "standard" + "owner": "true" } } }, - "/projects/{projectId}/automations/{automationId}": { - "delete": { + "/me/timetracking/resume": { + "post": { "tags": [ - "Project Automations" + "TimeTracking" ], - "summary": "Deletes the specified automation for a given project.", - "description": "Deletes the specified automation for a given project.\r\n Also deletes all actions connected to the automation.\r\n The user needs to be the owner of the project or have 'write' permissions of\r\n the feature 'project-master-data' globally or in the project.\r\n Automations created from a workflow cannot be deleted via this endpoint.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectAutomation", + "summary": "Resumes a paused time tracking for a user.", + "description": "If there is already a running time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", + "operationId": "PostResumeMyTimeTracking", "parameters": [ { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, + "name": "userId", + "in": "query", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" @@ -14483,18 +14356,18 @@ } ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TimeTracking" } } } + }, + "204": { + "description": "No Content" } }, "security": [ @@ -14508,45 +14381,47 @@ "v1" ], "x-access": { - "any": "true" + "owner": "true" } - }, - "get": { + } + }, + "/me/timetracking/start": { + "post": { "tags": [ - "Project Automations" + "TimeTracking" ], - "summary": "Returns a specific automation from a project.", - "description": "Returns a specific automation of the project with the specified id.\r\n Returns NotFound if the automation doesnt exist.\r\n To get the the automation data the user needs to be the owner of the project or\r\n have 'read' permissions of the feature 'project-master-data' globally or in his project role.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectAutomation", + "summary": "Starts a new time tracking for a user.", + "description": "If there is already a running/paused time tracking it will be stopped automatically in order to start the new one.\r\n\r\nThe user must be an admin or the creator.", + "operationId": "PostStartMyTimeTracking", "parameters": [ { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, + "name": "userId", + "in": "query", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" } } ], + "requestBody": { + "description": "The model describing the time tracking to start.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StartTimeTrackingForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/TimeTracking" } } } @@ -14563,32 +14438,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "owner": "true" } - }, - "put": { + } + }, + "/me/timetracking/stop": { + "post": { "tags": [ - "Project Automations" + "TimeTracking" ], - "summary": "Updates the automation with the specified id.", - "description": "Updates the automation with the specified id.\r\n The user needs to be the owner of the project or have 'write' permissions of\r\n the feature 'project-master-data' globally or in the project.\r\n If the automation was created from a workflow, only the Enabled flag can be changed.\r\n\r\nAny authenticated user.", - "operationId": "PutProjectAutomation", + "summary": "Stops the currently running time tracking of the specified user.", + "description": "The request body is optional. You can provide a stopReason to indicate how the tracking was stopped.\r\n For external API clients, the stopReason is automatically set to \"external-api\" regardless of what is provided.\r\n For this operation to work there must be a running time tracking for the user.\r\n\r\nThe user must be an admin or the creator.", + "operationId": "PostStopMyTimeTracking", "parameters": [ { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, + "name": "userId", + "in": "query", + "description": "The id of the user.", "schema": { "type": "string", "format": "uuid" @@ -14596,15 +14463,13 @@ } ], "requestBody": { - "description": "The model to update the automation.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutomationPutForm" + "$ref": "#/components/schemas/StopTimeTrackingForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -14612,18 +14477,53 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/TimeTracking" } } } }, - "400": { - "description": "Bad Request", + "204": { + "description": "No Content" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "owner": "true" + } + } + }, + "/permissions/features": { + "get": { + "tags": [ + "Permissions" + ], + "summary": "Returns all available features.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetPermissionsFeatures", + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + "type": "array", + "items": { + "type": "string" + } + }, + "example": [ + "https://www.awork.com" + ] } } } @@ -14643,34 +14543,67 @@ } } }, - "/projects/{projectId}/automations/{automationId}/actions": { + "/permissions/projectfeatures": { "get": { "tags": [ - "Project Automations" + "Permissions" ], - "summary": "Gets the actions of a project automation.", - "description": "Gets all actions including their values of an automation.\r\n The user must be owner of the project or must have `project-master-data:read` permissions on the specified project.", - "operationId": "GetProjectAutomationActions", + "summary": "Returns all available project features.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetPermissionsProjectFeatures", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "example": [ + "https://www.awork.com" + ] + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projectmilestones": { + "get": { + "tags": [ + "ProjectMilestones" + ], + "summary": "Retrieves all project milestones.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectMilestones", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -14681,7 +14614,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/ProjectMilestone" } } } @@ -14704,39 +14637,17 @@ }, "post": { "tags": [ - "Project Automations" - ], - "summary": "Creates a new action for an automation.", - "description": "Creates a new action including its values for an automation. Actions cannot be added to automations created from a workflow.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", - "operationId": "PostProjectAutomationAction", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "ProjectMilestones" ], + "summary": "Creates a new project milestone.", + "description": "The user must either be admin, have 'project-planning-data:write' permissions on the project or be the creator.", + "operationId": "PostProjectMilestone", "requestBody": { - "description": "The model to create an action.", + "description": "The model containing milestone details.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionForm" + "$ref": "#/components/schemas/ProjectMilestonePostForm" } } }, @@ -14748,7 +14659,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/ProjectMilestone" } } } @@ -14779,39 +14690,19 @@ } } }, - "/projects/{projectId}/automations/{automationId}/actions/{actionId}": { - "delete": { + "/projectmilestones/{milestoneId}": { + "get": { "tags": [ - "Project Automations" + "ProjectMilestones" ], - "summary": "Deletes an action for a project automation.", - "description": "Deletes an action for an automation including all its values. Actions of automations created from a workflow cannot be deleted.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", - "operationId": "DeleteProjectAutomationAction", + "summary": "Returns the specified project milestone.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectMilestoneByMilestoneId", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "actionId", + "name": "milestoneId", "in": "path", - "description": "The id of the action.", + "description": "The id of the milestone.", "required": true, "schema": { "type": "string", @@ -14820,11 +14711,28 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectMilestone" + } + } + } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -14847,39 +14755,21 @@ "x-access": { "any": "true" } - }, - "get": { + } + }, + "/projectmilestones/{projectMilestoneId}": { + "delete": { "tags": [ - "Project Automations" + "ProjectMilestones" ], - "summary": "Gets a specific action for a project automation.", - "description": "The user must be owner of the project or must have `project-master-data:read` permissions on the specified project.", - "operationId": "GetProjectAutomationAction", + "summary": "Deletes a project milestone.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectMilestoneById", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "actionId", + "name": "projectMilestoneId", "in": "path", - "description": "The id of the action.", + "description": "The id of the project milestone to delete.", "required": true, "schema": { "type": "string", @@ -14888,12 +14778,25 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -14915,36 +14818,16 @@ }, "put": { "tags": [ - "Project Automations" + "ProjectMilestones" ], - "summary": "Updates a specifc action of a project automation.", - "description": "Updates an exsting action including its values for an automation. Actions of automations created from a workflow cannot be modified.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", - "operationId": "PutProjectAutomationAction", + "summary": "Updates an existing project milestone.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PutProjectMilestoneById", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "actionId", + "name": "projectMilestoneId", "in": "path", - "description": "The id of the action.", + "description": "The id of the project milestone.", "required": true, "schema": { "type": "string", @@ -14953,11 +14836,11 @@ } ], "requestBody": { - "description": "The model to update an action.", + "description": "The model containing milestone details.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionForm" + "$ref": "#/components/schemas/ProjectMilestonePutForm" } } }, @@ -14969,7 +14852,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/ProjectMilestone" } } } @@ -14983,6 +14866,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -15000,67 +14893,47 @@ } } }, - "/projects/{projectId}/automations/{automationId}/actions/{actionId}/updateorder": { - "post": { + "/projectroles": { + "get": { "tags": [ - "Project Automations" + "ProjectRoles" ], - "summary": "Updates the order of a given action of a project automation.", - "description": "Updates the order of a given action in the list of actions of the specific project automation. Actions of automations created from a workflow cannot be modified.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", - "operationId": "PostUpdateProjectAutomationActionOrder", + "summary": "Returns all project roles.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectRoles", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project of the automation.", - "required": true, + "name": "includeMembers", + "in": "query", + "description": "Whether to include the members of each project role in the response.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": true } }, { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "actionId", - "in": "path", - "description": "The id of the action.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model to update the order.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrderForm" - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectRole" + } } } } @@ -15079,72 +14952,38 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/automations/{automationId}/execute": { + }, "post": { "tags": [ - "Project Automations" - ], - "summary": "Executes a manual automation for a task.", - "description": "Can be used to trigger an automation that uses a manual trigger for a specific task.\r\n The calling user becomes the initiator of the automation execution.\r\n The user must have write permissions on the specified task.", - "operationId": "PostExecuteProjectAutomation", - "parameters": [ - { - "name": "projectId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "ProjectRoles" ], + "summary": "Creates a new project role.", + "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostProjectRole", "requestBody": { + "description": "The model to create the project role.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutomationExecuteForm" + "$ref": "#/components/schemas/ProjectRoleForm" } } }, "required": true }, "responses": { - "202": { - "description": "Accepted" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ProjectRole" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -15165,23 +15004,27 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" + }, + "x-subscriptionlevel": { + "minimumPlan": "standard" } } }, - "/projects/{projectId}/autopilot": { - "delete": { + "/projectroles/byuserid/{userId}": { + "get": { "tags": [ - "Autopilot" + "ProjectRoles" ], - "summary": "Deletes the autopilot of the project with the specified id.", - "description": "Deletes the autopilot of the project with the specified id.\r\n To access and modify the autopilot data the user needs to be the owner of the project or\r\n must have 'read' permissions of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectsAutopilotByProjectId", + "summary": "Returns all project roles assigned to the specified user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectRolesByUserIdByUserId", "parameters": [ { - "name": "projectId", + "name": "userId", "in": "path", - "description": "The id of the project.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -15190,8 +15033,28 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectRole" + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -15207,19 +15070,21 @@ "x-access": { "any": "true" } - }, + } + }, + "/projectroles/{projectRoleId}": { "get": { "tags": [ - "Autopilot" + "ProjectRoles" ], - "summary": "Returns the autopilot of the project with the specified id.", - "description": "Returns NoContent if the project does not have an autopilot setup.\r\n To get the autopilot data the user needs to be the owner of the project or\r\n must have 'read' permissions of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectsAutopilotByProjectId", + "summary": "Returns a project role by its id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectRoleById", "parameters": [ { - "name": "projectId", + "name": "projectRoleId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project role.", "required": true, "schema": { "type": "string", @@ -15233,13 +15098,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Autopilot" + "$ref": "#/components/schemas/ProjectRole" } } } }, - "204": { - "description": "No Content" + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -15256,18 +15128,18 @@ "any": "true" } }, - "post": { + "put": { "tags": [ - "Autopilot" + "ProjectRoles" ], - "summary": "Creates a new autopilot for the project with the specified id.", - "description": "Creates a new autopilot for the project with the specified id.\r\n Also creates and enables all alerts for the new autopilot.\r\n For this action, the user needs to be the owner of the project or must have 'read' permissions\r\n of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectsAutopilotByProjectId", + "summary": "Updates an existing project role.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PutProjectRoleById", "parameters": [ { - "name": "projectId", + "name": "projectRoleId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project role.", "required": true, "schema": { "type": "string", @@ -15276,11 +15148,11 @@ } ], "requestBody": { - "description": "The model used to create the autopilot.", + "description": "The model to update the project role.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutopilotPostForm" + "$ref": "#/components/schemas/ProjectRoleForm" } } }, @@ -15292,7 +15164,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Autopilot" + "$ref": "#/components/schemas/ProjectRole" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -15309,21 +15201,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } - }, - "put": { + } + }, + "/projectroles/{projectRoleId}/delete": { + "post": { "tags": [ - "Autopilot" + "ProjectRoles" ], - "summary": "Updates the autopilot of the project with the specified id.", - "description": "Updates the autopilot of the project with the specified id.\r\n To access and modify the autopilot data the user needs to be the owner of the project or\r\n must have 'read' permissions of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", - "operationId": "PutProjectsAutopilotByProjectId", + "summary": "Deletes a project role and migrates its members to a new role.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostProjectRoleDeleteByProjectRoleId", "parameters": [ { - "name": "projectId", + "name": "projectRoleId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project role.", "required": true, "schema": { "type": "string", @@ -15332,11 +15227,11 @@ } ], "requestBody": { - "description": "The model used to update the autopilot.", + "description": "The model to delete the project role.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutopilotPutForm" + "$ref": "#/components/schemas/ProjectRoleDeleteForm" } } }, @@ -15344,11 +15239,24 @@ }, "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Autopilot" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -15365,61 +15273,53 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/projects/{projectId}/changeprojecttype": { - "post": { + "/projectroles/{projectRoleId}/permissions": { + "get": { "tags": [ - "Projects" + "ProjectRoles" ], - "summary": "Changes the project type of the project with the specified id.", - "description": "Changes the project type of the project with the specified id.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", - "operationId": "PostProjectChangeProjectTypeByProjectId", + "summary": "Returns all permissions assigned to a project role.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectRolePermissionsByProjectRoleId", "parameters": [ { - "name": "projectId", + "name": "projectRoleId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project role.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The model to change the project type.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeProjectTypeForm" - } - } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + { + "$ref": "#/components/parameters/page" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + { + "$ref": "#/components/parameters/pageSize" }, - "401": { - "description": "Unauthorized", + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/PermissionOfProjectRole" + } } } } @@ -15448,21 +15348,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/changestatus": { + }, "post": { "tags": [ - "Projects" + "ProjectRoles" ], - "summary": "Changes the status of the project with the specified id.", - "description": "Changes the status of the project with the specified id.\r\n The project status must be associated with the project type used by the project.\r\n This potentially adds task bundles to the project and informs the project members about the status change.\r\n If the project is already in the specified status, nothing happens.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", - "operationId": "PostProjectChangeStatusByProjectId", + "summary": "Creates or updates a permission for a project role.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectRolePermissionsByProjectRoleId", "parameters": [ { - "name": "projectId", + "name": "projectRoleId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project role.", "required": true, "schema": { "type": "string", @@ -15471,19 +15369,26 @@ } ], "requestBody": { - "description": "The model to change the project status.", + "description": "The model to create or update the project role permission.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChangeProjectStatusForm" + "$ref": "#/components/schemas/PermissionOfProjectRoleForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionOfProjectRole" + } + } + } }, "400": { "description": "Bad Request", @@ -15517,40 +15422,43 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projects/{projectId}/comments": { - "delete": { + "/projects": { + "get": { "tags": [ - "ProjectComments" + "Projects" ], - "summary": "Deletes all comments of the specified project.", - "description": "Deletes all comments of the specified project.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCommentsByProjectNameAndProjectId", + "summary": "Returns all projects.", + "description": "Returns all projects the user has `read` permissions for.", + "operationId": "GetProjects", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + } } } } @@ -15570,47 +15478,31 @@ "any": "true" } }, - "get": { + "post": { "tags": [ - "ProjectComments" + "Projects" ], - "summary": "Returns all comments of the project with the specified id.", - "description": "Returns all comments of the project with the specified id. The user needs read permissions on the project.\r\n\r\nAny authenticated user.", - "operationId": "GetCommentsByProjectNameAndProjectId", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Creates a new project.", + "description": "Creates a new project.\r\n\r\nThe user must be an admin or have `project-create:write` permissions.", + "operationId": "PostProject", + "requestBody": { + "description": "The model to create the project.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExtendedProjectForm" + } } }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Comment" - } + "$ref": "#/components/schemas/Project" } } } @@ -15624,16 +15516,6 @@ } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -15647,46 +15529,48 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-create": "write" } - }, + } + }, + "/projects/batch/{operation}": { "post": { "tags": [ - "ProjectComments" + "Projects" ], - "summary": "Creates a new comment on the project with the specified id.", - "description": "Creates a new comment on the project with the specified id.\r\n A user can only create a comment for him/herself, except for admins and api users.\r\n \r\n To create a comment the user must have at least `read` permissions on the specified project.", - "operationId": "PostCommentsByProjectNameAndProjectId", + "summary": "Edits multiple projects using the specified operation.", + "description": "Returns MultiStatus including the list of successful and failed projects.\r\n \r\n Supported operations:\r\n
    \r\n
  • changeprojectstatus: changes the status of all selected projects.
  • \r\n
  • changeprojecttype: changes the type of all selected projects.
  • \r\n
  • linkworkflow: links a workflow to all selected projects.
  • \r\n
  • setclient: sets the client for all selected projects.
  • \r\n
  • setprojectlead: changes the responsible project member for all selected projects.
  • \r\n
  • addteams: adds teams to all selected projects.
  • \r\n
  • removeteams: removes teams from all selected projects.
  • \r\n
  • setdates: sets or removes project start and due dates.
  • \r\n
  • adjustdates: offsets project start and due dates by the specified amount of days.
  • \r\n
  • addtags: adds tags to all selected projects.
  • \r\n
  • removetags: removes tags from all selected projects.
  • \r\n
  • delete: deletes all selected projects.
  • \r\n
The user must have `write` permissions on all projects as well as related entities modified by the operation.", + "operationId": "PostProjectsBatchByOperation", "parameters": [ { - "name": "projectId", + "name": "operation", "in": "path", - "description": "The id of the project to create the comment for.", + "description": "Batch operation route key.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "requestBody": { - "description": "The model to create the comment.", + "description": "Validated request body for the selected operation.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CommentForm" + "$ref": "#/components/schemas/ProjectBatchOperationForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "207": { + "description": "Multi-Status", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/MultiStatusResult" } } } @@ -15710,16 +15594,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -15737,42 +15611,31 @@ } } }, - "/projects/{projectId}/comments/{commentId}": { - "delete": { + "/projects/deletetags": { + "post": { "tags": [ - "ProjectComments" + "ProjectTags" ], - "summary": "Deletes the comment with the specified id on the project with the specified id.", - "description": "Deletes the comment with the specified id on the project with the specified id.\r\n The delete includes the reactions of the comment.\r\n If there are any replies to the comment, they will be deleted as well.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCommentByProjectNameAndProjectIdAndCommentId", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Removes a tag from all projects.", + "description": "\r\n\r\nThe user must be an admin or have `project-master-data:write` permissions.", + "operationId": "PostProjectsDeleteTags", + "requestBody": { + "description": "The model to remove the tag from all projects.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTagForm" + } } }, - { - "name": "commentId", - "in": "path", - "description": "The id of the comment.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -15781,8 +15644,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -15803,35 +15666,27 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-master-data": "write" } - }, + } + }, + "/projects/key/{projectKey}": { "get": { "tags": [ - "ProjectComments" + "Projects" ], - "summary": "Returns the comment with the specified id of the project with the specified id.", - "description": "Returns the comment with the specified id of the project with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetCommentByProjectNameAndProjectIdAndCommentId", + "summary": "Returns the project with the specified key.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectsKeyByProjectKey", "parameters": [ { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "commentId", + "name": "projectKey", "in": "path", - "description": "The id of the comment.", + "description": "The project key to lookup.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -15841,7 +15696,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/Project" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -15855,6 +15720,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -15870,60 +15745,81 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/projects/projecttasks/tags": { + "get": { "tags": [ - "ProjectComments" + "ProjectTasks" ], - "summary": "Updates the comment with the specified id on the project with the specified id.", - "description": "To update a comment the user must either have at least `read` permissions on the specified project, be the creator of the comment or be admin.", - "operationId": "PutCommentByProjectNameAndProjectIdAndCommentId", + "summary": "Returns all tags of the project tasks.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectsProjectTasksTags", "parameters": [ { "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "commentId", - "in": "path", - "description": "The id of the comment.", - "required": true, + "in": "query", + "description": "The id of the project to filter tags by. Returns tags of all projects if not provided.", "schema": { "type": "string", "format": "uuid" } } ], - "requestBody": { - "description": "The model with the updated comment information.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CommentPutForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } + } } } - }, - "required": true + } }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projects/tags": { + "get": { + "tags": [ + "ProjectTags" + ], + "summary": "Returns all tags currently in use by projects.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectsTags", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModelWithCount" + } } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -15932,8 +15828,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -15958,42 +15854,20 @@ } } }, - "/projects/{projectId}/comments/{commentId}/react": { + "/projects/updatetags": { "post": { "tags": [ - "ProjectComments" - ], - "summary": "Updates the reactions of the comment with the specified id on the project with the specified id.", - "description": "To update a reaction of a comment the user must have at least `read` permissions on the specified project.", - "operationId": "PostCommentReactByProjectNameAndProjectIdAndCommentId", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "commentId", - "in": "path", - "description": "The id of the comment.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "ProjectTags" ], + "summary": "Updates a tag globally for all projects.", + "description": "\r\n\r\nThe user must be an admin or have `project-master-data:write` permissions.", + "operationId": "PostProjectsUpdateTags", "requestBody": { - "description": "The model used to update the reactions of the comment with the specified id.", + "description": "The model containing the tag updates.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ReactionForm" + "$ref": "#/components/schemas/TagUpdateForm" } } }, @@ -16003,8 +15877,8 @@ "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -16013,8 +15887,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -16035,18 +15909,19 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-master-data": "write" } } }, - "/projects/{projectId}/customfielddefinitions": { + "/projects/{projectId}": { "get": { "tags": [ - "CustomFields" + "Projects" ], - "summary": "Returns all custom field definitions linked to the specified project, including definitions linked via a workflow.", - "description": "The user must have either `project-master-data:read` permissions or access to at least one task in the project.", - "operationId": "GetProjectCustomFieldDefinitionsByProjectId", + "summary": "Returns the project with the specified id.", + "description": "The user must either be admin, have `project-master-data:read` permissions or be the creator of the project.", + "operationId": "GetProjectById", "parameters": [ { "name": "projectId", @@ -16065,10 +15940,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" - } + "$ref": "#/components/schemas/Project" } } } @@ -16107,16 +15979,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/customfielddefinitions/{customFieldDefinitionId}": { + }, "put": { "tags": [ - "CustomFields" + "Projects" ], - "summary": "Updates the order of a custom field definition linked to the specified project.", - "description": "The user must have `project-master-data:write` permissions or `write` permissions on the specified project.", - "operationId": "PutProjectCustomFieldDefinitionByProjectIdAndCustomFieldDefinitionId", + "summary": "Updates the project with the specified id.", + "description": "Updates the project with the specified id.\r\n Special handling for retainer projects:\r\n If the project has at least one Retainer, the IsRetainer flag is automatically set to true.\r\n For retainer projects, the TimeBudget cannot be set. Instead the TimeBudget is the sum of all retainer budgets.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", + "operationId": "PutProjectById", "parameters": [ { "name": "projectId", @@ -16127,24 +15997,14 @@ "type": "string", "format": "uuid" } - }, - { - "name": "customFieldDefinitionId", - "in": "path", - "description": "The id of the custom field definition.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { - "description": "The model used to update the order of the custom field definition.", + "description": "The model containing the new project details.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldOrderPutForm" + "$ref": "#/components/schemas/ProjectPutForm" } } }, @@ -16156,7 +16016,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldOrderForm" + "$ref": "#/components/schemas/Project" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -16197,14 +16067,14 @@ } } }, - "/projects/{projectId}/delete": { - "post": { + "/projects/{projectId}/activities": { + "get": { "tags": [ - "Projects" + "Project Activities" ], - "summary": "Deletes the project with the specified id.", - "description": "Deletes the project with the specified id.\r\n In the default case the related tasks of this project will also be deleted and the related time entries of this project and all tasks loose the relation to the deleted project and tasks.\r\n To delete the time entries as well, you can set the `deleteTimeTrackings` property of the request to `true`.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", - "operationId": "PostProjectDeleteByProjectId", + "summary": "Returns all activities of the project with the specified id.", + "description": "The activities contain information about the type of the activity, which property was changed and by whom.\r\n This contains changes to first-level properties of the project, like name, description, status, etc., as well as several related entities, such as tags, assignments, etc.\r\n This does not include activities of sub-entities, like tasks of a project or comments on a task.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectActivities", "parameters": [ { "name": "projectId", @@ -16215,22 +16085,43 @@ "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model containing deletion options.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectDeleteForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityModel" + } + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "401": { "description": "Unauthorized", @@ -16268,19 +16159,19 @@ } } }, - "/projects/{projectId}/deletetags": { + "/projects/{projectId}/addprojectmember": { "post": { "tags": [ - "ProjectTags" + "ProjectMembers" ], - "summary": "Removes tags from the project with the specified id.", - "description": "To remove tags from a project the user must have `project-master-data:write` permissions on the specified project.", - "operationId": "PostProjectDeleteTagsByProjectId", + "summary": "Adds a project member to the project with the specified id.", + "description": "Adds a project member to the project with the specified id.\r\n The new project member can also be set as a responsible project member, but only if no other member of this project is responsible.\r\n It is necessary that the project role is available in this project, otherwise the member cannot be added.\r\n A project role is available when they are connected to the specified project type of the project.\r\n A user can only be added to the project once.\r\n \r\n The user has to be the creator or needs `project-master-data:manage` permissions on the project.", + "operationId": "PostProjectAddProjectMemberByProjectId", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project to remove tags from.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -16289,52 +16180,23 @@ } ], "requestBody": { - "description": "The model containing the tags to remove.", + "description": "The model containing project member details.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DeleteTagForm" - } + "$ref": "#/components/schemas/ProjectMemberForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "207": { - "description": "Multi-Status" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ProjectMember" } } } @@ -16355,38 +16217,40 @@ } } }, - "/projects/{projectId}/documents": { - "get": { + "/projects/{projectId}/addtags": { + "post": { "tags": [ - "Documents" + "ProjectTags" ], - "summary": "Retrieves all documents for a project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectDocumentsByProjectId", + "summary": "Adds a batch of tags to the project with the specified id.", + "description": "To add tags to a project the user must have `project-master-data:write` permissions on the specified project.", + "operationId": "PostProjectAddTagsByProjectId", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project to add tags for.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "description": "The model containing the tags to add.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TagForm" + } + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -16395,70 +16259,38 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/DocumentModel" + "$ref": "#/components/schemas/BaseTagModel" } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/projects/{projectId}/documents/trash": { - "get": { - "tags": [ - "Documents" - ], - "summary": "Retrieves all trashed documents for a project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectDocumentsTrashByProjectId", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/orderby" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DocumentModel" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -16479,14 +16311,14 @@ } } }, - "/projects/{projectId}/externalfiles": { + "/projects/{projectId}/addtaskbundle": { "post": { "tags": [ - "ProjectFiles" + "TaskBundles" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Adds a task bundle to a project.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectAddTaskBundleByProjectId", "parameters": [ { "name": "projectId", @@ -16500,33 +16332,46 @@ } ], "requestBody": { - "description": "List of file forms.", + "description": "The add Task Bundle form payload.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" + "$ref": "#/components/schemas/AddTaskBundleForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } - } - }, - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -16547,57 +16392,19 @@ } } }, - "/projects/{projectId}/files": { - "delete": { - "tags": [ - "ProjectFiles" - ], - "summary": "Deletes the files of the specified project.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectFiles", - "parameters": [ - { - "name": "projectId", - "in": "path", - "description": "The id of the project.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, + "/projects/{projectId}/allfiles": { "get": { "tags": [ "ProjectFiles" ], "summary": "Returns all files of the project with the specified id.", - "description": "Returns all file metadata of the project with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectFiles", + "description": "Returns all files of the project including the ones of tasks linked to that project, with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetAllProjectFiles", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the entity.", "required": true, "schema": { "type": "string", @@ -16645,14 +16452,16 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/projects/{projectId}/automations": { + "get": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Creates a new project file for the project with the specified id..", - "description": "Uploads a new project file for the project with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateProjectFile", + "summary": "Returns all automations of the specified project.", + "description": "The user must be owner of the project or must have `project-master-data:read` permissions on the specified project.", + "operationId": "GetProjectAutomations", "parameters": [ { "name": "projectId", @@ -16665,42 +16474,19 @@ } } ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/Automation" + } } } } - }, - "400": { - "description": "Bad Request" } }, "security": [ @@ -16716,21 +16502,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/byuploadid": { + }, "post": { "tags": [ - "FileUpload" + "Project Automations" ], - "summary": "Creates a file from an upload id.", - "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file project from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", - "operationId": "PostUploadByUploadId", + "summary": "Creates a new automation for the specified project.", + "description": "Creates a new automation for the project with the specified id.\r\n The user needs to be the owner of the project or have 'write' permissions of\r\n the feature 'project-master-data' globally or in the project.\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectAutomation", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project to attach the file to.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -16739,11 +16523,11 @@ } ], "requestBody": { - "description": "The model describing the uploaded file metadata.", + "description": "The model to create the automation.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UploadByUploadIdForm" + "$ref": "#/components/schemas/AutomationTriggerForm" } } }, @@ -16755,13 +16539,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/Automation" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -16783,22 +16567,35 @@ ], "x-access": { "any": "true" + }, + "x-subscriptionlevel": { + "minimumPlan": "standard" } } }, - "/projects/{projectId}/files/byurl": { - "post": { + "/projects/{projectId}/automations/{automationId}": { + "delete": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateProjectFileByUrl", + "summary": "Deletes the specified automation for a given project.", + "description": "Deletes the specified automation for a given project.\r\n Also deletes all actions connected to the automation.\r\n The user needs to be the owner of the project or have 'write' permissions of\r\n the feature 'project-master-data' globally or in the project.\r\n Automations created from a workflow cannot be deleted via this endpoint.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectAutomation", "parameters": [ + { + "name": "automationId", + "in": "path", + "description": "The id of the automation.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "name": "projectId", "in": "path", - "description": "The id of the project the file is linked to.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -16806,28 +16603,16 @@ } } ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - } - } - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -16846,21 +16631,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/{fileId}": { - "delete": { + }, + "get": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Deletes the project file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectFile", + "summary": "Returns a specific automation from a project.", + "description": "Returns a specific automation of the project with the specified id.\r\n Returns NotFound if the automation doesnt exist.\r\n To get the the automation data the user needs to be the owner of the project or\r\n have 'read' permissions of the feature 'project-master-data' globally or in his project role.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectAutomation", "parameters": [ { - "name": "projectId", + "name": "automationId", "in": "path", - "description": "The id of the project.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -16868,9 +16651,9 @@ } }, { - "name": "fileId", + "name": "projectId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -16879,8 +16662,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Automation" + } + } + } } }, "security": [ @@ -16897,18 +16687,18 @@ "any": "true" } }, - "get": { + "put": { "tags": [ - "Project Files" + "Project Automations" ], - "summary": "Returns the file with the specified id of the project with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByProjectNameAndProjectIdAndFileId", + "summary": "Updates the automation with the specified id.", + "description": "Updates the automation with the specified id.\r\n The user needs to be the owner of the project or have 'write' permissions of\r\n the feature 'project-master-data' globally or in the project.\r\n If the automation was created from a workflow, only the Enabled flag can be changed.\r\n\r\nAny authenticated user.", + "operationId": "PutProjectAutomation", "parameters": [ { - "name": "projectId", + "name": "automationId", "in": "path", - "description": "The id of the project.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -16916,9 +16706,9 @@ } }, { - "name": "fileId", + "name": "projectId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -16926,29 +16716,30 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileInfo" - } + "requestBody": { + "description": "The model to update the automation.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationPutForm" } } }, - "401": { - "description": "Unauthorized", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Automation" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -16971,19 +16762,21 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/projects/{projectId}/automations/{automationId}/actions": { + "get": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Updates the metadata of the project file with the specified id.", - "description": "Updates the metadata of the project file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateProjectFile", + "summary": "Gets the actions of a project automation.", + "description": "Gets all actions including their values of an automation.\r\n The user must be owner of the project or must have `project-master-data:read` permissions on the specified project.", + "operationId": "GetProjectAutomationActions", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project of the automation.", "required": true, "schema": { "type": "string", @@ -16991,9 +16784,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -17001,28 +16794,16 @@ } } ], - "requestBody": { - "description": "The model to update the file with the specified id.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/Action" + } } } } @@ -17041,21 +16822,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/{fileId}/changeentity": { + }, "post": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Changes the project this file belongs to.", - "description": "Changes the project this file belongs to.\nSwitch to the specified project or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeProject", + "summary": "Creates a new action for an automation.", + "description": "Creates a new action including its values for an automation. Actions cannot be added to automations created from a workflow.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", + "operationId": "PostProjectAutomationAction", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project of the automation.", "required": true, "schema": { "type": "string", @@ -17063,9 +16842,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -17074,19 +16853,15 @@ } ], "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The model to create an action.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" + "$ref": "#/components/schemas/ActionForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -17094,7 +16869,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/Action" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17115,19 +16900,19 @@ } } }, - "/projects/{projectId}/files/{fileId}/copy": { - "post": { + "/projects/{projectId}/automations/{automationId}/actions/{actionId}": { + "delete": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Copies the file to a new project.", - "description": "Copies the file to a new project (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToProject", + "summary": "Deletes an action for a project automation.", + "description": "Deletes an action for an automation including all its values. Actions of automations created from a workflow cannot be deleted.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", + "operationId": "DeleteProjectAutomationAction", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project of the automation.", "required": true, "schema": { "type": "string", @@ -17135,38 +16920,36 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The model to change the entity information of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } + }, + { + "name": "actionId", + "in": "path", + "description": "The id of the action.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, + ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17185,21 +16968,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/{fileId}/download": { + }, "get": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Returns the content of the project file with the specified id.", - "description": "Returns the content of the project file. Uses the latest file version.\nIf the project file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectFileContent", + "summary": "Gets a specific action for a project automation.", + "description": "The user must be owner of the project or must have `project-master-data:read` permissions on the specified project.", + "operationId": "GetProjectAutomationAction", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project of the automation.", "required": true, "schema": { "type": "string", @@ -17207,9 +16988,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -17217,29 +16998,13 @@ } }, { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", + "name": "actionId", + "in": "path", + "description": "The id of the action.", + "required": true, "schema": { - "type": "boolean" + "type": "string", + "format": "uuid" } } ], @@ -17249,8 +17014,7 @@ "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/Action" } } } @@ -17269,21 +17033,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/{fileId}/pdf": { - "get": { + }, + "put": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the project file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectFileContent", + "summary": "Updates a specifc action of a project automation.", + "description": "Updates an exsting action including its values for an automation. Actions of automations created from a workflow cannot be modified.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", + "operationId": "PutProjectAutomationAction", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project of the automation.", "required": true, "schema": { "type": "string", @@ -17291,9 +17053,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -17301,23 +17063,44 @@ } }, { - "name": "inline", - "in": "query", - "description": "If inline is false, content-disposition header is attachment.", + "name": "actionId", + "in": "path", + "description": "The id of the action.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "description": "The model to update an action.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActionForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/Action" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17338,19 +17121,19 @@ } } }, - "/projects/{projectId}/files/{fileId}/shareurl": { - "get": { + "/projects/{projectId}/automations/{automationId}/actions/{actionId}/updateorder": { + "post": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", + "summary": "Updates the order of a given action of a project automation.", + "description": "Updates the order of a given action in the list of actions of the specific project automation. Actions of automations created from a workflow cannot be modified.\r\n The user must be owner of the project or must have `project-master-data:write` permissions on the specified project.", + "operationId": "PostUpdateProjectAutomationActionOrder", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project of the automation.", "required": true, "schema": { "type": "string", @@ -17358,9 +17141,19 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "actionId", + "in": "path", + "description": "The id of the action.", "required": true, "schema": { "type": "string", @@ -17368,13 +17161,27 @@ } } ], + "requestBody": { + "description": "The model to update the order.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrderForm" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17395,19 +17202,18 @@ } } }, - "/projects/{projectId}/files/{fileId}/versions": { - "get": { + "/projects/{projectId}/automations/{automationId}/execute": { + "post": { "tags": [ - "ProjectFiles" + "Project Automations" ], - "summary": "Returns all file versions of the specified project file.", - "description": "Returns all file versions of the specified project file.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectFileVersions", + "summary": "Executes a manual automation for a task.", + "description": "Can be used to trigger an automation that uses a manual trigger for a specific task.\r\n The calling user becomes the initiator of the automation execution.\r\n The user must have write permissions on the specified task.", + "operationId": "PostExecuteProjectAutomation", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -17415,38 +17221,55 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationExecuteForm" + } + } }, - { - "$ref": "#/components/parameters/page" + "required": true + }, + "responses": { + "202": { + "description": "Accepted" }, - { - "$ref": "#/components/parameters/pageSize" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/orderby" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileVersion" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17465,14 +17288,16 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/projects/{projectId}/autopilot": { + "delete": { "tags": [ - "ProjectFiles" + "Autopilot" ], - "summary": "Uploads a new version of the project file with the specified id.", - "description": "Uploads a new version of an project file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateProjectFileVersion", + "summary": "Deletes the autopilot of the project with the specified id.", + "description": "Deletes the autopilot of the project with the specified id.\r\n To access and modify the autopilot data the user needs to be the owner of the project or\r\n must have 'read' permissions of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectsAutopilotByProjectId", "parameters": [ { "name": "projectId", @@ -17483,11 +17308,39 @@ "type": "string", "format": "uuid" } - }, + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ { - "name": "fileId", + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "Autopilot" + ], + "summary": "Returns the autopilot of the project with the specified id.", + "description": "Returns NoContent if the project does not have an autopilot setup.\r\n To get the autopilot data the user needs to be the owner of the project or\r\n must have 'read' permissions of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectsAutopilotByProjectId", + "parameters": [ + { + "name": "projectId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -17495,42 +17348,19 @@ } } ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/Autopilot" } } } }, - "400": { - "description": "Bad Request" + "204": { + "description": "No Content" } }, "security": [ @@ -17546,16 +17376,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/{fileId}/versions/{versionId}": { - "get": { + }, + "post": { "tags": [ - "Project Files" + "Autopilot" ], - "summary": "Returns the project file version with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByProjectNameAndProjectIdAndFileIdAndVersionId", + "summary": "Creates a new autopilot for the project with the specified id.", + "description": "Creates a new autopilot for the project with the specified id.\r\n Also creates and enables all alerts for the new autopilot.\r\n For this action, the user needs to be the owner of the project or must have 'read' permissions\r\n of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectsAutopilotByProjectId", "parameters": [ { "name": "projectId", @@ -17566,55 +17394,26 @@ "type": "string", "format": "uuid" } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + "requestBody": { + "description": "The model used to create the autopilot.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutopilotPostForm" } } }, - "404": { - "description": "Not Found", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Autopilot" } } } @@ -17633,16 +17432,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/files/{fileId}/versions/{versionId}/download": { - "get": { + }, + "put": { "tags": [ - "ProjectFiles" + "Autopilot" ], - "summary": "Returns the content of the project file version with the specified id.", - "description": "Returns the content of the project file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectFileVersionContent", + "summary": "Updates the autopilot of the project with the specified id.", + "description": "Updates the autopilot of the project with the specified id.\r\n To access and modify the autopilot data the user needs to be the owner of the project or\r\n must have 'read' permissions of the feature 'project-master-data' globally or in their project role.\r\n\r\nAny authenticated user.", + "operationId": "PutProjectsAutopilotByProjectId", "parameters": [ { "name": "projectId", @@ -17653,36 +17450,26 @@ "type": "string", "format": "uuid" } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "description": "The model used to update the autopilot.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutopilotPutForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/Autopilot" } } } @@ -17703,14 +17490,14 @@ } } }, - "/projects/{projectId}/linkcustomfielddefinition": { + "/projects/{projectId}/changeprojecttype": { "post": { "tags": [ - "CustomFields" + "Projects" ], - "summary": "Links a custom field definition to the specified project.", - "description": "The user must have `project-master-data:write` permissions or `write` permissions on the specified project.", - "operationId": "PostProjectLinkCustomFieldDefinitionByProjectId", + "summary": "Changes the project type of the project with the specified id.", + "description": "Changes the project type of the project with the specified id.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", + "operationId": "PostProjectChangeProjectTypeByProjectId", "parameters": [ { "name": "projectId", @@ -17724,11 +17511,11 @@ } ], "requestBody": { - "description": "The model used to link the custom field definition.", + "description": "The model to change the project type.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/LinkCustomFieldDefinitionForm" + "$ref": "#/components/schemas/ChangeProjectTypeForm" } } }, @@ -17784,14 +17571,14 @@ } } }, - "/projects/{projectId}/linkworkflow": { + "/projects/{projectId}/changestatus": { "post": { "tags": [ - "Workflows" + "Projects" ], - "summary": "Links a workflow to a project.", - "description": "Links the specified workflow to the project, migrating existing statuses\r\n using the provided mapping. If the project has no existing statuses,\r\n workflow statuses are automatically assigned.\r\n If the project is already linked to a workflow, switching to a new workflow\r\n is supported when proper status mappings are provided.\r\n To link a workflow to a project the user must have `project-master-data:write` permissions on the specified project or be the project creator.", - "operationId": "PostProjectLinkWorkflowByProjectId", + "summary": "Changes the status of the project with the specified id.", + "description": "Changes the status of the project with the specified id.\r\n The project status must be associated with the project type used by the project.\r\n This potentially adds task bundles to the project and informs the project members about the status change.\r\n If the project is already in the specified status, nothing happens.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", + "operationId": "PostProjectChangeStatusByProjectId", "parameters": [ { "name": "projectId", @@ -17805,26 +17592,19 @@ } ], "requestBody": { - "description": "The link workflow form.", + "description": "The model to change the project status.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/LinkWorkflowForm" + "$ref": "#/components/schemas/ChangeProjectStatusForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Project" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -17836,16 +17616,6 @@ } } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -17872,14 +17642,14 @@ } } }, - "/projects/{projectId}/members": { - "get": { + "/projects/{projectId}/comments": { + "delete": { "tags": [ - "Projects" + "ProjectComments" ], - "summary": "Returns the project members of the project with the specified id.", - "description": "Returns the project members of the project with the specified id.\r\n \r\n The user has to be the creator of the project or needs `read` permissions of the feature `project-master-data`.", - "operationId": "GetProjectMembersByProjectId", + "summary": "Deletes all comments of the specified project.", + "description": "Deletes all comments of the specified project.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCommentsByProjectNameAndProjectId", "parameters": [ { "name": "projectId", @@ -17893,31 +17663,11 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectMember" - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -17940,16 +17690,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/milestones": { + }, "get": { "tags": [ - "ProjectMilestones" + "ProjectComments" ], - "summary": "Returns all project milestones of the specified project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectMilestonesByProjectId", + "summary": "Returns all comments of the project with the specified id.", + "description": "Returns all comments of the project with the specified id. The user needs read permissions on the project.\r\n\r\nAny authenticated user.", + "operationId": "GetCommentsByProjectNameAndProjectId", "parameters": [ { "name": "projectId", @@ -17960,6 +17708,18 @@ "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -17970,12 +17730,22 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ProjectMilestone" + "$ref": "#/components/schemas/Comment" } } } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "401": { "description": "Unauthorized", "content": { @@ -18000,49 +17770,54 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/projectstatuses": { - "get": { + }, + "post": { "tags": [ - "ProjectStatuses" + "ProjectComments" ], - "summary": "Returns all project statuses of the project with the specified id.", - "description": "Returns all project statuses relevant to the project with the specified id. If the project is linked to a workflow, the workflow's project statuses are returned.\r\n The user must either be admin, have `project-master-data:read` permissions or be the creator of the project.", - "operationId": "GetProjectProjectStatusesByProjectId", + "summary": "Creates a new comment on the project with the specified id.", + "description": "Creates a new comment on the project with the specified id.\r\n A user can only create a comment for him/herself, except for admins and api users.\r\n \r\n To create a comment the user must have at least `read` permissions on the specified project.", + "operationId": "PostCommentsByProjectNameAndProjectId", "parameters": [ { "name": "projectId", "in": "path", + "description": "The id of the project to create the comment for.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "description": "The model to create the comment.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommentForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectStatus" - } + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -18081,14 +17856,16 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/projects/{projectId}/comments/{commentId}": { + "delete": { "tags": [ - "ProjectStatuses" + "ProjectComments" ], - "summary": "Creates a project status for a project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectProjectStatusesByProjectId", + "summary": "Deletes the comment with the specified id on the project with the specified id.", + "description": "Deletes the comment with the specified id on the project with the specified id.\r\n The delete includes the reactions of the comment.\r\n If there are any replies to the comment, they will be deleted as well.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCommentByProjectNameAndProjectIdAndCommentId", "parameters": [ { "name": "projectId", @@ -18099,39 +17876,21 @@ "type": "string", "format": "uuid" } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "description": "The model to create the project status.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectStatusForm" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectStatus" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -18167,16 +17926,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/projecttasks": { + }, "get": { "tags": [ - "ProjectTasks" + "ProjectComments" ], - "summary": "Returns all project tasks of the project with the specified id.", - "description": "The user must have `project-planning-data:read` permissions, otherwise only assigned tasks will be returned.", - "operationId": "GetProjectProjectTasksByProjectId", + "summary": "Returns the comment with the specified id of the project with the specified id.", + "description": "Returns the comment with the specified id of the project with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetCommentByProjectNameAndProjectIdAndCommentId", "parameters": [ { "name": "projectId", @@ -18189,16 +17946,14 @@ } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "commentId", + "in": "path", + "description": "The id of the comment.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -18207,16 +17962,13 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/Comment" } } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -18239,16 +17991,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/projecttasks/{taskId}": { - "get": { + }, + "put": { "tags": [ - "ProjectTasks" + "ProjectComments" ], - "summary": "Returns the project task with the specified id.", - "description": "The user must have either `project-planning-data:read` permissions or be assigned to the project task.", - "operationId": "GetProjectProjectTaskByProjectIdAndTaskId", + "summary": "Updates the comment with the specified id on the project with the specified id.", + "description": "To update a comment the user must either have at least `read` permissions on the specified project, be the creator of the comment or be admin.", + "operationId": "PutCommentByProjectNameAndProjectIdAndCommentId", "parameters": [ { "name": "projectId", @@ -18261,9 +18011,9 @@ } }, { - "name": "taskId", + "name": "commentId", "in": "path", - "description": "The id of the task.", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -18271,13 +18021,24 @@ } } ], + "requestBody": { + "description": "The model with the updated comment information.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommentPutForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/Comment" } } } @@ -18318,14 +18079,14 @@ } } }, - "/projects/{projectId}/projecttasks/{taskId}/changeproject": { + "/projects/{projectId}/comments/{commentId}/react": { "post": { "tags": [ - "ProjectTasks" + "ProjectComments" ], - "summary": "Changes the project of the task with the specified id.", - "description": "Changes the project of the task with the specified id.\r\n This call also moves all subtasks of the task to the new project.\r\n This also changes the tracked time sum of the new project and the previous project.\r\n The related time entries of this task will also be moved to the new project.\r\n The user must have `project-planning-data:write` permissions on both projects.", - "operationId": "PostProjectProjectTaskChangeProjectByProjectIdAndTaskId", + "summary": "Updates the reactions of the comment with the specified id on the project with the specified id.", + "description": "To update a reaction of a comment the user must have at least `read` permissions on the specified project.", + "operationId": "PostCommentReactByProjectNameAndProjectIdAndCommentId", "parameters": [ { "name": "projectId", @@ -18338,9 +18099,9 @@ } }, { - "name": "taskId", + "name": "commentId", "in": "path", - "description": "The id of the task.", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -18349,11 +18110,11 @@ } ], "requestBody": { - "description": "The model to change the project of the task.", + "description": "The model used to update the reactions of the comment with the specified id.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChangeProjectForm" + "$ref": "#/components/schemas/ReactionForm" } } }, @@ -18363,16 +18124,6 @@ "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "401": { "description": "Unauthorized", "content": { @@ -18409,14 +18160,14 @@ } } }, - "/projects/{projectId}/projecttasks/{taskId}/checklistitems": { + "/projects/{projectId}/customfielddefinitions": { "get": { "tags": [ - "ChecklistItems" + "CustomFields" ], - "summary": "Returns the checklist items for a project task with the specified id.", - "description": "The user must have either `project-planning-data:read` permissions or be assigned to the project task.", - "operationId": "GetProjectProjectTaskChecklistItemsByProjectIdAndTaskId", + "summary": "Returns all custom field definitions linked to the specified project, including definitions linked via a workflow.", + "description": "The user must have either `project-master-data:read` permissions or access to at least one task in the project.", + "operationId": "GetProjectCustomFieldDefinitionsByProjectId", "parameters": [ { "name": "projectId", @@ -18427,16 +18178,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -18447,7 +18188,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ChecklistItem" + "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" } } } @@ -18489,14 +18230,14 @@ } } }, - "/projects/{projectId}/projecttasks/{taskId}/checklistitems/{checklistItemId}": { - "get": { + "/projects/{projectId}/customfielddefinitions/{customFieldDefinitionId}": { + "put": { "tags": [ - "ChecklistItems" + "CustomFields" ], - "summary": "Retrieves a checklist item from a project task.", - "description": "The user must have either `project-planning-data:read` permissions or be assigned to the project task.", - "operationId": "GetProjectProjectTaskChecklistItemByProjectIdAndTaskIdAndChecklistItemId", + "summary": "Updates the order of a custom field definition linked to the specified project.", + "description": "The user must have `project-master-data:write` permissions or `write` permissions on the specified project.", + "operationId": "PutProjectCustomFieldDefinitionByProjectIdAndCustomFieldDefinitionId", "parameters": [ { "name": "projectId", @@ -18509,19 +18250,9 @@ } }, { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "checklistItemId", + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the checklist item.", + "description": "The id of the custom field definition.", "required": true, "schema": { "type": "string", @@ -18529,13 +18260,24 @@ } } ], + "requestBody": { + "description": "The model used to update the order of the custom field definition.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldOrderPutForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" + "$ref": "#/components/schemas/CustomFieldOrderForm" } } } @@ -18576,14 +18318,14 @@ } } }, - "/projects/{projectId}/removeprojectmember": { + "/projects/{projectId}/delete": { "post": { "tags": [ "Projects" ], - "summary": "Removes a project member from the project with the specified id.", - "description": "Removes a project member from the project with the specified id.\r\n \r\n The user has to be the creator of the project or needs `manage` permissions of the feature `project-master-data`.", - "operationId": "PostProjectRemoveProjectMemberByProjectId", + "summary": "Deletes the project with the specified id.", + "description": "Deletes the project with the specified id.\r\n In the default case the related tasks of this project will also be deleted and the related time entries of this project and all tasks loose the relation to the deleted project and tasks.\r\n To delete the time entries as well, you can set the `deleteTimeTrackings` property of the request to `true`.\r\n \r\n The user has to be the creator of the project or needs `write` permissions of the feature `project-master-data`.", + "operationId": "PostProjectDeleteByProjectId", "parameters": [ { "name": "projectId", @@ -18597,11 +18339,85 @@ } ], "requestBody": { - "description": "The model to remove the project member.", + "description": "The model containing deletion options.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMemberRemoveForm" + "$ref": "#/components/schemas/ProjectDeleteForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projects/{projectId}/deletetags": { + "post": { + "tags": [ + "ProjectTags" + ], + "summary": "Removes tags from the project with the specified id.", + "description": "To remove tags from a project the user must have `project-master-data:write` permissions on the specified project.", + "operationId": "PostProjectDeleteTagsByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project to remove tags from.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model containing the tags to remove.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeleteTagForm" + } } } }, @@ -18611,6 +18427,9 @@ "204": { "description": "No Content" }, + "207": { + "description": "Multi-Status" + }, "400": { "description": "Bad Request", "content": { @@ -18657,14 +18476,14 @@ } } }, - "/projects/{projectId}/retainers": { + "/projects/{projectId}/documents": { "get": { "tags": [ - "Retainers" + "Documents" ], - "summary": "Endpoint to get all retainers for a project.", - "description": "The user must have the ProjectMasterData read permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectRetainersByProjectId", + "summary": "Retrieves all documents for a project.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectDocumentsByProjectId", "parameters": [ { "name": "projectId", @@ -18697,7 +18516,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Retainer" + "$ref": "#/components/schemas/DocumentModel" } } } @@ -18717,64 +18536,50 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/projects/{projectId}/documents/trash": { + "get": { "tags": [ - "Retainers" + "Documents" ], - "summary": "Endpoint to create a new retainer for a project.", - "description": "As soon as a retainer is created for a project, the project will be marked as a retainer project.\r\n Based on the Start and End dates of the retainer, the retainer budgets will be created automatically.\r\n Retainers cannot overlap. There can only be one active retainer per project at a time (no end date and/or including the current date).\r\n \r\n The user needs to have the ProjectMasterData write permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectRetainersByProjectId", + "summary": "Retrieves all trashed documents for a project.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectDocumentsTrashByProjectId", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project to create a retainer for.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model to create a retainer.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RetainerForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Retainer" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentModel" + } } } } @@ -18795,14 +18600,14 @@ } } }, - "/projects/{projectId}/retainers/{retainerId}": { - "delete": { + "/projects/{projectId}/externalfiles": { + "post": { "tags": [ - "Retainers" + "ProjectFiles" ], - "summary": "Endpoint to delete a retainer for a project. Deletes all related retainer budgets.", - "description": "The user must have the ProjectMasterData write permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectRetainerByProjectIdAndRetainerId", + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", "parameters": [ { "name": "projectId", @@ -18813,38 +18618,36 @@ "type": "string", "format": "uuid" } - }, - { - "name": "retainerId", - "in": "path", - "description": "The id of the retainer.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "requestBody": { + "description": "List of file forms.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" } } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -18863,14 +18666,16 @@ "x-access": { "any": "true" } - }, - "get": { + } + }, + "/projects/{projectId}/files": { + "delete": { "tags": [ - "Retainers" + "ProjectFiles" ], - "summary": "Endpoint to get a retainer for a project by id.", - "description": "The user must have the ProjectMasterData read permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectRetainerByProjectIdAndRetainerId", + "summary": "Deletes the files of the specified project.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectFiles", "parameters": [ { "name": "projectId", @@ -18881,38 +18686,11 @@ "type": "string", "format": "uuid" } - }, - { - "name": "retainerId", - "in": "path", - "description": "The id of the retainer.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Retainer" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -18929,18 +18707,18 @@ "any": "true" } }, - "put": { + "get": { "tags": [ - "Retainers" + "ProjectFiles" ], - "summary": "Endpoint to update the retainer for a project.", - "description": "Date changes must not overlap another retainer for the project. The retainer period cannot be changed.\r\n \r\n The user needs to have the ProjectMasterData write permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", - "operationId": "PutProjectRetainerByProjectIdAndRetainerId", + "summary": "Returns all files of the project with the specified id.", + "description": "Returns all file metadata of the project with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectFiles", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project to update the retainer for.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -18948,54 +18726,28 @@ } }, { - "name": "retainerId", - "in": "path", - "description": "The id of the retainer.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model to update the retainer.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RetainerForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Retainer" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } } } } @@ -19014,16 +18766,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/setcustomfields": { + }, "post": { "tags": [ - "CustomFields" + "ProjectFiles" ], - "summary": "Sets custom field values for a project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectSetCustomFieldsByProjectId", + "summary": "Creates a new project file for the project with the specified id..", + "description": "Uploads a new project file for the project with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateProjectFile", "parameters": [ { "name": "projectId", @@ -19037,52 +18787,41 @@ } ], "requestBody": { - "description": "The list of custom field values to set.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldPostForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" } } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "400": { + "description": "Bad Request" } }, "security": [ @@ -19100,19 +18839,19 @@ } } }, - "/projects/{projectId}/setprojectkey": { + "/projects/{projectId}/files/byuploadid": { "post": { "tags": [ - "Projects" + "FileUpload" ], - "summary": "Updates the project key for the specified project and all associated task identifiers.", - "description": "The project key must be unique within the workspace and follow these rules:\r\n - Only uppercase letters (A-Z), numbers (0-9), and dashes (-)\r\n - Between 1 and 32 characters\r\n - Not already in use by another active project in the workspace\r\n \r\n This operation will also update all task identifiers for tasks in this project\r\n (e.g., OLDKEY-123 becomes NEWKEY-123). Task identifiers are updated in batches\r\n to ensure audit logs and websocket events are triggered properly.\r\n \r\n Note: The project key update is now transactional with automatic retry on race conditions.\r\n If multiple concurrent requests try to update the same project key, the service will\r\n retry with exponential backoff (100ms, 200ms, 400ms) for up to 3 attempts.\r\n Task identifier updates are processed in batches as a background operation.\r\n \r\n Note: User-provided keys are not subject to profanity filtering. Users can set any key they choose.\r\n\r\nThe user must be an admin or have `project-master-data:write` permissions.", - "operationId": "PostProjectSetProjectKeyByProjectId", + "summary": "Creates a file from an upload id.", + "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file project from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", + "operationId": "PostUploadByUploadId", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project to attach the file to.", "required": true, "schema": { "type": "string", @@ -19121,10 +18860,11 @@ } ], "requestBody": { + "description": "The model describing the uploaded file metadata.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateProjectKeyForm" + "$ref": "#/components/schemas/UploadByUploadIdForm" } } }, @@ -19136,17 +18876,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -19173,83 +18903,52 @@ "v1" ], "x-access": { - "admin": "true", - "project-master-data": "write" + "any": "true" } } }, - "/projects/{projectId}/tags": { - "get": { + "/projects/{projectId}/files/byurl": { + "post": { "tags": [ - "ProjectTags" + "ProjectFiles" ], - "summary": "Returns the tags of the project with the specified id.", - "description": "To get the tags of a project the user must have `project-master-data:read` permissions on the specified project.", - "operationId": "GetProjectTagsByProjectId", + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateProjectFileByUrl", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project to get tags for.", + "description": "The id of the project the file is linked to.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + "requestBody": { + "description": "The url, name and description of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -19270,14 +18969,14 @@ } } }, - "/projects/{projectId}/taskdependencies": { - "get": { + "/projects/{projectId}/files/{fileId}": { + "delete": { "tags": [ - "TaskDependencies" + "ProjectFiles" ], - "summary": "Returns all task dependencies for a specific project.", - "description": "To get all dependencies of a project, the user needs project planning permissions on that project.", - "operationId": "GetProjectTaskdependenciesByProjectId", + "summary": "Deletes the project file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectFile", "parameters": [ { "name": "projectId", @@ -19288,31 +18987,21 @@ "type": "string", "format": "uuid" } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskDependency" - } - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -19328,16 +19017,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/tasklists": { + }, "get": { "tags": [ - "TaskLists" + "Project Files" ], - "summary": "Returns all task lists of the project with the specified id.", - "description": "The permission check in this function is dynamically based on the entity name.\r\n In the cases where the user tries to get the project task lists,\r\n the user needs read permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTaskListsByProjectId", + "summary": "Returns the file with the specified id of the project with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByProjectNameAndProjectIdAndFileId", "parameters": [ { "name": "projectId", @@ -19350,25 +19037,14 @@ } }, { - "name": "showArchived", - "in": "query", - "description": "The show Archived.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -19377,10 +19053,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskList" - } + "$ref": "#/components/schemas/FileInfo" } } } @@ -19394,6 +19067,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -19410,13 +19093,13 @@ "any": "true" } }, - "post": { + "put": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Creates a new task list.", - "description": "To create a new project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListsByProjectId", + "summary": "Updates the metadata of the project file with the specified id.", + "description": "Updates the metadata of the project file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateProjectFile", "parameters": [ { "name": "projectId", @@ -19427,18 +19110,32 @@ "type": "string", "format": "uuid" } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { - "description": "The task List form.", + "description": "The model to update the file with the specified id.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskListForm" + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -19446,37 +19143,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskList" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -19497,14 +19164,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}": { - "get": { + "/projects/{projectId}/files/{fileId}/changeentity": { + "post": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Returns the task list with the specified id.", - "description": "The permission check in this function is dynamically based on the entity name.\r\n In the cases where the user tries to get the project task lists,\r\n the user needs read permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTaskListByProjectIdAndTaskListId", + "summary": "Changes the project this file belongs to.", + "description": "Changes the project this file belongs to.\nSwitch to the specified project or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeProject", "parameters": [ { "name": "projectId", @@ -19517,9 +19184,9 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -19527,13 +19194,28 @@ } } ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskList" + "$ref": "#/components/schemas/FileInfo" } } } @@ -19552,14 +19234,16 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/projects/{projectId}/files/{fileId}/copy": { + "post": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Updates the task list with the specified id.", - "description": "To update a project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "PutProjectTaskListByProjectIdAndTaskListId", + "summary": "Copies the file to a new project.", + "description": "Copies the file to a new project (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToProject", "parameters": [ { "name": "projectId", @@ -19572,9 +19256,9 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -19583,15 +19267,19 @@ } ], "requestBody": { - "description": "The task List Put form.", + "description": "The model to change the entity information of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskListPutForm" + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -19599,27 +19287,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskList" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -19640,14 +19308,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/addtasks": { - "post": { + "/projects/{projectId}/files/{fileId}/download": { + "get": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Adds the tasks to the task list with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListAddTasksByProjectIdAndTaskListId", + "summary": "Returns the content of the project file with the specified id.", + "description": "Returns the content of the project file. Uses the latest file version.\nIf the project file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectFileContent", "parameters": [ { "name": "projectId", @@ -19660,50 +19328,50 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The task To Task List list.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskToTaskList" - } - } + }, + { + "name": "width", + "in": "query", + "description": "Set width to resize.", + "schema": { + "type": "number", + "format": "double" } }, - "required": true - }, + { + "name": "height", + "in": "query", + "description": "Set height to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ReorderingResult" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -19724,14 +19392,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/changeproject": { - "post": { + "/projects/{projectId}/files/{fileId}/pdf": { + "get": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Changes the project of the task list with the specified id.", - "description": "This endpoint also moves all tasks and time entries to the new project.\r\n This will also change the tracked time sum of the old and new projects.\r\n The task status mapping will move all tasks of a certain status to the new provided status on the mapping.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListChangeProjectByProjectIdAndTaskListId", + "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", + "description": "Returns the content of the project file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectFileContent", "parameters": [ { "name": "projectId", @@ -19744,30 +19412,36 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "inline", + "in": "query", + "description": "If inline is false, content-disposition header is attachment.", + "schema": { + "type": "boolean", + "default": false + } } ], - "requestBody": { - "description": "The change Project form For Task Lists.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeProjectFormForTaskLists" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } } } - }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" } }, "security": [ @@ -19785,14 +19459,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/copy": { - "post": { + "/projects/{projectId}/files/{fileId}/shareurl": { + "get": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Creates a copy of the task list.", - "description": "A new task list will be created with the same name as the original one.\r\n All tasks and subtasks will also be copied in this operation.\r\n Comments, files and activity logs are not copied.\r\n To copy a task list, the user needs to have 'ProjectPlanning'\r\n permissions in general or in the project the task list belongs to.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListCopyByProjectIdAndTaskListId", + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", "parameters": [ { "name": "projectId", @@ -19805,9 +19479,9 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -19821,27 +19495,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskList" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string" } } } @@ -19862,14 +19516,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/delete": { - "post": { + "/projects/{projectId}/files/{fileId}/versions": { + "get": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Deletes the task list with the specified id.", - "description": "To delete project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListDeleteByProjectIdAndTaskListId", + "summary": "Returns all file versions of the specified project file.", + "description": "Returns all file versions of the specified project file.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectFileVersions", "parameters": [ { "name": "projectId", @@ -19882,47 +19536,38 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The task List Delete form.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskListDeleteForm" - } - } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + { + "$ref": "#/components/parameters/page" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + { + "$ref": "#/components/parameters/pageSize" }, - "404": { - "description": "Not Found", + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileVersion" + } } } } @@ -19941,16 +19586,14 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/tasklists/{taskListId}/removetasks": { + }, "post": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Removes the tasks from the task list with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListRemoveTasksByProjectIdAndTaskListId", + "summary": "Uploads a new version of the project file with the specified id.", + "description": "Uploads a new version of an project file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateProjectFileVersion", "parameters": [ { "name": "projectId", @@ -19963,9 +19606,9 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -19974,23 +19617,41 @@ } ], "requestBody": { - "description": "The id of the tasks.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" } } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileVersion" + } + } + } + }, + "400": { + "description": "Bad Request" } }, "security": [ @@ -20008,14 +19669,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/setarchived": { - "post": { - "tags": [ - "TaskLists" + "/projects/{projectId}/files/{fileId}/versions/{versionId}": { + "get": { + "tags": [ + "Project Files" ], - "summary": "Archives or unarchives the task list with the specified id.", - "description": "Archives or unarchives the task list with the specified id.\r\n An archived task list still exists but is not editable anymore.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListSetArchivedByProjectIdAndTaskListId", + "summary": "Returns the project file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByProjectNameAndProjectIdAndFileIdAndVersionId", "parameters": [ { "name": "projectId", @@ -20028,9 +19689,19 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", "required": true, "schema": { "type": "string", @@ -20038,34 +19709,13 @@ } } ], - "requestBody": { - "description": "The archived Task List form.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ArchivedTaskListForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskList" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileVersion" } } } @@ -20106,14 +19756,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/tasks/{taskId}": { + "/projects/{projectId}/files/{fileId}/versions/{versionId}/download": { "get": { "tags": [ - "TaskLists" + "ProjectFiles" ], - "summary": "Returns the task with the specified id in the task list with the specified id.", - "description": "To get a task in a project task list, the user needs read permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTaskListTaskByProjectIdAndTaskListIdAndTaskId", + "summary": "Returns the content of the project file version with the specified id.", + "description": "Returns the content of the project file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectFileVersionContent", "parameters": [ { "name": "projectId", @@ -20126,9 +19776,9 @@ } }, { - "name": "taskListId", + "name": "fileId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -20136,9 +19786,9 @@ } }, { - "name": "taskId", + "name": "versionId", "in": "path", - "description": "The id of the task.", + "description": "The id of the file version.", "required": true, "schema": { "type": "string", @@ -20152,10 +19802,62 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "type": "string", + "format": "binary" } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projects/{projectId}/linkcustomfielddefinition": { + "post": { + "tags": [ + "CustomFields" + ], + "summary": "Links a custom field definition to the specified project.", + "description": "The user must have `project-master-data:write` permissions or `write` permissions on the specified project.", + "operationId": "PostProjectLinkCustomFieldDefinitionByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model used to link the custom field definition.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkCustomFieldDefinitionForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -20203,14 +19905,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/tasks/{taskId}/updateorder": { + "/projects/{projectId}/linkworkflow": { "post": { "tags": [ - "TaskLists" + "Workflows" ], - "summary": "Updates the order of a task in a task list.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListTaskUpdateOrderByProjectIdAndTaskListIdAndTaskId", + "summary": "Links a workflow to a project.", + "description": "Links the specified workflow to the project, migrating existing statuses\r\n using the provided mapping. If the project has no existing statuses,\r\n workflow statuses are automatically assigned.\r\n If the project is already linked to a workflow, switching to a new workflow\r\n is supported when proper status mappings are provided.\r\n To link a workflow to a project the user must have `project-master-data:write` permissions on the specified project or be the project creator.", + "operationId": "PostProjectLinkWorkflowByProjectId", "parameters": [ { "name": "projectId", @@ -20221,34 +19923,14 @@ "type": "string", "format": "uuid" } - }, - { - "name": "taskListId", - "in": "path", - "description": "The id of the task list.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { - "description": "The task In Task List Update Order form.", + "description": "The link workflow form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskInTaskListUpdateOrderForm" + "$ref": "#/components/schemas/LinkWorkflowForm" } } }, @@ -20260,10 +19942,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ReorderingResult" - } + "$ref": "#/components/schemas/Project" } } } @@ -20287,6 +19966,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -20304,14 +19993,14 @@ } } }, - "/projects/{projectId}/tasklists/{taskListId}/updateorder": { - "post": { + "/projects/{projectId}/members": { + "get": { "tags": [ - "TaskLists" + "Projects" ], - "summary": "Updates the order of the task list with the specified id.", - "description": "To update the order of a project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTaskListUpdateOrderByProjectIdAndTaskListId", + "summary": "Returns the project members of the project with the specified id.", + "description": "Returns the project members of the project with the specified id.\r\n \r\n The user has to be the creator of the project or needs `read` permissions of the feature `project-master-data`.", + "operationId": "GetProjectMembersByProjectId", "parameters": [ { "name": "projectId", @@ -20322,33 +20011,22 @@ "type": "string", "format": "uuid" } - }, - { - "name": "taskListId", - "in": "path", - "description": "The id of the task list.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "description": "The update Order form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrderForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectMember" + } + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "401": { "description": "Unauthorized", "content": { @@ -20385,14 +20063,14 @@ } } }, - "/projects/{projectId}/taskstatuses": { + "/projects/{projectId}/milestones": { "get": { "tags": [ - "TaskStatuses" + "ProjectMilestones" ], - "summary": "Returns all task statuses of the project with the specified id.", - "description": "Returns all task statuses relevant to the project with the specified id. If the project is linked to a workflow, the workflow's task statuses are returned.\r\n The user must have either `project-master-data:read` permissions or be assigned to a task on the specified project.", - "operationId": "GetProjectTaskStatusesByProjectId", + "summary": "Returns all project milestones of the specified project.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectMilestonesByProjectId", "parameters": [ { "name": "projectId", @@ -20403,6 +20081,65 @@ "type": "string", "format": "uuid" } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectMilestone" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projects/{projectId}/projectstatuses": { + "get": { + "tags": [ + "ProjectStatuses" + ], + "summary": "Returns all project statuses of the project with the specified id.", + "description": "Returns all project statuses relevant to the project with the specified id. If the project is linked to a workflow, the workflow's project statuses are returned.\r\n The user must either be admin, have `project-master-data:read` permissions or be the creator of the project.", + "operationId": "GetProjectProjectStatusesByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, { "$ref": "#/components/parameters/page" @@ -20425,7 +20162,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/ProjectStatus" } } } @@ -20468,11 +20205,11 @@ }, "post": { "tags": [ - "TaskStatuses" + "ProjectStatuses" ], - "summary": "Creates a new task status for the specified project.", - "description": "The user must either have `project-planning-data:write` permissions or be creator of the project.", - "operationId": "PostProjectTaskStatusesByProjectId", + "summary": "Creates a project status for a project.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectProjectStatusesByProjectId", "parameters": [ { "name": "projectId", @@ -20486,11 +20223,11 @@ } ], "requestBody": { - "description": "The model used to create the task status.", + "description": "The model to create the project status.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatusForm" + "$ref": "#/components/schemas/ProjectStatusForm" } } }, @@ -20502,7 +20239,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/ProjectStatus" } } } @@ -20553,14 +20290,14 @@ } } }, - "/projects/{projectId}/taskstatuses/{taskStatusId}": { + "/projects/{projectId}/projecttasks": { "get": { "tags": [ - "TaskStatuses" + "ProjectTasks" ], - "summary": "Returns the specified task status of a project.", - "description": "The user must either have 'project-master-data:write' permissions or be the owner of the project.", - "operationId": "GetProjectTaskStatusByProjectIdAndTaskStatusId", + "summary": "Returns all project tasks of the project with the specified id.", + "description": "The user must have `project-planning-data:read` permissions, otherwise only assigned tasks will be returned.", + "operationId": "GetProjectProjectTasksByProjectId", "parameters": [ { "name": "projectId", @@ -20573,14 +20310,16 @@ } }, { - "name": "taskStatusId", - "in": "path", - "description": "The id of the task status.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -20589,17 +20328,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskModel" + } } } } @@ -20628,14 +20360,16 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/projects/{projectId}/projecttasks/{taskId}": { + "get": { "tags": [ - "TaskStatuses" + "ProjectTasks" ], - "summary": "Updates a task status for the specified project.", - "description": "The status type cannot be changed if it is the last status of type 'todo' or 'done'.\r\n \r\n The user must either have `project-planning-data:write` permissions or be creator of the project.", - "operationId": "PutProjectTaskStatusByProjectIdAndTaskStatusId", + "summary": "Returns the project task with the specified id.", + "description": "The user must have either `project-planning-data:read` permissions or be assigned to the project task.", + "operationId": "GetProjectProjectTaskByProjectIdAndTaskId", "parameters": [ { "name": "projectId", @@ -20648,9 +20382,9 @@ } }, { - "name": "taskStatusId", + "name": "taskId", "in": "path", - "description": "The id of the task status to update.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -20658,34 +20392,13 @@ } } ], - "requestBody": { - "description": "The tmodel containing the task status data.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskStatusForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskModel" } } } @@ -20726,14 +20439,14 @@ } } }, - "/projects/{projectId}/taskstatuses/{taskStatusId}/delete": { + "/projects/{projectId}/projecttasks/{taskId}/changeproject": { "post": { "tags": [ - "TaskStatuses" + "ProjectTasks" ], - "summary": "Deletes the task status with the specified id.", - "description": "If the status to delete is still used by tasks, another task status to move the tasks to must be provided.\r\n The last status of type 'todo' or 'done' cannot be deleted.\r\n The user must either have `project-planning-data:write` permissions or must be creator of the project.", - "operationId": "PostProjectTaskStatusDeleteByProjectIdAndTaskStatusId", + "summary": "Changes the project of the task with the specified id.", + "description": "Changes the project of the task with the specified id.\r\n This call also moves all subtasks of the task to the new project.\r\n This also changes the tracked time sum of the new project and the previous project.\r\n The related time entries of this task will also be moved to the new project.\r\n The user must have `project-planning-data:write` permissions on both projects.", + "operationId": "PostProjectProjectTaskChangeProjectByProjectIdAndTaskId", "parameters": [ { "name": "projectId", @@ -20746,9 +20459,9 @@ } }, { - "name": "taskStatusId", + "name": "taskId", "in": "path", - "description": "The id of the task status.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -20757,11 +20470,11 @@ } ], "requestBody": { - "description": "The model containing the id of the new task status to move tasks to.", + "description": "The model to change the project of the task.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatusDeleteForm" + "$ref": "#/components/schemas/ChangeProjectForm" } } }, @@ -20817,14 +20530,14 @@ } } }, - "/projects/{projectId}/timeentries": { + "/projects/{projectId}/projecttasks/{taskId}/checklistitems": { "get": { "tags": [ - "TimeEntries" + "ChecklistItems" ], - "summary": "Returns all time entries of the specified project.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTimeEntries", + "summary": "Returns the checklist items for a project task with the specified id.", + "description": "The user must have either `project-planning-data:read` permissions or be assigned to the project task.", + "operationId": "GetProjectProjectTaskChecklistItemsByProjectIdAndTaskId", "parameters": [ { "name": "projectId", @@ -20837,61 +20550,9 @@ } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TimeTracking" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/projects/{projectId}/typeofwork": { - "get": { - "tags": [ - "ProjectTasks" - ], - "summary": "Returns the type of work for the project with the specified id.", - "description": "The project can be a connected or a workspace project.\r\n User must have at least 'read' permissions on the 'project-planning-data' feature.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTypesOfWorkByProjectId", - "parameters": [ - { - "name": "projectId", + "name": "taskId", "in": "path", - "description": "The id of the project.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -20907,7 +20568,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TypeOfWork" + "$ref": "#/components/schemas/ChecklistItem" } } } @@ -20949,47 +20610,53 @@ } } }, - "/projects/{projectId}/unlinkcustomfielddefinition": { - "post": { + "/projects/{projectId}/projecttasks/{taskId}/checklistitems/{checklistItemId}": { + "get": { "tags": [ - "CustomFields" + "ChecklistItems" ], - "summary": "Unlinks a custom field definition from the specified project.", - "description": "When the definition is unlinked from a project, all values of the custom field will be removed from the tasks within that project.\r\n \r\n The user must have `project-master-data:write` permissions or `write` permissions on the specified project.", - "operationId": "PostProjectUnlinkCustomFieldDefinitionByProjectId", + "summary": "Retrieves a checklist item from a project task.", + "description": "The user must have either `project-planning-data:read` permissions or be assigned to the project task.", + "operationId": "GetProjectProjectTaskChecklistItemByProjectIdAndTaskIdAndChecklistItemId", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project to unlink the custom field definition from.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The model describing the custom field definition to unlink.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnlinkCustomFieldDefinitionForm" - } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ChecklistItem" } } } @@ -21030,14 +20697,14 @@ } } }, - "/projects/{projectId}/unlinkworkflow": { + "/projects/{projectId}/removeprojectmember": { "post": { "tags": [ - "Workflows" + "Projects" ], - "summary": "Unlinks a workflow from a project.", - "description": "Unlinks the workflow from the project, cloning workflow statuses\r\n to local project-specific statuses. Custom fields and automations\r\n remain but become editable (no longer synced with workflow).\r\n To unlink a workflow from a project the user must have `project-master-data:write` permissions on the specified project or be the project creator.", - "operationId": "PostProjectUnlinkWorkflowByProjectId", + "summary": "Removes a project member from the project with the specified id.", + "description": "Removes a project member from the project with the specified id.\r\n \r\n The user has to be the creator of the project or needs `manage` permissions of the feature `project-master-data`.", + "operationId": "PostProjectRemoveProjectMemberByProjectId", "parameters": [ { "name": "projectId", @@ -21050,17 +20717,21 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Project" - } + "requestBody": { + "description": "The model to remove the project member.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectMemberRemoveForm" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad Request", "content": { @@ -21107,14 +20778,14 @@ } } }, - "/projects/{projectId}/updateprojectmember": { - "post": { + "/projects/{projectId}/retainers": { + "get": { "tags": [ - "ProjectMembers" + "Retainers" ], - "summary": "Updates the role of a project member of the project with the specified id.", - "description": "Changes the role of a project member.\r\n The project member can also be set as a responsible project member, but only if no other member of this project is\r\n responsible.\r\n It is necessary that the project role is available in this project, otherwise the member cannot be updated.\r\n A project role is available when they are connected to the specified project type of the project.\r\n \r\n The user has to be the creator or needs `project-master-data:manage` permissions on the project.", - "operationId": "PostProjectUpdateProjectMemberByProjectId", + "summary": "Endpoint to get all retainers for a project.", + "description": "The user must have the ProjectMasterData read permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectRetainersByProjectId", "parameters": [ { "name": "projectId", @@ -21125,26 +20796,30 @@ "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model containing updated project member details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectMemberForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMember" + "type": "array", + "items": { + "$ref": "#/components/schemas/Retainer" + } } } } @@ -21163,21 +20838,19 @@ "x-access": { "any": "true" } - } - }, - "/projects/{projectId}/updateprojectstatusorder": { + }, "post": { "tags": [ - "Projects" + "Retainers" ], - "summary": "Updates the order of a project status.", - "description": "Updates the order of a project status.\r\n\r\nAny authenticated user.", - "operationId": "PostProjectUpdateProjectStatusOrderByProjectId", + "summary": "Endpoint to create a new retainer for a project.", + "description": "As soon as a retainer is created for a project, the project will be marked as a retainer project.\r\n Based on the Start and End dates of the retainer, the retainer budgets will be created automatically.\r\n Retainers cannot overlap. There can only be one active retainer per project at a time (no end date and/or including the current date).\r\n \r\n The user needs to have the ProjectMasterData write permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectRetainersByProjectId", "parameters": [ { "name": "projectId", "in": "path", - "description": "The id of the project.", + "description": "The id of the project to create a retainer for.", "required": true, "schema": { "type": "string", @@ -21186,19 +20859,26 @@ } ], "requestBody": { - "description": "The model to update the project status order.", + "description": "The model to create a retainer.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateProjectStatusOrderForm" + "$ref": "#/components/schemas/RetainerForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Retainer" + } + } + } }, "400": { "description": "Bad Request", @@ -21236,50 +20916,39 @@ } } }, - "/projectstatuses": { - "get": { + "/projects/{projectId}/retainers/{retainerId}": { + "delete": { "tags": [ - "ProjectStatuses" + "Retainers" ], - "summary": "Returns all project statuses.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectStatuses", + "summary": "Endpoint to delete a retainer for a project. Deletes all related retainer budgets.", + "description": "The user must have the ProjectMasterData write permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectRetainerByProjectIdAndRetainerId", "parameters": [ { - "name": "showArchived", - "in": "query", - "description": "Whether to include archived project statuses.", + "name": "projectId", + "in": "path", + "description": "The id of the project.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "retainerId", + "in": "path", + "description": "The id of the retainer.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectStatus" - } - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -21291,8 +20960,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -21315,21 +20984,29 @@ "x-access": { "any": "true" } - } - }, - "/projectstatuses/{projectStatusId}": { + }, "get": { "tags": [ - "ProjectStatuses" + "Retainers" ], - "summary": "Returns the project status with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectStatusById", + "summary": "Endpoint to get a retainer for a project by id.", + "description": "The user must have the ProjectMasterData read permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectRetainerByProjectIdAndRetainerId", "parameters": [ { - "name": "projectStatusId", + "name": "projectId", "in": "path", - "description": "The id of the project status.", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "retainerId", + "in": "path", + "description": "The id of the retainer.", "required": true, "schema": { "type": "string", @@ -21343,27 +21020,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatus" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Retainer" } } } @@ -21395,16 +21052,26 @@ }, "put": { "tags": [ - "ProjectStatuses" + "Retainers" ], - "summary": "Updates an existing project status.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutProjectStatusById", + "summary": "Endpoint to update the retainer for a project.", + "description": "Date changes must not overlap another retainer for the project. The retainer period cannot be changed.\r\n \r\n The user needs to have the ProjectMasterData write permission for the project to access this endpoint.\r\n\r\nAny authenticated user.", + "operationId": "PutProjectRetainerByProjectIdAndRetainerId", "parameters": [ { - "name": "projectStatusId", + "name": "projectId", "in": "path", - "description": "The id of the project status.", + "description": "The id of the project to update the retainer for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "retainerId", + "in": "path", + "description": "The id of the retainer.", "required": true, "schema": { "type": "string", @@ -21413,11 +21080,11 @@ } ], "requestBody": { - "description": "The model to update the project status.", + "description": "The model to update the retainer.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatusForm" + "$ref": "#/components/schemas/RetainerForm" } } }, @@ -21429,7 +21096,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatus" + "$ref": "#/components/schemas/Retainer" } } } @@ -21444,16 +21111,6 @@ } } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -21480,19 +21137,19 @@ } } }, - "/projectstatuses/{projectStatusId}/delete": { + "/projects/{projectId}/setcustomfields": { "post": { "tags": [ - "ProjectStatuses" + "CustomFields" ], - "summary": "Deletes a project status.", + "summary": "Sets custom field values for a project.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectStatusDeleteByProjectStatusId", + "operationId": "PostProjectSetCustomFieldsByProjectId", "parameters": [ { - "name": "projectStatusId", + "name": "projectId", "in": "path", - "description": "The id of the project status to delete.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -21501,11 +21158,14 @@ } ], "requestBody": { - "description": "The model to delete the project status.", + "description": "The list of custom field values to set.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatusDeleteForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldPostForm" + } } } }, @@ -21561,19 +21221,19 @@ } } }, - "/projectstatuses/{projectStatusId}/setarchived": { + "/projects/{projectId}/setprojectkey": { "post": { "tags": [ - "ProjectStatuses" + "Projects" ], - "summary": "Sets the archived flag for a project status.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectStatusSetArchivedByProjectStatusId", + "summary": "Updates the project key for the specified project and all associated task identifiers.", + "description": "The project key must be unique within the workspace and follow these rules:\r\n - Only uppercase letters (A-Z), numbers (0-9), and dashes (-)\r\n - Between 1 and 32 characters\r\n - Not already in use by another active project in the workspace\r\n \r\n This operation will also update all task identifiers for tasks in this project\r\n (e.g., OLDKEY-123 becomes NEWKEY-123). Task identifiers are updated in batches\r\n to ensure audit logs and websocket events are triggered properly.\r\n \r\n Note: The project key update is now transactional with automatic retry on race conditions.\r\n If multiple concurrent requests try to update the same project key, the service will\r\n retry with exponential backoff (100ms, 200ms, 400ms) for up to 3 attempts.\r\n Task identifier updates are processed in batches as a background operation.\r\n \r\n Note: User-provided keys are not subject to profanity filtering. Users can set any key they choose.\r\n\r\nThe user must be an admin or have `project-master-data:write` permissions.", + "operationId": "PostProjectSetProjectKeyByProjectId", "parameters": [ { - "name": "projectStatusId", + "name": "projectId", "in": "path", - "description": "The id of the project status.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -21582,11 +21242,10 @@ } ], "requestBody": { - "description": "The model to set the archived flag for the project status.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchivedForm" + "$ref": "#/components/schemas/UpdateProjectKeyForm" } } }, @@ -21598,7 +21257,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatus" + "$ref": "#/components/schemas/Project" } } } @@ -21613,16 +21272,6 @@ } } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -21645,19 +21294,30 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-master-data": "write" } } }, - "/projecttemplates": { + "/projects/{projectId}/tags": { "get": { "tags": [ - "ProjectTemplates" + "ProjectTags" ], - "summary": "Retrieves all project templates.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplates", + "summary": "Returns the tags of the project with the specified id.", + "description": "To get the tags of a project the user must have `project-master-data:read` permissions on the specified project.", + "operationId": "GetProjectTagsByProjectId", "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project to get tags for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -21679,58 +21339,34 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ProjectTemplate" + "$ref": "#/components/schemas/BaseTagModel" } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "ProjectTemplates" - ], - "summary": "Creates a new project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplate", - "requestBody": { - "description": "The model to create the project template.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectTemplateForm" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectTemplate" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -21751,46 +21387,46 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/deletetags": { - "post": { + "/projects/{projectId}/taskdependencies": { + "get": { "tags": [ - "ProjectTemplateTags" + "TaskDependencies" + ], + "summary": "Returns all task dependencies for a specific project.", + "description": "To get all dependencies of a project, the user needs project planning permissions on that project.", + "operationId": "GetProjectTaskdependenciesByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Removes a tag from all project templates.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplatesDeleteTags", - "requestBody": { - "description": "The model to remove the tag from all project templates.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteTagForm" - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskDependency" + } } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -21811,19 +21447,51 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/tags": { + "/projects/{projectId}/tasklists": { "get": { "tags": [ - "ProjectTemplateTags" + "TaskLists" + ], + "summary": "Returns all task lists of the project with the specified id.", + "description": "The permission check in this function is dynamically based on the entity name.\r\n In the cases where the user tries to get the project task lists,\r\n the user needs read permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTaskListsByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "showArchived", + "in": "query", + "description": "The show Archived.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } ], - "summary": "Returns all tags currently in use by project templates.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplatesTags", "responses": { "200": { "description": "OK", @@ -21832,7 +21500,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/TaskList" } } } @@ -21862,30 +21530,47 @@ "x-access": { "any": "true" } - } - }, - "/projecttemplates/updatetags": { + }, "post": { "tags": [ - "ProjectTemplateTags" + "TaskLists" + ], + "summary": "Creates a new task list.", + "description": "To create a new project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListsByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Updates a tag globally for all project templates.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateUpdateTags", "requestBody": { - "description": "The model containing the tag updates.", + "description": "The task List form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TagUpdateForm" + "$ref": "#/components/schemas/TaskListForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskList" + } + } + } }, "400": { "description": "Bad Request", @@ -21906,6 +21591,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -21919,63 +21614,33 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}": { - "delete": { + "/projects/{projectId}/tasklists/{taskListId}": { + "get": { "tags": [ - "ProjectTemplates" + "TaskLists" ], - "summary": "Deletes a project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteProjectTemplateById", + "summary": "Returns the task list with the specified id.", + "description": "The permission check in this function is dynamically based on the entity name.\r\n In the cases where the user tries to get the project task lists,\r\n the user needs read permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTaskListByProjectIdAndTaskListId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template to delete.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "project-manage-config": "write" - } - }, - "get": { - "tags": [ - "ProjectTemplates" - ], - "summary": "Retrieves a specific project template.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateById", - "parameters": [ + }, { - "name": "projectTemplateId", + "name": "taskListId", "in": "path", - "description": "The id of the project template to retrieve.", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -21989,17 +21654,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectTemplate" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskList" } } } @@ -22021,16 +21676,26 @@ }, "put": { "tags": [ - "ProjectTemplates" + "TaskLists" ], - "summary": "Updates an existing project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTemplateById", + "summary": "Updates the task list with the specified id.", + "description": "To update a project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "PutProjectTaskListByProjectIdAndTaskListId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskListId", + "in": "path", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22039,11 +21704,11 @@ } ], "requestBody": { - "description": "The model to update the project template.", + "description": "The task List Put form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectTemplateForm" + "$ref": "#/components/schemas/TaskListPutForm" } } }, @@ -22055,7 +21720,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectTemplate" + "$ref": "#/components/schemas/TaskList" } } } @@ -22070,8 +21735,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -22092,24 +21757,33 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/addtags": { + "/projects/{projectId}/tasklists/{taskListId}/addtasks": { "post": { "tags": [ - "ProjectTemplateTags" + "TaskLists" ], - "summary": "Adds a batch of tags to the project template with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateAddTagsByProjectTemplateId", + "summary": "Adds the tasks to the task list with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListAddTasksByProjectIdAndTaskListId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template to add tags to.", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskListId", + "in": "path", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22118,13 +21792,13 @@ } ], "requestBody": { - "description": "The model containing the tags to add.", + "description": "The task To Task List list.", "content": { "application/json": { "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TagForm" + "$ref": "#/components/schemas/TaskToTaskList" } } } @@ -22139,7 +21813,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/ReorderingResult" } } } @@ -22154,26 +21828,6 @@ } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -22187,24 +21841,33 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/automations": { - "get": { + "/projects/{projectId}/tasklists/{taskListId}/changeproject": { + "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Returns all automations for a project template.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateAutomations", + "summary": "Changes the project of the task list with the specified id.", + "description": "This endpoint also moves all tasks and time entries to the new project.\r\n This will also change the tracked time sum of the old and new projects.\r\n The task status mapping will move all tasks of a certain status to the new provided status on the mapping.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListChangeProjectByProjectIdAndTaskListId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskListId", + "in": "path", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22212,19 +21875,20 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Automation" - } - } + "requestBody": { + "description": "The change Project form For Task Lists.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeProjectFormForTaskLists" } } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" } }, "security": [ @@ -22240,19 +21904,31 @@ "x-access": { "any": "true" } - }, + } + }, + "/projects/{projectId}/tasklists/{taskListId}/copy": { "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Creates a new automation for a given project template.", - "description": "Creates a new automation of the project template with the specified id.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateAutomation", + "summary": "Creates a copy of the task list.", + "description": "A new task list will be created with the same name as the original one.\r\n All tasks and subtasks will also be copied in this operation.\r\n Comments, files and activity logs are not copied.\r\n To copy a task list, the user needs to have 'ProjectPlanning'\r\n permissions in general or in the project the task list belongs to.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListCopyByProjectIdAndTaskListId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskListId", + "in": "path", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22260,30 +21936,29 @@ } } ], - "requestBody": { - "description": "The model to create the automation.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationTriggerForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/TaskList" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -22304,24 +21979,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/automations/{automationId}": { - "delete": { + "/projects/{projectId}/tasklists/{taskListId}/delete": { + "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Deletes the specified automation for a given projecttemplate.", - "description": "Deletes the specified automation with its trigger and all its values.\r\n To delete the the automation the user needs to have 'write' permissions of\r\n the feature 'project-manage-config' globally.\r\n If the 'removeFromProject' boolean is set to true, all automations in projects of that\r\n project template created from that automation template are deleted aswell.\r\n Automations created from a workflow cannot be deleted via this endpoint.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteProjectTemplateAutomation", + "summary": "Deletes the task list with the specified id.", + "description": "To delete project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListDeleteByProjectIdAndTaskListId", "parameters": [ { - "name": "automationId", + "name": "projectId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22329,31 +22003,43 @@ } }, { - "name": "projectTemplateId", + "name": "taskListId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "removeFromProjects", - "in": "query", - "description": "Whether to delete the automation also from all projects of the projecttemplate.", - "required": true, - "schema": { - "type": "boolean" - } } ], + "requestBody": { + "description": "The task List Delete form.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskListDeleteForm" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -22374,22 +22060,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - }, - "get": { + } + }, + "/projects/{projectId}/tasklists/{taskListId}/removetasks": { + "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Returns a specific automation for a projecttemplate.", - "description": "Returns a specific automation of the projecttemplate with the specified id.\r\n Returns NotFound if the automation doesnt exist.\r\n To get the the automation data the user needs to have 'read' permissions of\r\n the feature 'project-manage-config' globally.\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetProjectTemplateAutomation", + "summary": "Removes the tasks from the task list with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListRemoveTasksByProjectIdAndTaskListId", "parameters": [ { - "name": "automationId", + "name": "projectId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22397,9 +22084,9 @@ } }, { - "name": "projectTemplateId", + "name": "taskListId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22407,16 +22094,24 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Automation" + "requestBody": { + "description": "The id of the tasks.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" } } } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" } }, "security": [ @@ -22430,21 +22125,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "read" + "any": "true" } - }, - "put": { + } + }, + "/projects/{projectId}/tasklists/{taskListId}/setarchived": { + "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Updates the automation with the specified id for a given projecttemplate.", - "description": "Updates the specified automation for a specific projecttemplate.\r\n If the automation was created from a workflow, only the Enabled flag can be changed.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTemplateAutomation", + "summary": "Archives or unarchives the task list with the specified id.", + "description": "Archives or unarchives the task list with the specified id.\r\n An archived task list still exists but is not editable anymore.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListSetArchivedByProjectIdAndTaskListId", "parameters": [ { - "name": "automationId", + "name": "projectId", "in": "path", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22452,8 +22149,9 @@ } }, { - "name": "projectTemplateId", + "name": "taskListId", "in": "path", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22462,10 +22160,11 @@ } ], "requestBody": { + "description": "The archived Task List form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutomationPutForm" + "$ref": "#/components/schemas/ArchivedTaskListForm" } } }, @@ -22477,7 +22176,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/TaskList" } } } @@ -22491,6 +22190,26 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -22504,24 +22223,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/automations/{automationId}/actions": { + "/projects/{projectId}/tasklists/{taskListId}/tasks/{taskId}": { "get": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Gets the actions of an automation of a project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetProjectTemplateAutomationActions", + "summary": "Returns the task with the specified id in the task list with the specified id.", + "description": "To get a task in a project task list, the user needs read permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTaskListTaskByProjectIdAndTaskListIdAndTaskId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22529,9 +22247,19 @@ } }, { - "name": "automationId", + "name": "taskListId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the task list.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -22545,10 +22273,37 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Action" - } + "$ref": "#/components/schemas/TaskModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -22565,22 +22320,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "read" + "any": "true" } - }, + } + }, + "/projects/{projectId}/tasklists/{taskListId}/tasks/{taskId}/updateorder": { "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Creates a new action for an automation of a project template.", - "description": "Creates an action for a specific automation of a project template including all its values. Actions cannot be added to automations created from a workflow.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateAutomationAction", + "summary": "Updates the order of a task in a task list.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListTaskUpdateOrderByProjectIdAndTaskListIdAndTaskId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22588,9 +22344,19 @@ } }, { - "name": "automationId", + "name": "taskListId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the task list.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -22599,11 +22365,11 @@ } ], "requestBody": { - "description": "The model to create an action.", + "description": "The task In Task List Update Order form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionForm" + "$ref": "#/components/schemas/TaskInTaskListUpdateOrderForm" } } }, @@ -22615,7 +22381,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "type": "array", + "items": { + "$ref": "#/components/schemas/ReorderingResult" + } } } } @@ -22629,6 +22398,16 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -22642,34 +22421,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/automations/{automationId}/actions/{actionId}": { - "delete": { + "/projects/{projectId}/tasklists/{taskListId}/updateorder": { + "post": { "tags": [ - "Project Template Automations" + "TaskLists" ], - "summary": "Deletes an action for an automation of a project template.", - "description": "Deletes an action for a specific automation of a project template including all its values. Actions of automations created from a workflow cannot be deleted.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteProjectTemplateAutomationAction", + "summary": "Updates the order of the task list with the specified id.", + "description": "To update the order of a project task list, the user needs manage permissions on the project-planning-data feature.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTaskListUpdateOrderByProjectIdAndTaskListId", "parameters": [ { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", + "name": "projectId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22677,9 +22445,9 @@ } }, { - "name": "actionId", + "name": "taskListId", "in": "path", - "description": "The id of the action.", + "description": "The id of the task list.", "required": true, "schema": { "type": "string", @@ -22687,12 +22455,33 @@ } } ], + "requestBody": { + "description": "The update Order form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrderForm" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -22713,22 +22502,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - }, + } + }, + "/projects/{projectId}/taskstatuses": { "get": { "tags": [ - "Project Template Automations" + "TaskStatuses" ], - "summary": "Gets a specific action for an automation of a projecttemplate.", - "description": "Returns a specific action for a specific automation of a project template including all its values.\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetProjectTemplateAutomationAction", + "summary": "Returns all task statuses of the project with the specified id.", + "description": "Returns all task statuses relevant to the project with the specified id. If the project is linked to a workflow, the workflow's task statuses are returned.\r\n The user must have either `project-master-data:read` permissions or be assigned to a task on the specified project.", + "operationId": "GetProjectTaskStatusesByProjectId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22736,24 +22526,16 @@ } }, { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "actionId", - "in": "path", - "description": "The id of the action.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -22762,7 +22544,30 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskStatus" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -22779,42 +22584,21 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "read" + "any": "true" } }, - "put": { + "post": { "tags": [ - "Project Template Automations" + "TaskStatuses" ], - "summary": "Updates a specifc action of an automation of a project template.", - "description": "Returns an updated action for a specific automation of a project template including all its values. Actions of automations created from a workflow cannot be modified.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTemplateAutomationAction", + "summary": "Creates a new task status for the specified project.", + "description": "The user must either have `project-planning-data:write` permissions or be creator of the project.", + "operationId": "PostProjectTaskStatusesByProjectId", "parameters": [ { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "description": "The id of the automation.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "actionId", + "name": "projectId", "in": "path", - "description": "The id of the action.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22823,11 +22607,11 @@ } ], "requestBody": { - "description": "The model to update an action.", + "description": "The model used to create the task status.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionForm" + "$ref": "#/components/schemas/TaskStatusForm" } } }, @@ -22839,7 +22623,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/TaskStatus" } } } @@ -22853,6 +22637,26 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -22866,34 +22670,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/automations/{automationId}/actions/{actionId}/updateorder": { - "post": { + "/projects/{projectId}/taskstatuses/{taskStatusId}": { + "get": { "tags": [ - "Project Template Automations" + "TaskStatuses" ], - "summary": "Updates the order of a project template automation action.", - "description": "Actions of automations created from a workflow cannot be modified.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostUpdateProjectTemplateAutomationActionOrder", + "summary": "Returns the specified task status of a project.", + "description": "The user must either have 'project-master-data:write' permissions or be the owner of the project.", + "operationId": "GetProjectTaskStatusByProjectIdAndTaskStatusId", "parameters": [ { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", + "name": "projectId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22901,9 +22694,9 @@ } }, { - "name": "actionId", + "name": "taskStatusId", "in": "path", - "description": "The id of the action.", + "description": "The id of the task status.", "required": true, "schema": { "type": "string", @@ -22911,23 +22704,29 @@ } } ], - "requestBody": { - "description": "The model to update the order.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrderForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatus" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -22948,24 +22747,21 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - } - }, - "/projecttemplates/{projectTemplateId}/automations/{automationId}/reapply": { - "post": { + }, + "put": { "tags": [ - "Project Template Automations" + "TaskStatuses" ], - "summary": "Reapplies the automation to all projects of this specific project template.", - "description": "Returns NotFound if the automation doesnt exist.\r\n To execute this you need to have 'write' permissions of\r\n the feature 'project-manage-config' globally.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostReapplyProjectTemplateAutomation", + "summary": "Updates a task status for the specified project.", + "description": "The status type cannot be changed if it is the last status of type 'todo' or 'done'.\r\n \r\n The user must either have `project-planning-data:write` permissions or be creator of the project.", + "operationId": "PutProjectTaskStatusByProjectIdAndTaskStatusId", "parameters": [ { - "name": "automationId", + "name": "projectId", "in": "path", - "description": "The id of the automation.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -22973,9 +22769,9 @@ } }, { - "name": "projectTemplateId", + "name": "taskStatusId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the task status to update.", "required": true, "schema": { "type": "string", @@ -22983,57 +22779,44 @@ } } ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "project-manage-config": "write" - } - } - }, - "/projecttemplates/{projectTemplateId}/customfielddefinitions": { - "get": { - "tags": [ - "CustomFields" - ], - "summary": "Returns all custom field definitions linked to the specified project template, including definitions linked via a workflow.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateCustomFieldDefinitionsByProjectTemplateId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "requestBody": { + "description": "The tmodel containing the task status data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatusForm" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" - } + "$ref": "#/components/schemas/TaskStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23064,19 +22847,19 @@ } } }, - "/projecttemplates/{projectTemplateId}/customfielddefinitions/{customFieldDefinitionId}": { - "put": { + "/projects/{projectId}/taskstatuses/{taskStatusId}/delete": { + "post": { "tags": [ - "CustomFields" + "TaskStatuses" ], - "summary": "Updates the order of a custom field definition for the specified project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTemplateCustomFieldDefinitionByProjectTemplateIdAndCustomFieldDefinitionId", + "summary": "Deletes the task status with the specified id.", + "description": "If the status to delete is still used by tasks, another task status to move the tasks to must be provided.\r\n The last status of type 'todo' or 'done' cannot be deleted.\r\n The user must either have `project-planning-data:write` permissions or must be creator of the project.", + "operationId": "PostProjectTaskStatusDeleteByProjectIdAndTaskStatusId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -23084,9 +22867,9 @@ } }, { - "name": "customFieldDefinitionId", + "name": "taskStatusId", "in": "path", - "description": "The id of the custom field definition.", + "description": "The id of the task status.", "required": true, "schema": { "type": "string", @@ -23095,23 +22878,36 @@ } ], "requestBody": { - "description": "The model used to update the order of the custom field definition.", + "description": "The model containing the id of the new task status to move tasks to.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldOrderPutForm" + "$ref": "#/components/schemas/TaskStatusDeleteForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldOrderForm" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23138,58 +22934,102 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/deletetags": { - "post": { + "/projects/{projectId}/timeentries": { + "get": { "tags": [ - "ProjectTemplateTags" + "TimeEntries" ], - "summary": "Removes tags from the project template with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateDeleteTagsByProjectTemplateId", + "summary": "Returns all time entries of the specified project.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTimeEntries", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template to remove tags from.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model containing the tags to delete.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DeleteTagForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TimeTracking" + } } } } - }, - "required": true + } }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projects/{projectId}/typeofwork": { + "get": { + "tags": [ + "ProjectTasks" + ], + "summary": "Returns the type of work for the project with the specified id.", + "description": "The project can be a connected or a workspace project.\r\n User must have at least 'read' permissions on the 'project-planning-data' feature.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTypesOfWorkByProjectId", + "parameters": [ + { + "name": "projectId", + "in": "path", + "description": "The id of the project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "204": { - "description": "No Content" - }, - "207": { - "description": "Multi-Status" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TypeOfWork" + } } } } @@ -23226,24 +23066,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/linkcustomfielddefinition": { + "/projects/{projectId}/unlinkcustomfielddefinition": { "post": { "tags": [ "CustomFields" ], - "summary": "Links a custom field definition to the specified project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateLinkCustomFieldDefinitionByProjectTemplateId", + "summary": "Unlinks a custom field definition from the specified project.", + "description": "When the definition is unlinked from a project, all values of the custom field will be removed from the tasks within that project.\r\n \r\n The user must have `project-master-data:write` permissions or `write` permissions on the specified project.", + "operationId": "PostProjectUnlinkCustomFieldDefinitionByProjectId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project to unlink the custom field definition from.", "required": true, "schema": { "type": "string", @@ -23252,11 +23091,11 @@ } ], "requestBody": { - "description": "The model used to link the custom field definition.", + "description": "The model describing the custom field definition to unlink.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/LinkCustomFieldDefinitionForm" + "$ref": "#/components/schemas/UnlinkCustomFieldDefinitionForm" } } }, @@ -23276,6 +23115,16 @@ } } }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -23298,41 +23147,28 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/milestones": { - "get": { + "/projects/{projectId}/unlinkworkflow": { + "post": { "tags": [ - "ProjectMilestoneTemplates" + "Workflows" ], - "summary": "Returns all milestone templates of the given project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetProjectTemplateMilestonesByProjectTemplateId", + "summary": "Unlinks a workflow from a project.", + "description": "Unlinks the workflow from the project, cloning workflow statuses\r\n to local project-specific statuses. Custom fields and automations\r\n remain but become editable (no longer synced with workflow).\r\n To unlink a workflow from a project the user must have `project-master-data:write` permissions on the specified project or be the project creator.", + "operationId": "PostProjectUnlinkWorkflowByProjectId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -23341,10 +23177,37 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectMilestoneTemplate" - } + "$ref": "#/components/schemas/Project" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23361,22 +23224,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "read" + "any": "true" } - }, + } + }, + "/projects/{projectId}/updateprojectmember": { "post": { "tags": [ - "ProjectMilestoneTemplates" + "ProjectMembers" ], - "summary": "Creates a new milestone template for the given project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateMilestonesByProjectTemplateId", + "summary": "Updates the role of a project member of the project with the specified id.", + "description": "Changes the role of a project member.\r\n The project member can also be set as a responsible project member, but only if no other member of this project is\r\n responsible.\r\n It is necessary that the project role is available in this project, otherwise the member cannot be updated.\r\n A project role is available when they are connected to the specified project type of the project.\r\n \r\n The user has to be the creator or needs `project-master-data:manage` permissions on the project.", + "operationId": "PostProjectUpdateProjectMemberByProjectId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -23385,11 +23249,11 @@ } ], "requestBody": { - "description": "The model containing milestone template details.", + "description": "The model containing updated project member details.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestoneTemplateForm" + "$ref": "#/components/schemas/ProjectMemberForm" } } }, @@ -23401,7 +23265,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestoneTemplate" + "$ref": "#/components/schemas/ProjectMember" } } } @@ -23418,34 +23282,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/milestones/{milestoneId}": { - "delete": { + "/projects/{projectId}/updateprojectstatusorder": { + "post": { "tags": [ - "ProjectMilestoneTemplates" + "Projects" ], - "summary": "Deletes a milestone for the given project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteProjectTemplateMilestoneByProjectTemplateIdAndMilestoneId", + "summary": "Updates the order of a project status.", + "description": "Updates the order of a project status.\r\n\r\nAny authenticated user.", + "operationId": "PostProjectUpdateProjectStatusOrderByProjectId", "parameters": [ { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "milestoneId", + "name": "projectId", "in": "path", - "description": "The id of the milestone.", + "description": "The id of the project.", "required": true, "schema": { "type": "string", @@ -23453,9 +23306,40 @@ } } ], + "requestBody": { + "description": "The model to update the project status order.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProjectStatusOrderForm" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -23469,37 +23353,39 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - }, + } + }, + "/projectstatuses": { "get": { "tags": [ - "ProjectMilestoneTemplates" + "ProjectStatuses" ], - "summary": "Returns a milestone by id for the given project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetProjectTemplateMilestoneByProjectTemplateIdAndMilestoneId", + "summary": "Returns all project statuses.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectStatuses", "parameters": [ { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, + "name": "showArchived", + "in": "query", + "description": "Whether to include archived project statuses.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } }, { - "name": "milestoneId", - "in": "path", - "description": "The id of the milestone.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -23508,74 +23394,30 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestoneTemplate" + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectStatus" + } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "project-manage-config": "read" - } - }, - "put": { - "tags": [ - "ProjectMilestoneTemplates" - ], - "summary": "Updates a milestone template for the given project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTemplateMilestoneByProjectTemplateIdAndMilestoneId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "milestoneId", - "in": "path", - "description": "The id of the milestone.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "The model containing updated milestone template details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectMilestoneTemplateForm" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectMilestoneTemplate" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23592,24 +23434,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/projectstatuses": { + "/projectstatuses/{projectStatusId}": { "get": { "tags": [ - "ProjectTemplates" + "ProjectStatuses" ], - "summary": "Retrieves all project statuses of a project template.", + "summary": "Returns the project status with the specified id.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateProjectStatusesByProjectTemplateId", + "operationId": "GetProjectStatusById", "parameters": [ { - "name": "projectTemplateId", + "name": "projectStatusId", "in": "path", - "description": "The id of the project template to retrieve statuses for.", + "description": "The id of the project status.", "required": true, "schema": { "type": "string", @@ -23623,10 +23464,27 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectStatus" - } + "$ref": "#/components/schemas/ProjectStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23656,18 +23514,18 @@ "any": "true" } }, - "post": { + "put": { "tags": [ - "ProjectTemplates" + "ProjectStatuses" ], - "summary": "Adds a project status to a project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateProjectStatusesByProjectTemplateId", + "summary": "Updates an existing project status.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PutProjectStatusById", "parameters": [ { - "name": "projectTemplateId", + "name": "projectStatusId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project status.", "required": true, "schema": { "type": "string", @@ -23676,7 +23534,7 @@ } ], "requestBody": { - "description": "The model to add the project status to the template.", + "description": "The model to update the project status.", "content": { "application/json": { "schema": { @@ -23739,24 +23597,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/setcustomfields": { + "/projectstatuses/{projectStatusId}/delete": { "post": { "tags": [ - "CustomFields" + "ProjectStatuses" ], - "summary": "Sets the custom fields for a project template.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateSetCustomFieldsByProjectTemplateId", + "summary": "Deletes a project status.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectStatusDeleteByProjectStatusId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectStatusId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project status to delete.", "required": true, "schema": { "type": "string", @@ -23765,14 +23622,11 @@ } ], "requestBody": { - "description": "The list of custom field values to set.", + "description": "The model to delete the project status.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldPostForm" - } + "$ref": "#/components/schemas/ProjectStatusDeleteForm" } } }, @@ -23781,66 +23635,13 @@ "responses": { "204": { "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "project-manage-config": "write" - } - } - }, - "/projecttemplates/{projectTemplateId}/tags": { - "get": { - "tags": [ - "ProjectTemplateTags" - ], - "summary": "Returns the tags of the project template with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetProjectTemplateTagsByProjectTemplateId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template to get tags for.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23877,24 +23678,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "read" + "any": "true" } } }, - "/projecttemplates/{projectTemplateId}/taskbundle": { - "get": { + "/projectstatuses/{projectStatusId}/setarchived": { + "post": { "tags": [ - "ProjectTemplates" + "ProjectStatuses" ], - "summary": "Retrieves the task bundle associated with a project template.", + "summary": "Sets the archived flag for a project status.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateTaskBundleByProjectTemplateId", + "operationId": "PostProjectStatusSetArchivedByProjectStatusId", "parameters": [ { - "name": "projectTemplateId", + "name": "projectStatusId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project status.", "required": true, "schema": { "type": "string", @@ -23902,13 +23702,44 @@ } } ], + "requestBody": { + "description": "The model to set the archived flag for the project status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArchivedForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundleResult" + "$ref": "#/components/schemas/ProjectStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -23939,25 +23770,15 @@ } } }, - "/projecttemplates/{projectTemplateId}/taskstatuses": { + "/projecttemplates": { "get": { "tags": [ "ProjectTemplates" ], - "summary": "Returns all task statuses of the project template with the specified id.", + "summary": "Retrieves all project templates.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateTaskStatusesByProjectTemplateId", + "operationId": "GetProjectTemplates", "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, { "$ref": "#/components/parameters/page" }, @@ -23979,21 +23800,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/ProjectTemplate" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -24014,27 +23825,15 @@ "tags": [ "ProjectTemplates" ], - "summary": "Creates a new task status for the specified project template.", + "summary": "Creates a new project template.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateTaskStatusesByProjectTemplateId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "operationId": "PostProjectTemplate", "requestBody": { - "description": "The task Status form payload.", + "description": "The model to create the project template.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatusForm" + "$ref": "#/components/schemas/ProjectTemplateForm" } } }, @@ -24046,7 +23845,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/ProjectTemplate" } } } @@ -24060,16 +23859,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -24088,36 +23877,25 @@ } } }, - "/projecttemplates/{projectTemplateId}/taskstatuses/{taskStatusId}": { - "delete": { + "/projecttemplates/deletetags": { + "post": { "tags": [ - "ProjectTemplates" + "ProjectTemplateTags" ], - "summary": "Deletes the task status of the project template with the specified id.", - "description": "The last status of type 'todo' or 'done' cannot be deleted.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteProjectTemplateTaskStatusByProjectTemplateIdAndTaskStatusId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Removes a tag from all project templates.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplatesDeleteTags", + "requestBody": { + "description": "The model to remove the tag from all project templates.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTagForm" + } } }, - { - "name": "taskStatusId", - "in": "path", - "description": "The id of the task status.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { "204": { "description": "No Content" @@ -24132,8 +23910,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -24157,49 +23935,32 @@ "admin": "true", "project-manage-config": "write" } - }, + } + }, + "/projecttemplates/tags": { "get": { "tags": [ - "ProjectTemplates" + "ProjectTemplateTags" ], - "summary": "Returns the task status of the project template with the specified id.", + "summary": "Returns all tags currently in use by project templates.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateTaskStatusByProjectTemplateIdAndTaskStatusId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskStatusId", - "in": "path", - "description": "The id of the task status.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "operationId": "GetProjectTemplatesTags", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } } } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -24222,57 +23983,30 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/projecttemplates/updatetags": { + "post": { "tags": [ - "ProjectTemplates" + "ProjectTemplateTags" ], - "summary": "Updates a task status for the specified project template.", + "summary": "Updates a tag globally for all project templates.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTemplateTaskStatusByProjectTemplateIdAndTaskStatusId", - "parameters": [ - { - "name": "projectTemplateId", - "in": "path", - "description": "The id of the project template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskStatusId", - "in": "path", - "description": "The id of the task status to update.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "operationId": "PostProjectTemplateUpdateTags", "requestBody": { - "description": "The model used to update the task status.", + "description": "The model containing the tag updates.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatusForm" + "$ref": "#/components/schemas/TagUpdateForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskStatus" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -24284,8 +24018,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -24311,19 +24045,19 @@ } } }, - "/projecttemplates/{projectTemplateId}/unlinkcustomfielddefinition": { - "post": { + "/projecttemplates/{projectTemplateId}": { + "delete": { "tags": [ - "CustomFields" + "ProjectTemplates" ], - "summary": "Unlinks a custom field definition from the specified project template.", - "description": "When the definition is unlinked from a project template, all values of the custom field will be removed from the task templates within that project template.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateUnlinkCustomFieldDefinitionByProjectTemplateId", + "summary": "Deletes a project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteProjectTemplateById", "parameters": [ { "name": "projectTemplateId", "in": "path", - "description": "The id of the project template to unlink the custom field definition from.", + "description": "The id of the project template to delete.", "required": true, "schema": { "type": "string", @@ -24331,40 +24065,9 @@ } } ], - "requestBody": { - "description": "The model used to unlink the custom field definition.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnlinkCustomFieldDefinitionForm" - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -24381,21 +24084,19 @@ "admin": "true", "project-manage-config": "write" } - } - }, - "/projecttemplates/{projectTemplateId}/unlinkworkflow": { - "post": { + }, + "get": { "tags": [ - "Workflows" + "ProjectTemplates" ], - "summary": "Unlinks a workflow from a project template.", - "description": "Unlinks the workflow from the project template, cloning workflow statuses\r\n to local template-specific statuses. Custom fields and automations\r\n remain but become editable (no longer synced with workflow).\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateUnlinkWorkflowByProjectTemplateId", + "summary": "Retrieves a specific project template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateById", "parameters": [ { "name": "projectTemplateId", "in": "path", - "description": "The id of the project template.", + "description": "The id of the project template to retrieve.", "required": true, "schema": { "type": "string", @@ -24414,16 +24115,6 @@ } } }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -24446,24 +24137,21 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - } - }, - "/projecttemplates/{projectTemplateId}/updateprojectstatusorder": { - "post": { + }, + "put": { "tags": [ "ProjectTemplates" ], - "summary": "Updates the order of a project status within a project template.", + "summary": "Updates an existing project template.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTemplateUpdateProjectStatusOrderByProjectTemplateId", + "operationId": "PutProjectTemplateById", "parameters": [ { "name": "projectTemplateId", "in": "path", - "description": "The id of the project template to update the status order for.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -24472,19 +24160,26 @@ } ], "requestBody": { - "description": "The model to update the project template status order.", + "description": "The model to update the project template.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateProjectStatusOrderForm" + "$ref": "#/components/schemas/ProjectTemplateForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectTemplate" + } + } + } }, "400": { "description": "Bad Request", @@ -24523,19 +24218,19 @@ } } }, - "/projecttemplates/{projecttemplateId}/externalfiles": { + "/projecttemplates/{projectTemplateId}/addtags": { "post": { "tags": [ - "ProjectTemplateFiles" + "ProjectTemplateTags" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Adds a batch of tags to the project template with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateAddTagsByProjectTemplateId", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template to add tags to.", "required": true, "schema": { "type": "string", @@ -24544,25 +24239,18 @@ } ], "requestBody": { - "description": "List of file forms.", + "description": "The model containing the tags to add.", "content": { "application/json": { "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" + "$ref": "#/components/schemas/TagForm" } } } - } + }, + "required": true }, "responses": { "200": { @@ -24570,7 +24258,40 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -24587,23 +24308,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttemplates/{projecttemplateId}/files": { - "delete": { + "/projecttemplates/{projectTemplateId}/automations": { + "get": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Deletes the files of the specified projecttemplate.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectTemplateFiles", + "summary": "Returns all automations for a project template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateAutomations", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -24612,8 +24334,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Automation" + } + } + } + } } }, "security": [ @@ -24630,78 +24362,18 @@ "any": "true" } }, - "get": { + "post": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Returns all files of the projecttemplate with the specified id.", - "description": "Returns all file metadata of the projecttemplate with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateFiles", + "summary": "Creates a new automation for a given project template.", + "description": "Creates a new automation of the project template with the specified id.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateAutomation", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileInfo" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "ProjectTemplateFiles" - ], - "summary": "Creates a new projecttemplate file for the projecttemplate with the specified id..", - "description": "Uploads a new projecttemplate file for the projecttemplate with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateProjectTemplateFile", - "parameters": [ - { - "name": "projecttemplateId", - "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -24710,27 +24382,15 @@ } ], "requestBody": { + "description": "The model to create the automation.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/AutomationTriggerForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -24738,72 +24398,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/Automation" } } } }, "400": { - "description": "Bad Request" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/projecttemplates/{projecttemplateId}/files/byurl": { - "post": { - "tags": [ - "ProjectTemplateFiles" - ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateProjectTemplateFileByUrl", - "parameters": [ - { - "name": "projecttemplateId", - "in": "path", - "description": "The id of the projecttemplate the file is linked to.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - } - } - }, - "responses": { - "200": { - "description": "OK", + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -24820,23 +24425,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttemplates/{projecttemplateId}/files/{fileId}": { + "/projecttemplates/{projectTemplateId}/automations/{automationId}": { "delete": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Deletes the projecttemplate file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectTemplateFile", + "summary": "Deletes the specified automation for a given projecttemplate.", + "description": "Deletes the specified automation with its trigger and all its values.\r\n To delete the the automation the user needs to have 'write' permissions of\r\n the feature 'project-manage-config' globally.\r\n If the 'removeFromProject' boolean is set to true, all automations in projects of that\r\n project template created from that automation template are deleted aswell.\r\n Automations created from a workflow cannot be deleted via this endpoint.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteProjectTemplateAutomation", "parameters": [ { - "name": "projecttemplateId", + "name": "automationId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -24844,19 +24450,38 @@ } }, { - "name": "fileId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "removeFromProjects", + "in": "query", + "description": "Whether to delete the automation also from all projects of the projecttemplate.", + "required": true, + "schema": { + "type": "boolean" + } } ], "responses": { "204": { "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -24870,21 +24495,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } }, "get": { "tags": [ - "ProjectTemplate Files" + "Project Template Automations" ], - "summary": "Returns the file with the specified id of the projecttemplate with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByProjectTemplateNameAndProjectTemplateIdAndFileId", + "summary": "Returns a specific automation for a projecttemplate.", + "description": "Returns a specific automation of the projecttemplate with the specified id.\r\n Returns NotFound if the automation doesnt exist.\r\n To get the the automation data the user needs to have 'read' permissions of\r\n the feature 'project-manage-config' globally.\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetProjectTemplateAutomation", "parameters": [ { - "name": "projecttemplateId", + "name": "automationId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -24892,9 +24518,9 @@ } }, { - "name": "fileId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -24908,27 +24534,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Automation" } } } @@ -24945,21 +24551,21 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "read" } }, "put": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Updates the metadata of the projecttemplate file with the specified id.", - "description": "Updates the metadata of the projecttemplate file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateProjectTemplateFile", + "summary": "Updates the automation with the specified id for a given projecttemplate.", + "description": "Updates the specified automation for a specific projecttemplate.\r\n If the automation was created from a workflow, only the Enabled flag can be changed.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutProjectTemplateAutomation", "parameters": [ { - "name": "projecttemplateId", + "name": "automationId", "in": "path", - "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", @@ -24967,9 +24573,8 @@ } }, { - "name": "fileId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -24978,19 +24583,14 @@ } ], "requestBody": { - "description": "The model to update the file with the specified id.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" + "$ref": "#/components/schemas/AutomationPutForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -24998,7 +24598,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/Automation" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -25015,23 +24625,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/changeentity": { - "post": { + "/projecttemplates/{projectTemplateId}/automations/{automationId}/actions": { + "get": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Changes the projecttemplate this file belongs to.", - "description": "Changes the projecttemplate this file belongs to.\nSwitch to the specified projecttemplate or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeProjectTemplate", + "summary": "Gets the actions of an automation of a project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetProjectTemplateAutomationActions", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25039,9 +24650,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -25049,28 +24660,16 @@ } } ], - "requestBody": { - "description": "The model to change the entity information of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/Action" + } } } } @@ -25087,23 +24686,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "read" } - } - }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/copy": { + }, "post": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Copies the file to a new projecttemplate.", - "description": "Copies the file to a new projecttemplate (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToProjectTemplate", + "summary": "Creates a new action for an automation of a project template.", + "description": "Creates an action for a specific automation of a project template including all its values. Actions cannot be added to automations created from a workflow.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateAutomationAction", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25111,9 +24709,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -25122,19 +24720,15 @@ } ], "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The model to create an action.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" + "$ref": "#/components/schemas/ActionForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -25142,7 +24736,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/Action" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -25159,23 +24763,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/download": { - "get": { + "/projecttemplates/{projectTemplateId}/automations/{automationId}/actions/{actionId}": { + "delete": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Returns the content of the projecttemplate file with the specified id.", - "description": "Returns the content of the projecttemplate file. Uses the latest file version.\nIf the projecttemplate file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateFileContent", + "summary": "Deletes an action for an automation of a project template.", + "description": "Deletes an action for a specific automation of a project template including all its values. Actions of automations created from a workflow cannot be deleted.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteProjectTemplateAutomationAction", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25183,9 +24788,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -25193,40 +24798,26 @@ } }, { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", + "name": "actionId", + "in": "path", + "description": "The id of the action.", + "required": true, "schema": { - "type": "boolean" + "type": "string", + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -25243,23 +24834,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } - } - }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/pdf": { + }, "get": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the projecttemplate file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateFileContent", + "summary": "Gets a specific action for an automation of a projecttemplate.", + "description": "Returns a specific action for a specific automation of a project template including all its values.\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetProjectTemplateAutomationAction", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25267,9 +24857,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -25277,12 +24867,13 @@ } }, { - "name": "inline", - "in": "query", - "description": "If inline is false, content-disposition header is attachment.", + "name": "actionId", + "in": "path", + "description": "The id of the action.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], @@ -25292,8 +24883,7 @@ "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/Action" } } } @@ -25310,23 +24900,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "read" } - } - }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/shareurl": { - "get": { + }, + "put": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", + "summary": "Updates a specifc action of an automation of a project template.", + "description": "Returns an updated action for a specific automation of a project template including all its values. Actions of automations created from a workflow cannot be modified.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutProjectTemplateAutomationAction", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25334,9 +24923,19 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "actionId", + "in": "path", + "description": "The id of the action.", "required": true, "schema": { "type": "string", @@ -25344,13 +24943,34 @@ } } ], + "requestBody": { + "description": "The model to update an action.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActionForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/Action" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -25367,23 +24987,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/versions": { - "get": { + "/projecttemplates/{projectTemplateId}/automations/{automationId}/actions/{actionId}/updateorder": { + "post": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Returns all file versions of the specified projecttemplate file.", - "description": "Returns all file versions of the specified projecttemplate file.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateFileVersions", + "summary": "Updates the order of a project template automation action.", + "description": "Actions of automations created from a workflow cannot be modified.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostUpdateProjectTemplateAutomationActionOrder", "parameters": [ { - "name": "projecttemplateId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25391,9 +25012,9 @@ } }, { - "name": "fileId", + "name": "automationId", "in": "path", - "description": "The id of the file.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -25401,28 +25022,37 @@ } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "actionId", + "in": "path", + "description": "The id of the action.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], + "requestBody": { + "description": "The model to update the order.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrderForm" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileVersion" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -25439,21 +25069,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } - }, + } + }, + "/projecttemplates/{projectTemplateId}/automations/{automationId}/reapply": { "post": { "tags": [ - "ProjectTemplateFiles" + "Project Template Automations" ], - "summary": "Uploads a new version of the projecttemplate file with the specified id.", - "description": "Uploads a new version of an projecttemplate file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateProjectTemplateFileVersion", + "summary": "Reapplies the automation to all projects of this specific project template.", + "description": "Returns NotFound if the automation doesnt exist.\r\n To execute this you need to have 'write' permissions of\r\n the feature 'project-manage-config' globally.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostReapplyProjectTemplateAutomation", "parameters": [ { - "name": "projecttemplateId", + "name": "automationId", "in": "path", - "description": "The id of the projecttemplate.", + "description": "The id of the automation.", "required": true, "schema": { "type": "string", @@ -25461,9 +25094,9 @@ } }, { - "name": "fileId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25471,42 +25104,9 @@ } } ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } - } - } - } - }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } - }, - "400": { - "description": "Bad Request" + "204": { + "description": "No Content" } }, "security": [ @@ -25520,43 +25120,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/versions/{versionId}": { + "/projecttemplates/{projectTemplateId}/customfielddefinitions": { "get": { "tags": [ - "ProjectTemplate Files" + "CustomFields" ], - "summary": "Returns the projecttemplate file version with the specified id.", + "summary": "Returns all custom field definitions linked to the specified project template, including definitions linked via a workflow.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByProjectTemplateNameAndProjectTemplateIdAndFileIdAndVersionId", + "operationId": "GetProjectTemplateCustomFieldDefinitionsByProjectTemplateId", "parameters": [ { - "name": "projecttemplateId", - "in": "path", - "description": "The id of the projecttemplate.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "versionId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the file version.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25570,17 +25151,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" + } } } } @@ -25611,29 +25185,19 @@ } } }, - "/projecttemplates/{projecttemplateId}/files/{fileId}/versions/{versionId}/download": { - "get": { + "/projecttemplates/{projectTemplateId}/customfielddefinitions/{customFieldDefinitionId}": { + "put": { "tags": [ - "ProjectTemplateFiles" + "CustomFields" ], - "summary": "Returns the content of the projecttemplate file version with the specified id.", - "description": "Returns the content of the projecttemplate file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTemplateFileVersionContent", + "summary": "Updates the order of a custom field definition for the specified project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutProjectTemplateCustomFieldDefinitionByProjectTemplateIdAndCustomFieldDefinitionId", "parameters": [ { - "name": "projecttemplateId", - "in": "path", - "description": "The id of the projecttemplate.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the file.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25641,9 +25205,9 @@ } }, { - "name": "versionId", + "name": "customFieldDefinitionId", "in": "path", - "description": "The id of the file version.", + "description": "The id of the custom field definition.", "required": true, "schema": { "type": "string", @@ -25651,98 +25215,12 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/projecttimebookings": { - "get": { - "tags": [ - "TimeBookings" - ], - "summary": "Returns a list of time bookings.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTimeBookings", - "parameters": [ - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TimeBooking" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "TimeBookings" - ], - "summary": "Creates a new time booking for a given project and user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostProjectTimeBooking", "requestBody": { - "description": "The model to create the time booking.", + "description": "The model used to update the order of the custom field definition.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeBookingForm" + "$ref": "#/components/schemas/CustomFieldOrderPutForm" } } }, @@ -25754,23 +25232,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeBooking" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CustomFieldOrderForm" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -25791,23 +25259,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttimebookings/{timeBookingId}": { - "delete": { + "/projecttemplates/{projectTemplateId}/deletetags": { + "post": { "tags": [ - "TimeBookings" + "ProjectTemplateTags" ], - "summary": "Deletes a time booking by id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "DeleteProjectTimeBooking", + "summary": "Removes tags from the project template with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateDeleteTagsByProjectTemplateId", "parameters": [ { - "name": "timeBookingId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the time booking to delete.", + "description": "The id of the project template to remove tags from.", "required": true, "schema": { "type": "string", @@ -25815,10 +25284,27 @@ } } ], + "requestBody": { + "description": "The model containing the tags to delete.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeleteTagForm" + } + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" }, + "207": { + "description": "Multi-Status" + }, "400": { "description": "Bad Request", "content": { @@ -25838,6 +25324,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -25851,21 +25347,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } - }, - "put": { + } + }, + "/projecttemplates/{projectTemplateId}/linkcustomfielddefinition": { + "post": { "tags": [ - "TimeBookings" + "CustomFields" ], - "summary": "Updates a given time booking.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutProjectTimeBooking", + "summary": "Links a custom field definition to the specified project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateLinkCustomFieldDefinitionByProjectTemplateId", "parameters": [ { - "name": "timeBookingId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the time booking.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -25874,26 +25373,19 @@ } ], "requestBody": { - "description": "The model to update the time booking.", + "description": "The model used to link the custom field definition.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeBookingForm" + "$ref": "#/components/schemas/LinkCustomFieldDefinitionForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeBooking" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -25905,8 +25397,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -25927,26 +25419,28 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/projecttypes": { + "/projecttemplates/{projectTemplateId}/milestones": { "get": { "tags": [ - "ProjectTypes" + "ProjectMilestoneTemplates" ], - "summary": "Returns all existing project types.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTypes", + "summary": "Returns all milestone templates of the given project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetProjectTemplateMilestonesByProjectTemplateId", "parameters": [ { - "name": "showArchived", - "in": "query", - "description": "Whether to include archived project types in the results. Default is false.", + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } }, { @@ -25970,7 +25464,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ProjectType" + "$ref": "#/components/schemas/ProjectMilestoneTemplate" } } } @@ -25988,21 +25482,35 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "read" } }, "post": { "tags": [ - "ProjectTypes" + "ProjectMilestoneTemplates" ], - "summary": "Creates a new project type.", + "summary": "Creates a new milestone template for the given project template.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectType", + "operationId": "PostProjectTemplateMilestonesByProjectTemplateId", + "parameters": [ + { + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { + "description": "The model containing milestone template details.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectTypeForm" + "$ref": "#/components/schemas/ProjectMilestoneTemplateForm" } } }, @@ -26014,7 +25522,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectType" + "$ref": "#/components/schemas/ProjectMilestoneTemplate" } } } @@ -26036,27 +25544,39 @@ } } }, - "/projecttypes/icons": { - "get": { + "/projecttemplates/{projectTemplateId}/milestones/{milestoneId}": { + "delete": { "tags": [ - "ProjectTypes" + "ProjectMilestoneTemplates" ], - "summary": "Retrieves all available project type icons.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTypesIcons", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } + "summary": "Deletes a milestone for the given project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteProjectTemplateMilestoneByProjectTemplateIdAndMilestoneId", + "parameters": [ + { + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + }, + { + "name": "milestoneId", + "in": "path", + "description": "The id of the milestone.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" } }, "security": [ @@ -26070,23 +25590,32 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } - } - }, - "/projecttypes/{projectTypeId}": { + }, "get": { "tags": [ - "ProjectTypes" + "ProjectMilestoneTemplates" ], - "summary": "Retrieves a project type by its ID.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTypeById", + "summary": "Returns a milestone by id for the given project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetProjectTemplateMilestoneByProjectTemplateIdAndMilestoneId", "parameters": [ { - "name": "projectTypeId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the project type.", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "milestoneId", + "in": "path", + "description": "The id of the milestone.", "required": true, "schema": { "type": "string", @@ -26100,17 +25629,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectType" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ProjectMilestoneTemplate" } } } @@ -26127,21 +25646,32 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "read" } }, "put": { "tags": [ - "ProjectTypes" + "ProjectMilestoneTemplates" ], - "summary": "Updates an existing project type.", + "summary": "Updates a milestone template for the given project template.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutProjectTypeById", + "operationId": "PutProjectTemplateMilestoneByProjectTemplateIdAndMilestoneId", "parameters": [ { - "name": "projectTypeId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the project type.", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "milestoneId", + "in": "path", + "description": "The id of the milestone.", "required": true, "schema": { "type": "string", @@ -26150,11 +25680,11 @@ } ], "requestBody": { - "description": "The model to update the project type.", + "description": "The model containing updated milestone template details.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectTypeForm" + "$ref": "#/components/schemas/ProjectMilestoneTemplateForm" } } }, @@ -26166,17 +25696,58 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectType" + "$ref": "#/components/schemas/ProjectMilestoneTemplate" } } } - }, - "400": { - "description": "Bad Request", + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/projecttemplates/{projectTemplateId}/projectstatuses": { + "get": { + "tags": [ + "ProjectTemplates" + ], + "summary": "Retrieves all project statuses of a project template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateProjectStatusesByProjectTemplateId", + "parameters": [ + { + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template to retrieve statuses for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectStatus" + } } } } @@ -26203,24 +25774,21 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - } - }, - "/projecttypes/{projectTypeId}/delete": { + }, "post": { "tags": [ - "ProjectTypes" + "ProjectTemplates" ], - "summary": "Deletes a project type and reassigns related projects and templates.", + "summary": "Adds a project status to a project template.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTypeDeleteByProjectTypeId", + "operationId": "PostProjectTemplateProjectStatusesByProjectTemplateId", "parameters": [ { - "name": "projectTypeId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the project type.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -26229,19 +25797,26 @@ } ], "requestBody": { - "description": "The model to delete the project type.", + "description": "The model to add the project status to the template.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteProjectTypeForm" + "$ref": "#/components/schemas/ProjectStatusForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectStatus" + } + } + } }, "400": { "description": "Bad Request", @@ -26253,6 +25828,16 @@ } } }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -26280,19 +25865,19 @@ } } }, - "/projecttypes/{projectTypeId}/setarchived": { + "/projecttemplates/{projectTemplateId}/setcustomfields": { "post": { "tags": [ - "ProjectTypes" + "CustomFields" ], - "summary": "Archives or unarchives the project type with the specified id.", + "summary": "Sets the custom fields for a project template.", "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostProjectTypeSetArchivedByProjectTypeId", + "operationId": "PostProjectTemplateSetCustomFieldsByProjectTemplateId", "parameters": [ { - "name": "projectTypeId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the project type.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -26301,25 +25886,22 @@ } ], "requestBody": { + "description": "The list of custom field values to set.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchivedForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldPostForm" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectType" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -26338,23 +25920,36 @@ } } }, - "/roles": { + "/projecttemplates/{projectTemplateId}/tags": { "get": { "tags": [ - "Roles" + "ProjectTemplateTags" ], - "summary": "Returns all roles of the workspace.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRoles", + "summary": "Returns the tags of the project template with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetProjectTemplateTagsByProjectTemplateId", "parameters": [ { - "name": "showArchived", - "in": "query", - "description": "Whether to show archived roles.", + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template to get tags for.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -26365,59 +25960,24 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Role" + "$ref": "#/components/schemas/BaseTagModel" } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "workspace-manage-config": "read" - } - }, - "post": { - "tags": [ - "Roles" - ], - "summary": "Creates a new role with specified permissions.", - "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRole", - "requestBody": { - "description": "The role form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleForm" - } - } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Role" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -26439,42 +25999,37 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" - }, - "x-subscriptionlevel": { - "minimumPlan": "standard" + "project-manage-config": "read" } } }, - "/roles/moveuser": { - "post": { + "/projecttemplates/{projectTemplateId}/taskbundle": { + "get": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Moves a user from their current role to another role.", - "description": "Moves a user from their current role to another role.\r\n At least one user needs to remain in the admin role.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRolesMoveUser", - "requestBody": { - "description": "The move user in role payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MoveUserInRole" - } + "summary": "Retrieves the task bundle associated with a project template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateTaskBundleByProjectTemplateId", + "parameters": [ + { + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskBundleResult" } } } @@ -26501,20 +26056,29 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/roles/users": { + "/projecttemplates/{projectTemplateId}/taskstatuses": { "get": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Returns all users in roles of the workspace.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRolesUsers", + "summary": "Returns all task statuses of the project template with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateTaskStatusesByProjectTemplateId", "parameters": [ + { + "name": "projectTemplateId", + "in": "path", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -26526,16 +26090,6 @@ }, { "$ref": "#/components/parameters/filterby" - }, - { - "name": "aw-internal-request", - "in": "header", - "description": "Marks this request as an internal request. Only allowed by the awork app or internally.", - "required": true, - "schema": { - "type": "string", - "default": "true" - } } ], "responses": { @@ -26546,60 +26100,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/UserInRole" + "$ref": "#/components/schemas/TaskStatus" } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "workspace-manage-config": "read" - }, - "x-internal": "true" - } - }, - "/roles/{roleId}": { - "get": { - "tags": [ - "Roles" - ], - "summary": "Returns the role with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRoleById", - "parameters": [ - { - "name": "roleId", - "in": "path", - "description": "The id of the role.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Role" - } - } - } }, "404": { "description": "Not Found", @@ -26623,22 +26128,21 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } }, - "put": { + "post": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Updates the role with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PutRoleById", + "summary": "Creates a new task status for the specified project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateTaskStatusesByProjectTemplateId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", @@ -26647,11 +26151,11 @@ } ], "requestBody": { - "description": "The role form payload.", + "description": "The task Status form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RoleForm" + "$ref": "#/components/schemas/TaskStatusForm" } } }, @@ -26663,7 +26167,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Role" + "$ref": "#/components/schemas/TaskStatus" } } } @@ -26701,23 +26205,33 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "project-manage-config": "write" } } }, - "/roles/{roleId}/adduser": { - "post": { + "/projecttemplates/{projectTemplateId}/taskstatuses/{taskStatusId}": { + "delete": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Adds the user to the role with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRoleAddUserByRoleId", + "summary": "Deletes the task status of the project template with the specified id.", + "description": "The last status of type 'todo' or 'done' cannot be deleted.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteProjectTemplateTaskStatusByProjectTemplateIdAndTaskStatusId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskStatusId", + "in": "path", + "description": "The id of the task status.", "required": true, "schema": { "type": "string", @@ -26725,20 +26239,9 @@ } } ], - "requestBody": { - "description": "The user in role form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserInRoleForm" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK" + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -26759,16 +26262,6 @@ } } } - }, - "500": { - "description": "Internal Server Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -26783,23 +26276,31 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "project-manage-config": "write" } - } - }, - "/roles/{roleId}/deactivatedmenuitems": { + }, "get": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Returns all deactivated menu items for the specified role.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRoleDeactivatedMenuItemsByRoleId", + "summary": "Returns the task status of the project template with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateTaskStatusByProjectTemplateIdAndTaskStatusId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskStatusId", + "in": "path", + "description": "The id of the task status.", "required": true, "schema": { "type": "string", @@ -26813,19 +26314,13 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "example": [ - "https://www.awork.com" - ] + "$ref": "#/components/schemas/TaskStatus" + } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -26846,22 +26341,31 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } }, - "post": { + "put": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Creates or updates the deactivated menu items for the specified role.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRoleDeactivatedMenuItemsByRoleId", + "summary": "Updates a task status for the specified project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutProjectTemplateTaskStatusByProjectTemplateIdAndTaskStatusId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskStatusId", + "in": "path", + "description": "The id of the task status to update.", "required": true, "schema": { "type": "string", @@ -26870,22 +26374,26 @@ } ], "requestBody": { - "description": "The list of menu item keys.", + "description": "The model used to update the task status.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - } + "$ref": "#/components/schemas/TaskStatusForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatus" + } + } + } }, "400": { "description": "Bad Request", @@ -26920,23 +26428,23 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "project-manage-config": "write" } } }, - "/roles/{roleId}/delete": { + "/projecttemplates/{projectTemplateId}/unlinkcustomfielddefinition": { "post": { "tags": [ - "Roles" + "CustomFields" ], - "summary": "Deletes the role with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRoleDeleteByRoleId", + "summary": "Unlinks a custom field definition from the specified project template.", + "description": "When the definition is unlinked from a project template, all values of the custom field will be removed from the task templates within that project template.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateUnlinkCustomFieldDefinitionByProjectTemplateId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template to unlink the custom field definition from.", "required": true, "schema": { "type": "string", @@ -26945,11 +26453,11 @@ } ], "requestBody": { - "description": "The delete role form payload.", + "description": "The model used to unlink the custom field definition.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteRoleForm" + "$ref": "#/components/schemas/UnlinkCustomFieldDefinitionForm" } } }, @@ -26978,16 +26486,6 @@ } } } - }, - "500": { - "description": "Internal Server Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -27002,40 +26500,28 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "project-manage-config": "write" } } }, - "/roles/{roleId}/permissions": { - "get": { + "/projecttemplates/{projectTemplateId}/unlinkworkflow": { + "post": { "tags": [ - "Roles" + "Workflows" ], - "summary": "Returns all permissions of the specified role.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRolePermissionsByRoleId", + "summary": "Unlinks a workflow from a project template.", + "description": "Unlinks the workflow from the project template, cloning workflow statuses\r\n to local template-specific statuses. Custom fields and automations\r\n remain but become editable (no longer synced with workflow).\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateUnlinkWorkflowByProjectTemplateId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -27044,10 +26530,17 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PermissionOfGlobalRole" - } + "$ref": "#/components/schemas/ProjectTemplate" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -27075,21 +26568,23 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "read" + "project-manage-config": "write" } - }, + } + }, + "/projecttemplates/{projectTemplateId}/updateprojectstatusorder": { "post": { "tags": [ - "Roles" + "ProjectTemplates" ], - "summary": "Creates, updates or deletes a permission of the specified role.", - "description": "Creates, updates or deletes a permission of the role.\r\n If the permission already exist, and the 'AccessLevels' property of the model is not empty,\r\n the permission will be updated. If the 'AccessLevels' property of the model is empty,\r\n the permission will be deleted.\r\n The permission will be created if it does not exist.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostRolePermissionsByRoleId", + "summary": "Updates the order of a project status within a project template.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTemplateUpdateProjectStatusOrderByProjectTemplateId", "parameters": [ { - "name": "roleId", + "name": "projectTemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the project template to update the status order for.", "required": true, "schema": { "type": "string", @@ -27098,27 +26593,17 @@ } ], "requestBody": { - "description": "The permission of role form payload.", + "description": "The model to update the project template status order.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PermissionOfRoleForm" + "$ref": "#/components/schemas/UpdateProjectStatusOrderForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PermissionOfProjectRole" - } - } - } - }, "204": { "description": "No Content" }, @@ -27132,8 +26617,8 @@ } } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -27159,19 +26644,19 @@ } } }, - "/roles/{roleId}/setarchived": { + "/projecttemplates/{projecttemplateId}/externalfiles": { "post": { "tags": [ - "Roles" + "ProjectTemplateFiles" ], - "summary": "Archives or unarchives the role with the specified id.", - "description": "Archives or unarchives the role with the specified id.\r\n An archived role still exists for all users currently using it,\r\n but users can no longer be assigned to this role.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostRoleSetArchivedByRoleId", + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", "parameters": [ { - "name": "roleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", @@ -27180,15 +26665,25 @@ } ], "requestBody": { - "description": "The archived form payload.", + "description": "List of file forms.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchivedForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -27196,27 +26691,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Role" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -27233,37 +26708,65 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/roles/{roleId}/users": { - "get": { + "/projecttemplates/{projecttemplateId}/files": { + "delete": { "tags": [ - "Roles" + "ProjectTemplateFiles" ], - "summary": "Returns all users of the specified role.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRoleUsersByRoleId", + "summary": "Deletes the files of the specified projecttemplate.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectTemplateFiles", "parameters": [ { - "name": "roleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the role.", + "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ { - "name": "showArchived", - "in": "query", - "description": "Whether to show archived users.", + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "ProjectTemplateFiles" + ], + "summary": "Returns all files of the projecttemplate with the specified id.", + "description": "Returns all file metadata of the projecttemplate with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateFiles", + "parameters": [ + { + "name": "projecttemplateId", + "in": "path", + "description": "The id of the projecttemplate.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } }, { @@ -27287,21 +26790,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/UserInRole" + "$ref": "#/components/schemas/FileInfo" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -27315,34 +26808,21 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } - } - }, - "/roles/{roleId}/users/{userId}/activate": { + }, "post": { "tags": [ - "Roles" + "ProjectTemplateFiles" ], - "summary": "Activates the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRoleUserActivateByRoleIdAndUserId", + "summary": "Creates a new projecttemplate file for the projecttemplate with the specified id..", + "description": "Uploads a new projecttemplate file for the projecttemplate with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateProjectTemplateFile", "parameters": [ { - "name": "roleId", - "in": "path", - "description": "The id of the role.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "userId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the user.", + "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", @@ -27350,29 +26830,42 @@ } } ], - "responses": { - "200": { - "description": "OK" - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" } } } - }, - "500": { - "description": "Internal Server Error", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } + }, + "400": { + "description": "Bad Request" } }, "security": [ @@ -27386,34 +26879,23 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/roles/{roleId}/users/{userId}/deactivate": { + "/projecttemplates/{projecttemplateId}/files/byurl": { "post": { "tags": [ - "Roles" + "ProjectTemplateFiles" ], - "summary": "Deactivates the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostRoleUserDeactivateByRoleIdAndUserId", + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateProjectTemplateFileByUrl", "parameters": [ { - "name": "roleId", - "in": "path", - "description": "The id of the role.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "userId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the user.", + "description": "The id of the projecttemplate the file is linked to.", "required": true, "schema": { "type": "string", @@ -27421,26 +26903,28 @@ } } ], - "responses": { - "200": { - "description": "OK" - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + "requestBody": { + "description": "The url, name and description of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } } - }, - "500": { - "description": "Internal Server Error", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -27457,50 +26941,43 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/roles/{roleName}": { - "get": { + "/projecttemplates/{projecttemplateId}/files/{fileId}": { + "delete": { "tags": [ - "Roles" + "ProjectTemplateFiles" ], - "summary": "Returns the role with the specified name.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetRoleByRoleName", + "summary": "Deletes the projecttemplate file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectTemplateFile", "parameters": [ { - "name": "roleName", + "name": "projecttemplateId", "in": "path", - "description": "The name of the role.", + "description": "The id of the projecttemplate.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Role" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -27514,51 +26991,35 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } - } - }, - "/search": { + }, "get": { "tags": [ - "Search" + "ProjectTemplate Files" ], - "summary": "Performs a full-text search across workspace entities.", - "description": "This endpoint enables powerful full-text search capabilities across multiple types.\r\n It returns a ranked list of matching entities based on relevance and respects user permissions.\r\n \r\n The search functionality includes:\r\n - Cross-entity search across various entity types in the workspace.\r\n - Relevance-based scoring and ranking of results.\r\n - Respecting user access permissions for all returned results.\r\n - Customizable result filtering by entity type and status.\r\n\r\nAny authenticated user.", - "operationId": "GetSearch", + "summary": "Returns the file with the specified id of the projecttemplate with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByProjectTemplateNameAndProjectTemplateIdAndFileId", "parameters": [ { - "name": "searchTerm", - "in": "query", - "description": "The term to search for. Max. 50 characters. Required.", - "schema": { - "type": "string" - } - }, - { - "name": "searchTypes", - "in": "query", - "description": "Comma-separated list of types to search for, or 'all'. Supported types: task, project, user, company, comment, timeentry, timereport, file, document, tasklist, dashboardnote.", - "schema": { - "type": "string" - } - }, - { - "name": "top", - "in": "query", - "description": "Count of top results. Default: 20.", + "name": "projecttemplateId", + "in": "path", + "description": "The id of the projecttemplate.", + "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } }, { - "name": "includeClosedAndStuck", - "in": "query", - "description": "If true, the result will include entities where the status is closed, stuck and done.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, "schema": { - "type": "boolean" + "type": "string", + "format": "uuid" } } ], @@ -27568,13 +27029,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SearchResults" + "$ref": "#/components/schemas/FileInfo" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -27583,9 +27044,9 @@ } } }, - "401": { - "description": "Unauthorized", - "content": { + "404": { + "description": "Not Found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" @@ -27607,47 +27068,58 @@ "x-access": { "any": "true" } - } - }, - "/sharedfiles": { - "get": { + }, + "put": { "tags": [ - "SharedFiles" + "ProjectTemplateFiles" ], - "summary": "Returns a shared file.", - "description": "Returns the shared file for the provided token.\r\n\r\nAllows unauthenticated access.", - "operationId": "GetSharedFiles", + "summary": "Updates the metadata of the projecttemplate file with the specified id.", + "description": "Updates the metadata of the projecttemplate file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateProjectTemplateFile", "parameters": [ { - "name": "token", - "in": "query", - "description": "The token to allow access.", + "name": "projecttemplateId", + "in": "path", + "description": "The id of the projecttemplate.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + "requestBody": { + "description": "The model to update the file with the specified id.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -27664,78 +27136,54 @@ "v1" ], "x-access": { - "anonymous": "true" + "any": "true" } } }, - "/taskbundles": { - "get": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/changeentity": { + "post": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" ], - "summary": "Lists task bundles.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundles", + "summary": "Changes the projecttemplate this file belongs to.", + "description": "Changes the projecttemplate this file belongs to.\nSwitch to the specified projecttemplate or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeProjectTemplate", "parameters": [ { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" + "name": "projecttemplateId", + "in": "path", + "description": "The id of the projecttemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskBundle" - } - } - } + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "TaskBundles" ], - "summary": "Creates a task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundle", "requestBody": { - "description": "The task bundle form payload.", + "description": "The model to change the entity information of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundleForm" + "$ref": "#/components/schemas/FileEntityForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -27743,17 +27191,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundle" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -27770,24 +27208,33 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/taskbundles/fromproject/{projectId}": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/copy": { "post": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" ], - "summary": "Creates a task bundle from a project.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundlesFromProjectByProjectId", + "summary": "Copies the file to a new projecttemplate.", + "description": "Copies the file to a new projecttemplate (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToProjectTemplate", "parameters": [ { - "name": "projectId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the project.", + "description": "The id of the projecttemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -27796,15 +27243,19 @@ } ], "requestBody": { - "description": "The model to create a task bundle from a project.", + "description": "The model to change the entity information of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateTaskBundleFromProjectForm" + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -27812,17 +27263,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundle" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -27839,59 +27280,74 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/taskbundles/fromtasklist/{taskListId}": { - "post": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/download": { + "get": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" ], - "summary": "Creates a task bundle from a task list.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundlesFromTaskListByTaskListId", + "summary": "Returns the content of the projecttemplate file with the specified id.", + "description": "Returns the content of the projecttemplate file. Uses the latest file version.\nIf the projecttemplate file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateFileContent", "parameters": [ { - "name": "taskListId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the task list.", + "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The form to create a task bundle from a task list.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskBundleFromTaskListForm" - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "width", + "in": "query", + "description": "Set width to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "height", + "in": "query", + "description": "Set height to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundle" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -27908,29 +27364,57 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/taskbundles/icons": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/pdf": { "get": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" + ], + "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", + "description": "Returns the content of the projecttemplate file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateFileContent", + "parameters": [ + { + "name": "projecttemplateId", + "in": "path", + "description": "The id of the projecttemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "inline", + "in": "query", + "description": "If inline is false, content-disposition header is attachment.", + "schema": { + "type": "boolean", + "default": false + } + } ], - "summary": "Lists available task bundle icons.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundlesIcons", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "format": "binary" } } } @@ -27951,19 +27435,29 @@ } } }, - "/taskbundles/{taskBundleId}": { - "delete": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/shareurl": { + "get": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" ], - "summary": "Deletes a task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "DeleteTaskBundleById", + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", "parameters": [ { - "name": "taskBundleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the projecttemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -27972,8 +27466,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } } }, "security": [ @@ -27987,27 +27488,50 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } - }, + } + }, + "/projecttemplates/{projecttemplateId}/files/{fileId}/versions": { "get": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" ], - "summary": "Gets a task bundle by id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleById", + "summary": "Returns all file versions of the specified projecttemplate file.", + "description": "Returns all file versions of the specified projecttemplate file.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateFileVersions", "parameters": [ { - "name": "taskBundleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -28016,17 +27540,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundle" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileVersion" + } } } } @@ -28046,18 +27563,28 @@ "any": "true" } }, - "put": { + "post": { "tags": [ - "TaskBundles" + "ProjectTemplateFiles" ], - "summary": "Updates a task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PutTaskBundleById", + "summary": "Uploads a new version of the projecttemplate file with the specified id.", + "description": "Uploads a new version of an projecttemplate file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateProjectTemplateFileVersion", "parameters": [ { - "name": "taskBundleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the projecttemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -28066,15 +27593,27 @@ } ], "requestBody": { - "description": "The task bundle form payload.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/TaskBundleForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -28082,20 +27621,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundle" + "$ref": "#/components/schemas/FileVersion" } } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "400": { + "description": "Bad Request" } }, "security": [ @@ -28109,55 +27641,73 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/taskbundles/{taskBundleId}/copy": { - "post": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/versions/{versionId}": { + "get": { "tags": [ - "TaskBundles" + "ProjectTemplate Files" ], - "summary": "Creates a copy of an existing task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleCopyByTaskBundleId", + "summary": "Returns the projecttemplate file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByProjectTemplateNameAndProjectTemplateIdAndFileIdAndVersionId", "parameters": [ { - "name": "taskBundleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the projecttemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The model containing the data to copy the task bundle.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CopyTaskBundleForm" - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskBundle" + "$ref": "#/components/schemas/FileVersion" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -28178,24 +27728,43 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/taskbundles/{taskBundleId}/taskdependencytemplates": { + "/projecttemplates/{projecttemplateId}/files/{fileId}/versions/{versionId}/download": { "get": { "tags": [ - "TaskDependencyTemplates" + "ProjectTemplateFiles" ], - "summary": "Returns all task dependency templates for a given task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", - "operationId": "GetTaskBundleTaskDependencyTemplatesByTaskBundleId", + "summary": "Returns the content of the projecttemplate file version with the specified id.", + "description": "Returns the content of the projecttemplate file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTemplateFileVersionContent", "parameters": [ { - "name": "taskBundleId", + "name": "projecttemplateId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the projecttemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", "required": true, "schema": { "type": "string", @@ -28209,40 +27778,60 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskDependencyTemplate" - } + "type": "string", + "format": "binary" } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/projecttimebookings": { + "get": { + "tags": [ + "TimeBookings" + ], + "summary": "Returns a list of time bookings.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTimeBookings", + "parameters": [ + { + "$ref": "#/components/parameters/page" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + { + "$ref": "#/components/parameters/pageSize" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + { + "$ref": "#/components/parameters/orderby" }, - "404": { - "description": "Not Found", + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TimeBooking" + } } } } @@ -28259,35 +27848,22 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "read" + "any": "true" } }, "post": { "tags": [ - "TaskDependencyTemplates" - ], - "summary": "Creates a task dependency template for two task templates of the given task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskDependencyTemplatesByTaskBundleId", - "parameters": [ - { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TimeBookings" ], + "summary": "Creates a new time booking for a given project and user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostProjectTimeBooking", "requestBody": { - "description": "The model describing the task dependency template to create.", + "description": "The model to create the time booking.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskDependencyTemplateForm" + "$ref": "#/components/schemas/TimeBookingForm" } } }, @@ -28299,7 +27875,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskDependencyTemplate" + "$ref": "#/components/schemas/TimeBooking" } } } @@ -28323,16 +27899,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -28346,34 +27912,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/taskbundles/{taskBundleId}/taskdependencytemplates/{taskDependencyTemplateId}": { + "/projecttimebookings/{timeBookingId}": { "delete": { "tags": [ - "TaskDependencyTemplates" + "TimeBookings" ], - "summary": "Deletes the task dependency template from the task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "DeleteTaskBundleTaskDependencyTemplateByTaskBundleIdAndTaskDependencyTemplateId", + "summary": "Deletes a time booking by id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "DeleteProjectTimeBooking", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskDependencyTemplateId", + "name": "timeBookingId", "in": "path", - "description": "The task Dependency Template Id.", + "description": "The id of the time booking to delete.", "required": true, "schema": { "type": "string", @@ -28385,8 +27940,8 @@ "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -28395,8 +27950,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -28417,32 +27972,21 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } }, - "get": { + "put": { "tags": [ - "TaskDependencyTemplates" + "TimeBookings" ], - "summary": "Returns a task dependency template by id for a given task bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", - "operationId": "GetTaskBundleTaskDependencyTemplateByTaskBundleIdAndTaskDependencyTemplateId", + "summary": "Updates a given time booking.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PutProjectTimeBooking", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskDependencyTemplateId", + "name": "timeBookingId", "in": "path", - "description": "The task Dependency Template Id.", + "description": "The id of the time booking.", "required": true, "schema": { "type": "string", @@ -28450,13 +27994,24 @@ } } ], + "requestBody": { + "description": "The model to update the time booking.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeBookingForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskDependencyTemplate" + "$ref": "#/components/schemas/TimeBooking" } } } @@ -28480,16 +28035,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -28503,28 +28048,26 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "read" + "any": "true" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates": { + "/projecttypes": { "get": { "tags": [ - "TaskBundles" + "ProjectTypes" ], - "summary": "Lists task list templates for a task bundle.", + "summary": "Returns all existing project types.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleTaskListTemplatesByTaskBundleId", + "operationId": "GetProjectTypes", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, + "name": "showArchived", + "in": "query", + "description": "Whether to include archived project types in the results. Default is false.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } }, { @@ -28548,21 +28091,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/NestedTaskList" + "$ref": "#/components/schemas/ProjectType" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -28581,29 +28114,16 @@ }, "post": { "tags": [ - "TaskBundles" - ], - "summary": "Creates a task list template for a bundle.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskListTemplatesByTaskBundleId", - "parameters": [ - { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle to create the task list template for.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "ProjectTypes" ], + "summary": "Creates a new project type.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectType", "requestBody": { - "description": "The model to create a task list template.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskListForm" + "$ref": "#/components/schemas/ProjectTypeForm" } } }, @@ -28615,17 +28135,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NestedTaskList" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ProjectType" } } } @@ -28643,50 +28153,28 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "project-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}": { - "delete": { + "/projecttypes/icons": { + "get": { "tags": [ - "TaskBundles" - ], - "summary": "Deletes a task list template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "DeleteTaskBundleTaskListTemplateByTaskBundleIdAndTaskListTemplateId", - "parameters": [ - { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", - "in": "path", - "description": "The task List Template Id.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "ProjectTypes" ], + "summary": "Retrieves all available project type icons.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTypesIcons", "responses": { - "204": { - "description": "No Content" - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "type": "string" + } } } } @@ -28703,32 +28191,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } - }, + } + }, + "/projecttypes/{projectTypeId}": { "get": { "tags": [ - "TaskBundles" + "ProjectTypes" ], - "summary": "Gets a task list template.", + "summary": "Retrieves a project type by its ID.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleTaskListTemplateByTaskBundleIdAndTaskListTemplateId", + "operationId": "GetProjectTypeById", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", + "name": "projectTypeId", "in": "path", - "description": "The task list template id.", + "description": "The id of the project type.", "required": true, "schema": { "type": "string", @@ -28742,7 +28221,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NestedTaskList" + "$ref": "#/components/schemas/ProjectType" } } } @@ -28774,26 +28253,16 @@ }, "put": { "tags": [ - "TaskBundles" + "ProjectTypes" ], - "summary": "Updates a task list template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PutTaskBundleTaskListTemplateByTaskBundleIdAndTaskListTemplateId", + "summary": "Updates an existing project type.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutProjectTypeById", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", + "name": "projectTypeId", "in": "path", - "description": "The task list template id.", + "description": "The id of the project type.", "required": true, "schema": { "type": "string", @@ -28802,11 +28271,11 @@ } ], "requestBody": { - "description": "The task list bundle put form.", + "description": "The model to update the project type.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskListBundlePutForm" + "$ref": "#/components/schemas/ProjectTypeForm" } } }, @@ -28818,7 +28287,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NestedTaskList" + "$ref": "#/components/schemas/ProjectType" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -28846,33 +28325,23 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "project-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/addtasktemplates": { + "/projecttypes/{projectTypeId}/delete": { "post": { "tags": [ - "TaskBundles" + "ProjectTypes" ], - "summary": "Adds task templates to a task list template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskListTemplateAddTaskTemplatesByTaskBundleIdAndTaskListTemplateId", + "summary": "Deletes a project type and reassigns related projects and templates.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTypeDeleteByProjectTypeId", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", + "name": "projectTypeId", "in": "path", - "description": "The task List Template Id.", + "description": "The id of the project type.", "required": true, "schema": { "type": "string", @@ -28881,32 +28350,19 @@ } ], "requestBody": { - "description": "The task Template To Task List Template list.", + "description": "The model to delete the project type.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskTemplateToTaskListTemplate" - } + "$ref": "#/components/schemas/DeleteProjectTypeForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ReorderingResult" - } - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -28941,33 +28397,23 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "project-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/removetasktemplates": { + "/projecttypes/{projectTypeId}/setarchived": { "post": { "tags": [ - "TaskBundles" + "ProjectTypes" ], - "summary": "Removes task templates from a task list template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskListTemplateRemoveTaskTemplatesByTaskBundleIdAndTaskListTemplateId", + "summary": "Archives or unarchives the project type with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostProjectTypeSetArchivedByProjectTypeId", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", + "name": "projectTypeId", "in": "path", - "description": "The task List Template Id.", + "description": "The id of the project type.", "required": true, "schema": { "type": "string", @@ -28976,40 +28422,22 @@ } ], "requestBody": { - "description": "The guid list.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/schemas/ArchivedForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ProjectType" } } } @@ -29027,37 +28455,26 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "project-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/tasktemplates": { + "/roles": { "get": { "tags": [ - "TaskBundles" + "Roles" ], - "summary": "Lists task templates inside a task list template.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleTaskListTemplateTaskTemplatesByTaskBundleIdAndTaskListTemplateId", + "summary": "Returns all roles of the workspace.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRoles", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", - "in": "path", - "description": "The task list template id.", - "required": true, + "name": "showArchived", + "in": "query", + "description": "Whether to show archived roles.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } } ], @@ -29069,21 +28486,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskTemplate" + "$ref": "#/components/schemas/Role" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -29097,63 +28504,41 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } - } - }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/tasktemplates/{taskTemplateId}": { - "get": { + }, + "post": { "tags": [ - "TaskBundles" + "Roles" ], - "summary": "Gets a task template inside a task list template.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleTaskListTemplateTaskTemplateByTaskBundleIdAndTaskListTemplateIdAndTaskTemplateId", - "parameters": [ - { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", - "in": "path", - "description": "The task list template id.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Creates a new role with specified permissions.", + "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRole", + "requestBody": { + "description": "The role form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleForm" + } } }, - { - "name": "taskTemplateId", - "in": "path", - "description": "The id of the task template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplate" + "$ref": "#/components/schemas/Role" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -29174,64 +28559,36 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" + }, + "x-subscriptionlevel": { + "minimumPlan": "standard" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/tasktemplates/{taskTemplateId}/updateorder": { + "/roles/moveuser": { "post": { "tags": [ - "TaskBundles" - ], - "summary": "Updates the order of a task template inside a task list template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskListTemplateTaskTemplateUpdateOrderByTaskBundleIdAndTaskListTemplateIdAndTaskTemplateId", - "parameters": [ - { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskListTemplateId", - "in": "path", - "description": "The task List Template Id.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskTemplateId", - "in": "path", - "description": "The id of the task template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Roles" ], + "summary": "Moves a user from their current role to another role.", + "description": "Moves a user from their current role to another role.\r\n At least one user needs to remain in the admin role.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRolesMoveUser", "requestBody": { - "description": "The task In Task List Update Order form.", + "description": "The move user in role payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskInTaskListUpdateOrderForm" + "$ref": "#/components/schemas/MoveUserInRole" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK" }, "400": { "description": "Bad Request", @@ -29266,61 +28623,52 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "workspace-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/updateorder": { - "post": { + "/roles/users": { + "get": { "tags": [ - "TaskBundles" + "Roles" ], - "summary": "Updates the order of task templates in a task list template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskListTemplateUpdateOrderByTaskBundleIdAndTaskListTemplateId", + "summary": "Returns all users in roles of the workspace.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRolesUsers", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "taskListTemplateId", - "in": "path", - "description": "The task List Template Id.", + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + }, + { + "name": "aw-internal-request", + "in": "header", + "description": "Marks this request as an internal request. Only allowed by the awork app or internally.", "required": true, "schema": { "type": "string", - "format": "uuid" + "default": "true" } } ], - "requestBody": { - "description": "The update Order form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrderForm" - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/UserInRole" + } } } } @@ -29338,40 +28686,29 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" - } + "workspace-manage-config": "read" + }, + "x-internal": true } }, - "/taskbundles/{taskBundleId}/tasktemplates": { + "/roles/{roleId}": { "get": { "tags": [ - "TaskTemplates" + "Roles" ], - "summary": "Returns all task templates of the task bundle with the specified id.", - "description": "Returns all task templates of the task bundle with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleTaskTemplatesByTaskBundleId", + "summary": "Returns the role with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRoleById", "parameters": [ { - "name": "taskBundleId", + "name": "roleId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -29380,10 +28717,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskTemplate" - } + "$ref": "#/components/schemas/Role" } } } @@ -29410,21 +28744,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } }, - "post": { + "put": { "tags": [ - "TaskTemplates" + "Roles" ], - "summary": "Creates a new task template for the task bundle with the specified id.", - "description": "Creates a new task template for the task bundle with the specified id.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundleTaskTemplatesByTaskBundleId", + "summary": "Updates the role with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PutRoleById", "parameters": [ { - "name": "taskBundleId", + "name": "roleId", "in": "path", - "description": "The id of the task bundle.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", @@ -29433,11 +28768,11 @@ } ], "requestBody": { - "description": "The task Template form payload.", + "description": "The role form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplateForm" + "$ref": "#/components/schemas/RoleForm" } } }, @@ -29449,7 +28784,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplate" + "$ref": "#/components/schemas/Role" } } } @@ -29487,33 +28822,23 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "workspace-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasktemplates/{taskTemplateId}": { - "delete": { + "/roles/{roleId}/adduser": { + "post": { "tags": [ - "TaskTemplates" + "Roles" ], - "summary": "Deletes the task template for the task bundle with the specified id.", - "description": "Deletes the task template for the task bundle with the specified id.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "DeleteTaskBundleTaskTemplateByTaskBundleIdAndTaskTemplateId", + "summary": "Adds the user to the role with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRoleAddUserByRoleId", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskTemplateId", + "name": "roleId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", @@ -29521,9 +28846,30 @@ } } ], + "requestBody": { + "description": "The user in role form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserInRoleForm" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "404": { "description": "Not Found", @@ -29534,6 +28880,16 @@ } } } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -29548,31 +28904,23 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "workspace-manage-config": "write" } - }, + } + }, + "/roles/{roleId}/deactivatedmenuitems": { "get": { "tags": [ - "TaskTemplates" + "Roles" ], - "summary": "Returns the task template of the task bundle with the specified id.", - "description": "Returns the task template of the task bundle with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskBundleTaskTemplateByTaskBundleIdAndTaskTemplateId", + "summary": "Returns all deactivated menu items for the specified role.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRoleDeactivatedMenuItemsByRoleId", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskTemplateId", + "name": "roleId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", @@ -29586,13 +28934,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplate" - } + "type": "array", + "items": { + "type": "string" + } + }, + "example": [ + "https://www.awork.com" + ] } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -29613,31 +28967,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } }, - "put": { + "post": { "tags": [ - "TaskTemplates" + "Roles" ], - "summary": "Updates the task template for the task bundle with the specified id.", - "description": "Updates the task template for the task bundle with the specified id.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PutTaskBundleTaskTemplateByTaskBundleIdAndTaskTemplateId", + "summary": "Creates or updates the deactivated menu items for the specified role.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRoleDeactivatedMenuItemsByRoleId", "parameters": [ { - "name": "taskBundleId", - "in": "path", - "description": "The id of the task bundle.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskTemplateId", + "name": "roleId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", @@ -29646,23 +28991,29 @@ } ], "requestBody": { - "description": "The task Template form payload.", + "description": "The list of menu item keys.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplateForm" + "type": "array", + "items": { + "type": "string" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplate" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -29690,23 +29041,23 @@ ], "x-access": { "admin": "true", - "task-manage-config": "write" + "workspace-manage-config": "write" } } }, - "/taskbundles/{taskBundleId}/tasktemplates/{taskTemplateId}/setassignees": { + "/roles/{roleId}/delete": { "post": { "tags": [ - "TaskTemplates" + "Roles" ], - "summary": "Assigns a list of users to task templates.", - "description": "Users that are not passed and are already assigned will be removed.\r\n Removes existing task template assignments and adds the new assignment.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskBundlesTaskTemplatesSetAssigneesByTaskBundleIdAndTaskTemplateId", + "summary": "Deletes the role with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRoleDeleteByRoleId", "parameters": [ { - "name": "taskTemplateId", + "name": "roleId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", @@ -29715,15 +29066,11 @@ } ], "requestBody": { - "description": "The id of the users.", + "description": "The delete role form payload.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/schemas/DeleteRoleForm" } } }, @@ -29733,8 +29080,8 @@ "204": { "description": "No Content" }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -29742,56 +29089,9 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "task-manage-config": "write" - } - } - }, - "/taskdependencies": { - "post": { - "tags": [ - "TaskDependencies" - ], - "summary": "Creates a new task dependency.", - "description": "To create a task dependency, the user needs to be the assignee of both tasks or have `ProjectPlanning`\r\n permissions in general or in the project the tasks are related to.", - "operationId": "PostTaskDependency", - "requestBody": { - "description": "The task Dependency form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskDependencyForm" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskDependency" - } - } - } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -29800,8 +29100,8 @@ } } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "content": { "application/json": { "schema": { @@ -29822,40 +29122,53 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/taskdependencies/{taskDependencyId}": { - "delete": { + "/roles/{roleId}/permissions": { + "get": { "tags": [ - "TaskDependencies" + "Roles" ], - "summary": "Deletes a task dependency.", - "description": "To delete a task dependency, the User needs to be the assignee of both tasks or have 'ProjectPlanning'\r\n permissions in general or in the project the task are related to.", - "operationId": "DeleteTaskdependencyByTaskDependencyId", + "summary": "Returns all permissions of the specified role.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRolePermissionsByRoleId", "parameters": [ { - "name": "taskDependencyId", + "name": "roleId", "in": "path", - "description": "The id of the task dependency.", + "description": "The id of the role.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/PermissionOfGlobalRole" + } } } } @@ -29882,24 +29195,35 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } - } - }, - "/tasks": { + }, "post": { "tags": [ - "Tasks" + "Roles" + ], + "summary": "Creates, updates or deletes a permission of the specified role.", + "description": "Creates, updates or deletes a permission of the role.\r\n If the permission already exist, and the 'AccessLevels' property of the model is not empty,\r\n the permission will be updated. If the 'AccessLevels' property of the model is empty,\r\n the permission will be deleted.\r\n The permission will be created if it does not exist.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostRolePermissionsByRoleId", + "parameters": [ + { + "name": "roleId", + "in": "path", + "description": "The id of the role.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Creates a new project or private task.", - "description": "The user mast either have `project-planning-data:write` permissions, be assigned to the parent task (if a parent task is specified) or create a private task.", - "operationId": "PostTask", "requestBody": { - "description": "The general Task Post form payload.", + "description": "The permission of role form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GeneralTaskPostForm" + "$ref": "#/components/schemas/PermissionOfRoleForm" } } }, @@ -29911,11 +29235,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/PermissionOfProjectRole" } } } }, + "204": { + "description": "No Content" + }, "400": { "description": "Bad Request", "content": { @@ -29926,8 +29253,8 @@ } } }, - "401": { - "description": "Unauthorized", + "500": { + "description": "Internal Server Error", "content": { "application/json": { "schema": { @@ -29948,24 +29275,37 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/tasks/assignuserbyemail": { + "/roles/{roleId}/setarchived": { "post": { "tags": [ - "Tasks" + "Roles" + ], + "summary": "Archives or unarchives the role with the specified id.", + "description": "Archives or unarchives the role with the specified id.\r\n An archived role still exists for all users currently using it,\r\n but users can no longer be assigned to this role.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostRoleSetArchivedByRoleId", + "parameters": [ + { + "name": "roleId", + "in": "path", + "description": "The id of the role.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Invites a user by email and assigns them to a task.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTasksAssignUserByEmail", "requestBody": { - "description": "The assign By Email form payload.", + "description": "The archived form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AssignByEmailForm" + "$ref": "#/components/schemas/ArchivedForm" } } }, @@ -29973,7 +29313,14 @@ }, "responses": { "200": { - "description": "OK" + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + } + } + } }, "400": { "description": "Bad Request", @@ -30007,63 +29354,68 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/batch/{operation}": { - "post": { + "/roles/{roleId}/users": { + "get": { "tags": [ - "Tasks" + "Roles" ], - "summary": "Edits multiple tasks using the specified operation.", - "description": "Returns MultiStatus including the list of successful and failed tasks.\r\n \r\n Supported Operations:\r\n
    >\r\n
  • movetoproject: Moves all tasks to a new project.
  • movetotasklist: Moves all tasks to a new task list inside the same project.
  • moveundertask: Moves every selected task (and their subtasks) under the specified parent task, validating project boundaries.
  • setdates: Sets the due and optionally start date for all tasks.
  • adjustdates: Offsets start and due dates by the specified number of days while respecting the user's timezone.
  • addtags: Adds a list of tags to all tasks in the list that don't already have the tag.
  • delete: Deletes all tasks. Optional including time trackings.
  • changetypeofwork: Changes the type of work for a list of tasks. Optionally also for the related timetrackings.
  • assignusers: Assigns a list of users to a list of tasks.
  • unassignusers: Unassigns a list of users from a list of tasks. If the UserIds are not provided, all users are unassigned.
  • setprio: Sets the prio flag for a list of tasks.
  • changetaskstatus: Sets the task status for a list of tasks.
  • copy: Creates copies of all specified tasks (including subtasks) and reorders them to maintain hierarchy.
  • plannerbatch: Multiple operations to a single task. Used in the planner.
The user must have `write` permissions on all tasks as well as related entities modified by the operation.", - "operationId": "PostTasksBatchByOperation", + "summary": "Returns all users of the specified role.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRoleUsersByRoleId", "parameters": [ { - "name": "operation", + "name": "roleId", "in": "path", - "description": "The operation to perform on all tasks.", + "description": "The id of the role.", "required": true, "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "The model describing the batch task operation.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BatchOperationForm" - } + "type": "string", + "format": "uuid" } }, - "required": true - }, - "responses": { - "207": { - "description": "Multi-Status", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MultiStatusResult" - } - } + { + "name": "showArchived", + "in": "query", + "description": "Whether to show archived users.", + "schema": { + "type": "boolean", + "default": false } }, - "400": { - "description": "Bad Request", + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/UserInRole" + } } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -30084,38 +29436,57 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } } }, - "/tasks/changebasetypes": { + "/roles/{roleId}/users/{userId}/activate": { "post": { "tags": [ - "Tasks" + "Roles" ], - "summary": "Changes the base type for multiple tasks.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTasksChangeBaseTypes", - "requestBody": { - "description": "The tasks Change Base Types form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TasksChangeBaseTypesForm" - } + "summary": "Activates the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRoleUserActivateByRoleIdAndUserId", + "parameters": [ + { + "name": "roleId", + "in": "path", + "description": "The id of the role.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK" }, - "207": { - "description": "Multi-Status" + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "400": { - "description": "Bad Request", + "500": { + "description": "Internal Server Error", "content": { "application/json": { "schema": { @@ -30136,48 +29507,57 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/tasks/changelists": { + "/roles/{roleId}/users/{userId}/deactivate": { "post": { "tags": [ - "Tasks" + "Roles" ], - "summary": "Changes the lists of tasks.", - "description": "Adds tasks to lists, removes them and reorders tasks within lists.\r\n\r\nAny authenticated user.", - "operationId": "PostTasksChangeLists", - "requestBody": { - "description": "The change Task List forms.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChangeTaskListsForm" - } - } + "summary": "Deactivates the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostRoleUserDeactivateByRoleIdAndUserId", + "parameters": [ + { + "name": "roleId", + "in": "path", + "description": "The id of the role.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChangeTaskListsForm" - } + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "500": { + "description": "Internal Server Error", "content": { "application/json": { "schema": { @@ -30198,39 +29578,41 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/tasks/changestatuses": { - "post": { + "/roles/{roleName}": { + "get": { "tags": [ - "Tasks" + "Roles" ], - "summary": "Changes statuses of tasks.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTasksChangeStatuses", - "requestBody": { - "description": "The change Status form list.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChangeStatusForm" + "summary": "Returns the role with the specified name.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetRoleByRoleName", + "parameters": [ + { + "name": "roleName", + "in": "path", + "description": "The name of the role.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, - "207": { - "description": "Multi-Status" - }, "400": { "description": "Bad Request", "content": { @@ -30253,35 +29635,64 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } } }, - "/tasks/changesubtasks": { - "post": { + "/search": { + "get": { "tags": [ - "Tasks" + "Search" ], - "summary": "Changes the parent task and the order of subtasks.", - "description": "Changes parent task and order of subtasks. If the parent task of a subtask changed, its lists, base type and entity\r\n will change to match the parent ones.\r\n It is not possible to change a task to subtask if the task already has subtasks.\r\n\r\nAny authenticated user.", - "operationId": "PostTasksChangeSubtasks", - "requestBody": { - "description": "The subtask Changes model.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChangeSubtasksPostForm" - } - } + "summary": "Performs a full-text search across workspace entities.", + "description": "This endpoint enables powerful full-text search capabilities across multiple types.\r\n It returns a ranked list of matching entities based on relevance and respects user permissions.\r\n \r\n The search functionality includes:\r\n - Cross-entity search across various entity types in the workspace.\r\n - Relevance-based scoring and ranking of results.\r\n - Respecting user access permissions for all returned results.\r\n - Customizable result filtering by entity type and status.\r\n\r\nAny authenticated user.", + "operationId": "GetSearch", + "parameters": [ + { + "name": "searchTerm", + "in": "query", + "description": "The term to search for. Max. 50 characters. Required.", + "schema": { + "type": "string" } }, - "required": true - }, + { + "name": "searchTypes", + "in": "query", + "description": "Comma-separated list of types to search for, or 'all'. Supported types: task, project, user, company, comment, timeentry, timereport, file, document, tasklist, dashboardnote.", + "schema": { + "type": "string" + } + }, + { + "name": "top", + "in": "query", + "description": "Count of top results. Default: 20.", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "includeClosedAndStuck", + "in": "query", + "description": "If true, the result will include entities where the status is closed, stuck and done.", + "schema": { + "type": "boolean" + } + } + ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchResults" + } + } + } }, "400": { "description": "Bad Request", @@ -30292,6 +29703,16 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -30309,31 +29730,28 @@ } } }, - "/tasks/changesubtaskstoparent": { - "post": { + "/sharedfiles": { + "get": { "tags": [ - "Tasks" + "SharedFiles" ], - "summary": "Convert subtasks to a parent task.", - "description": "Convert subtasks to a parent task. If list ids are not provided it will keep the same lists as the old parent task,\r\n placing the task as last item in the lists.\r\n If multiple list ids are provided per task, the lists will be overwritten with the lists provided. In this case, if an\r\n order is not provided, it will be put as the last item in the list.\r\n\r\nAny authenticated user.", - "operationId": "PostTasksChangeSubtasksToParent", - "requestBody": { - "description": "The change Subtasks To Parent Post form list.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChangeSubtasksToParentPostForm" - } - } + "summary": "Returns a shared file.", + "description": "Returns the shared file for the provided token.\r\n\r\nAllows unauthenticated access.", + "operationId": "GetSharedFiles", + "parameters": [ + { + "name": "token", + "in": "query", + "description": "The token to allow access.", + "required": true, + "schema": { + "type": "string" } - }, - "required": true - }, + } + ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK" }, "400": { "description": "Bad Request", @@ -30344,51 +29762,9 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/tasks/changetypeofwork": { - "post": { - "tags": [ - "Tasks" - ], - "summary": "Changes the type of work for a batch of tasks.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTasksChangeTypeOfWork", - "requestBody": { - "description": "The tasks Change Types form payload.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TasksChangeTypesForm" - } - } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, - "207": { - "description": "Multi-Status" - }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -30409,42 +29785,42 @@ "v1" ], "x-access": { - "any": "true" + "anonymous": "true" } } }, - "/tasks/delete": { - "post": { + "/taskbundles": { + "get": { "tags": [ - "Tasks" + "TaskBundles" ], - "summary": "Deletes tasks and optionally related time entries.", - "description": "Returns 207 MultiStatus when individual deletions fail.\r\n\r\nAny authenticated user.", - "operationId": "PostTasksDelete", - "requestBody": { - "description": "The model describing the task deletion request.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TasksDeleteForm" - } - } + "summary": "Lists task bundles.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundles", + "parameters": [ + { + "$ref": "#/components/parameters/page" }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + { + "$ref": "#/components/parameters/pageSize" }, - "207": { - "description": "Multi-Status" + { + "$ref": "#/components/parameters/orderby" }, - "400": { - "description": "Bad Request", + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskBundle" + } } } } @@ -30463,43 +29839,38 @@ "x-access": { "any": "true" } - } - }, - "/tasks/deletetags": { + }, "post": { "tags": [ - "TaskTags" + "TaskBundles" ], - "summary": "Removes a tag from all project tasks.", - "description": "Removes a tag from all project tasks.\r\n\r\nThe user must be an admin or have `project-planning-data:write` permissions.", - "operationId": "PostTasksDeleteTags", + "summary": "Creates a task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundle", "requestBody": { - "description": "The model to delete the tag from all tasks.", + "description": "The task bundle form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteTagForm" + "$ref": "#/components/schemas/TaskBundleForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskBundle" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -30521,36 +29892,48 @@ ], "x-access": { "admin": "true", - "project-planning-data": "write" + "task-manage-config": "write" } } }, - "/tasks/key/{taskIdentifier}": { - "get": { + "/taskbundles/fromproject/{projectId}": { + "post": { "tags": [ - "Tasks" + "TaskBundles" ], - "summary": "Returns the task with the specified key.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTasksKeyByTaskIdentifier", + "summary": "Creates a task bundle from a project.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundlesFromProjectByProjectId", "parameters": [ { - "name": "taskIdentifier", + "name": "projectId", "in": "path", - "description": "The task identifier to lookup (for example, KEY-123).", + "description": "The id of the project.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "description": "The model to create a task bundle from a project.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTaskBundleFromProjectForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/TaskBundle" } } } @@ -30564,26 +29947,6 @@ } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -30597,45 +29960,55 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/settaskpriority": { + "/taskbundles/fromtasklist/{taskListId}": { "post": { "tags": [ - "Tasks" + "TaskBundles" + ], + "summary": "Creates a task bundle from a task list.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundlesFromTaskListByTaskListId", + "parameters": [ + { + "name": "taskListId", + "in": "path", + "description": "The id of the task list.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Sets the priority flag for a task.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTasksSetTaskPriority", "requestBody": { - "description": "The task Set Prio form payload.", + "description": "The form to create a task bundle from a task list.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskSetPrioForm" + "$ref": "#/components/schemas/TaskBundleFromTaskListForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskBundle" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -30656,18 +30029,19 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/tags": { + "/taskbundles/icons": { "get": { "tags": [ - "TaskTags" + "TaskBundles" ], - "summary": "Returns all task tags that are currently in use by tasks.", - "description": "Returns all task tags that are currently in use by tasks ordered by count.\r\n\r\nAny authenticated user.", - "operationId": "GetTasksTags", + "summary": "Lists available task bundle icons.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundlesIcons", "responses": { "200": { "description": "OK", @@ -30676,21 +30050,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "type": "string" } } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -30708,41 +30072,29 @@ } } }, - "/tasks/updatetags": { - "post": { + "/taskbundles/{taskBundleId}": { + "delete": { "tags": [ - "TaskTags" + "TaskBundles" ], - "summary": "Updates a tag globally for all project tasks.", - "description": "Updates a tag for all project tasks.\r\n\r\nThe user must be an admin or have `project-planning-data:write` permissions.", - "operationId": "PostTasksUpdateTags", - "requestBody": { - "description": "The model to update the tag including the old and new tag names.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TagUpdateForm" - } + "summary": "Deletes a task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "DeleteTaskBundleById", + "parameters": [ + { + "name": "taskBundleId", + "in": "path", + "description": "The id of the task bundle.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "204": { "description": "No Content" - }, - "207": { - "description": "Multi-Status" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -30757,23 +30109,21 @@ ], "x-access": { "admin": "true", - "project-planning-data": "write" + "task-manage-config": "write" } - } - }, - "/tasks/{taskId}": { + }, "get": { "tags": [ - "Tasks" + "TaskBundles" ], - "summary": "Returns the task with the specified id.", - "description": "The required permissions depend on the base type of the task.\r\n If the task is a project task, 'read' permissions on the 'project-planning-data' feature are required.\r\n For a user's private task, no special permissions are required.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskById", + "summary": "Gets a task bundle by id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleById", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -30787,17 +30137,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskBundle" } } } @@ -30829,16 +30169,16 @@ }, "put": { "tags": [ - "Tasks" + "TaskBundles" ], - "summary": "Updates the task with the specified id.", - "description": "To update the task, the user needs to be the assignee of the task or 'ProjectPlanning'\r\n permissions in general or in the project the task is related to.\r\n\r\nAny authenticated user.", - "operationId": "PutTaskById", + "summary": "Updates a task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PutTaskBundleById", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -30847,11 +30187,11 @@ } ], "requestBody": { - "description": "The model describing the task updates.", + "description": "The task bundle form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GeneralTaskForm" + "$ref": "#/components/schemas/TaskBundleForm" } } }, @@ -30863,13 +30203,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/TaskBundle" } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -30877,19 +30217,68 @@ } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "task-manage-config": "write" + } + } + }, + "/taskbundles/{taskBundleId}/copy": { + "post": { + "tags": [ + "TaskBundles" + ], + "summary": "Creates a copy of an existing task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleCopyByTaskBundleId", + "parameters": [ + { + "name": "taskBundleId", + "in": "path", + "description": "The id of the task bundle.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model containing the data to copy the task bundle.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyTaskBundleForm" + } + } }, - "401": { - "description": "Unauthorized", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskBundle" } } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -30910,40 +30299,29 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/activities": { + "/taskbundles/{taskBundleId}/taskdependencytemplates": { "get": { "tags": [ - "Task Activities" + "TaskDependencyTemplates" ], - "summary": "Returns all activities of the task with the specified id.", - "description": "The activities contain information about the type of the activity, which property was changed and by whom.\r\n This contains changes to first-level properties of the task, like name, description, status, etc., as well as several related entities, such as tags, assignments, etc.\r\n This does not include activities of sub-entities, like tasks of a project or comments on a task.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskActivities", + "summary": "Returns all task dependency templates for a given task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", + "operationId": "GetTaskBundleTaskDependencyTemplatesByTaskBundleId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -30954,7 +30332,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ActivityModel" + "$ref": "#/components/schemas/TaskDependencyTemplate" } } } @@ -31002,23 +30380,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "read" } - } - }, - "/tasks/{taskId}/addtags": { + }, "post": { "tags": [ - "TaskTags" + "TaskDependencyTemplates" ], - "summary": "Adds a batch of tags to the task with the specified id.", - "description": "The request fails if one of the tags is invalid (e.g. empty or duplicate).\r\n To add tags to a task the user must have `write` permissions on the specified task.", - "operationId": "PostTaskAddTagsByTaskId", + "summary": "Creates a task dependency template for two task templates of the given task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskDependencyTemplatesByTaskBundleId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task to add the tags to.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31027,14 +30404,11 @@ } ], "requestBody": { - "description": "The model with the tags to be added.", + "description": "The model describing the task dependency template to create.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagForm" - } + "$ref": "#/components/schemas/TaskDependencyTemplateForm" } } }, @@ -31046,10 +30420,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } + "$ref": "#/components/schemas/TaskDependencyTemplate" } } } @@ -31073,6 +30444,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -31086,23 +30467,34 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/checklistitems": { - "get": { - "tags": [ - "ChecklistItems" + "/taskbundles/{taskBundleId}/taskdependencytemplates/{taskDependencyTemplateId}": { + "delete": { + "tags": [ + "TaskDependencyTemplates" ], - "summary": "Returns the checklist items for the task with the specified id.", - "description": "The user must have at least `read` permissions on the specified task.", - "operationId": "GetTaskChecklistItemsByTaskId", + "summary": "Deletes the task dependency template from the task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "DeleteTaskBundleTaskDependencyTemplateByTaskBundleIdAndTaskDependencyTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskDependencyTemplateId", + "in": "path", + "description": "The task Dependency Template Id.", "required": true, "schema": { "type": "string", @@ -31111,18 +30503,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -31156,21 +30538,32 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } }, - "post": { + "get": { "tags": [ - "ChecklistItems" + "TaskDependencyTemplates" ], - "summary": "Creates a checklist item for a task with the specified id.", - "description": "The required permissions depend on the base type of the task. If the task is a project task, the user must have either `project-master-data:write` permissions or be assigned to the task. For a user's private task, no special permissions are required.", - "operationId": "PostTaskChecklistItemsByTaskId", + "summary": "Returns a task dependency template by id for a given task bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", + "operationId": "GetTaskBundleTaskDependencyTemplateByTaskBundleIdAndTaskDependencyTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskDependencyTemplateId", + "in": "path", + "description": "The task Dependency Template Id.", "required": true, "schema": { "type": "string", @@ -31178,24 +30571,23 @@ } } ], - "requestBody": { - "description": "The checklist item form.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChecklistItemForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" + "$ref": "#/components/schemas/TaskDependencyTemplate" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -31232,28 +30624,41 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "read" } } }, - "/tasks/{taskId}/checklistitems/tosubtasks": { - "post": { + "/taskbundles/{taskBundleId}/tasklisttemplates": { + "get": { "tags": [ - "ChecklistItems" + "TaskBundles" ], - "summary": "Converts all checklist items of the specified task to subtasks.", - "description": "The user must have at least `write` permissions on the specified task.", - "operationId": "PostTaskChecklistItemsToSubtasksByTaskId", + "summary": "Lists task list templates for a task bundle.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleTaskListTemplatesByTaskBundleId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -31264,14 +30669,14 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/NestedTaskList" } } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -31279,13 +30684,59 @@ } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "TaskBundles" + ], + "summary": "Creates a task list template for a bundle.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskListTemplatesByTaskBundleId", + "parameters": [ + { + "name": "taskBundleId", + "in": "path", + "description": "The id of the task bundle to create the task list template for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to create a task list template.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskListForm" + } + } }, - "401": { - "description": "Unauthorized", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/NestedTaskList" } } } @@ -31312,23 +30763,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/checklistitems/{checklistItemId}": { + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}": { "delete": { "tags": [ - "ChecklistItems" + "TaskBundles" ], - "summary": "Deletes a checklist item from a task.", - "description": "The user must have at least `write` permissions on the specified task.", - "operationId": "DeleteTaskChecklistItemByTaskIdAndChecklistItemId", + "summary": "Deletes a task list template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "DeleteTaskBundleTaskListTemplateByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31336,9 +30788,9 @@ } }, { - "name": "checklistItemId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the checklist item to delete.", + "description": "The task List Template Id.", "required": true, "schema": { "type": "string", @@ -31350,16 +30802,6 @@ "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -31382,21 +30824,22 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } }, "get": { "tags": [ - "ChecklistItems" + "TaskBundles" ], - "summary": "Returns the checklist item with the specified id for a task.", - "description": "The user must have at least `read` permissions on the specified task.", - "operationId": "GetTaskChecklistItemByTaskIdAndChecklistItemId", + "summary": "Gets a task list template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleTaskListTemplateByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31404,9 +30847,9 @@ } }, { - "name": "checklistItemId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the checklist item.", + "description": "The task list template id.", "required": true, "schema": { "type": "string", @@ -31420,17 +30863,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/NestedTaskList" } } } @@ -31462,16 +30895,16 @@ }, "put": { "tags": [ - "ChecklistItems" + "TaskBundles" ], - "summary": "Updates a checklist item for a task with the specified id.", - "description": "The required permissions depend on the base type of the task. If the task is a project task, the user must have either `project-master-data:write` permissions or be assigned to the task. For a user's private task, no special permissions are required.", - "operationId": "PutTaskChecklistItemByTaskIdAndChecklistItemId", + "summary": "Updates a task list template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PutTaskBundleTaskListTemplateByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31479,9 +30912,9 @@ } }, { - "name": "checklistItemId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the checklist item.", + "description": "The task list template id.", "required": true, "schema": { "type": "string", @@ -31490,11 +30923,11 @@ } ], "requestBody": { - "description": "The checklist item form.", + "description": "The task list bundle put form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItemForm" + "$ref": "#/components/schemas/TaskListBundlePutForm" } } }, @@ -31506,17 +30939,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/NestedTaskList" } } } @@ -31543,90 +30966,55 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/comments": { - "delete": { + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/addtasktemplates": { + "post": { "tags": [ - "TaskComments" + "TaskBundles" ], - "summary": "Deletes all comments of the specified task.", - "description": "Deletes all comments of the specified task.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCommentsByTaskNameAndTaskId", + "summary": "Adds task templates to a task list template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskListTemplateAddTaskTemplatesByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "204": { - "description": "No Content" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "get": { - "tags": [ - "TaskComments" - ], - "summary": "Returns all comments of the task with the specified id.", - "description": "Returns all comments of the task with the specified id. The user needs read permissions on the task.\r\n\r\nAny authenticated user.", - "operationId": "GetCommentsByTaskNameAndTaskId", - "parameters": [ { - "name": "taskId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the task.", + "description": "The task List Template Id.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "description": "The task Template To Task List Template list.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskTemplateToTaskListTemplate" + } + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -31635,7 +31023,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/ReorderingResult" } } } @@ -31651,8 +31039,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -31673,21 +31061,34 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } - }, + } + }, + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/removetasktemplates": { "post": { "tags": [ - "TaskComments" + "TaskBundles" ], - "summary": "Creates a new comment on the task with the specified id.", - "description": "Creates a new comment on the task with the specified id.\r\n A user can only create a comment for him/herself, except for admins and api users.\r\n \r\n To create a comment the user must have at least `read` permissions on the specified task.", - "operationId": "PostCommentsByTaskNameAndTaskId", + "summary": "Removes task templates from a task list template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskListTemplateRemoveTaskTemplatesByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task to create the comment for.", + "description": "The id of the task bundle.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskListTemplateId", + "in": "path", + "description": "The task List Template Id.", "required": true, "schema": { "type": "string", @@ -31696,26 +31097,23 @@ } ], "requestBody": { - "description": "The model to create the comment.", + "description": "The guid list.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CommentForm" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Comment" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -31727,16 +31125,6 @@ } } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -31759,23 +31147,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/comments/{commentId}": { - "delete": { + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/tasktemplates": { + "get": { "tags": [ - "TaskComments" + "TaskBundles" ], - "summary": "Deletes the comment with the specified id on the task with the specified id.", - "description": "Deletes the comment with the specified id on the task with the specified id.\r\n The delete includes the reactions of the comment.\r\n If there are any replies to the comment, they will be deleted as well.\r\n\r\nAny authenticated user.", - "operationId": "DeleteCommentByTaskNameAndTaskIdAndCommentId", + "summary": "Lists task templates inside a task list template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleTaskListTemplateTaskTemplatesByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31783,9 +31172,9 @@ } }, { - "name": "commentId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the comment.", + "description": "The task list template id.", "required": true, "schema": { "type": "string", @@ -31794,15 +31183,15 @@ } ], "responses": { - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskTemplate" + } } } } @@ -31831,19 +31220,21 @@ "x-access": { "any": "true" } - }, + } + }, + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/tasktemplates/{taskTemplateId}": { "get": { "tags": [ - "TaskComments" + "TaskBundles" ], - "summary": "Returns the comment with the specified id of the task with the specified id.", - "description": "Returns the comment with the specified id of the task with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetCommentByTaskNameAndTaskIdAndCommentId", + "summary": "Gets a task template inside a task list template.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleTaskListTemplateTaskTemplateByTaskBundleIdAndTaskListTemplateIdAndTaskTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31851,9 +31242,19 @@ } }, { - "name": "commentId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the comment.", + "description": "The task list template id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", @@ -31867,13 +31268,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Comment" + "$ref": "#/components/schemas/TaskTemplate" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -31896,19 +31297,21 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/tasktemplates/{taskTemplateId}/updateorder": { + "post": { "tags": [ - "TaskComments" + "TaskBundles" ], - "summary": "Updates the comment with the specified id on the task with the specified id.", - "description": "To update a comment the user must either have at least `read` permissions on the specified task, be the creator of the comment or be admin.", - "operationId": "PutCommentByTaskNameAndTaskIdAndCommentId", + "summary": "Updates the order of a task template inside a task list template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskListTemplateTaskTemplateUpdateOrderByTaskBundleIdAndTaskListTemplateIdAndTaskTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -31916,9 +31319,19 @@ } }, { - "name": "commentId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the comment.", + "description": "The task List Template Id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", @@ -31927,29 +31340,22 @@ } ], "requestBody": { - "description": "The model with the updated comment information.", + "description": "The task In Task List Update Order form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CommentPutForm" + "$ref": "#/components/schemas/TaskInTaskListUpdateOrderForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Comment" - } - } - } + "204": { + "description": "No Content" }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -31980,23 +31386,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/comments/{commentId}/react": { + "/taskbundles/{taskBundleId}/tasklisttemplates/{taskListTemplateId}/updateorder": { "post": { "tags": [ - "TaskComments" + "TaskBundles" ], - "summary": "Updates the reactions of the comment with the specified id on the task with the specified id.", - "description": "To update a reaction of a comment the user must have at least `read` permissions on the specified task.", - "operationId": "PostCommentReactByTaskNameAndTaskIdAndCommentId", + "summary": "Updates the order of task templates in a task list template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskListTemplateUpdateOrderByTaskBundleIdAndTaskListTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -32004,9 +31411,9 @@ } }, { - "name": "commentId", + "name": "taskListTemplateId", "in": "path", - "description": "The id of the comment.", + "description": "The task List Template Id.", "required": true, "schema": { "type": "string", @@ -32015,11 +31422,11 @@ } ], "requestBody": { - "description": "The model used to update the reactions of the comment with the specified id.", + "description": "The update Order form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ReactionForm" + "$ref": "#/components/schemas/UpdateOrderForm" } } }, @@ -32029,16 +31436,6 @@ "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -32061,28 +31458,41 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/copy": { - "post": { + "/taskbundles/{taskBundleId}/tasktemplates": { + "get": { "tags": [ - "Tasks" + "TaskTemplates" ], - "summary": "Creates a copy of the specified task.", - "description": "Comments, files and activity logs are not copied.\r\n To copy a task, the user needs to be the assignee of the task or 'ProjectPlanning'\r\n permissions in general or in the project the task is related to.\r\n If the task is a parent task, it will also copy its subtasks.\r\n\r\nAny authenticated user.", - "operationId": "PostTaskCopyByTaskId", + "summary": "Returns all task templates of the task bundle with the specified id.", + "description": "Returns all task templates of the task bundle with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleTaskTemplatesByTaskBundleId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -32091,17 +31501,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskTemplate" + } } } } @@ -32130,21 +31533,19 @@ "x-access": { "any": "true" } - } - }, - "/tasks/{taskId}/deleterecurrency": { + }, "post": { "tags": [ - "Tasks" + "TaskTemplates" ], - "summary": "Deletes the recurrence rule for a task.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTaskDeleteRecurrencyByTaskId", + "summary": "Creates a new task template for the task bundle with the specified id.", + "description": "Creates a new task template for the task bundle with the specified id.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundleTaskTemplatesByTaskBundleId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", @@ -32152,9 +31553,27 @@ } } ], + "requestBody": { + "description": "The task Template form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskTemplateForm" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskTemplate" + } + } + } }, "400": { "description": "Bad Request", @@ -32166,8 +31585,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -32188,23 +31607,34 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/deletetags": { - "post": { + "/taskbundles/{taskBundleId}/tasktemplates/{taskTemplateId}": { + "delete": { "tags": [ - "TaskTags" + "TaskTemplates" ], - "summary": "Removes tags from the task with the specified id.", - "description": "Returns 204 NoContent if all tags have been removed successfully.\r\n Returns 207 MultiStatus if at least one tag could not be removed, including the reasons.\r\n \r\n To remove tags from a task the user must have `write` permissions on the specified task.", - "operationId": "PostTaskDeleteTagsByTaskId", + "summary": "Deletes the task template for the task bundle with the specified id.", + "description": "Deletes the task template for the task bundle with the specified id.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "DeleteTaskBundleTaskTemplateByTaskBundleIdAndTaskTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task to remove the tags from.", + "description": "The id of the task bundle.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", @@ -32212,39 +31642,12 @@ } } ], - "requestBody": { - "description": "The model with the tags to be removed.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DeleteTagForm" - } - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" }, - "207": { - "description": "Multi-Status" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -32265,58 +31668,56 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } - } - }, - "/tasks/{taskId}/externalfiles": { - "post": { + }, + "get": { "tags": [ - "TaskFiles" + "TaskTemplates" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Returns the task template of the task bundle with the specified id.", + "description": "Returns the task template of the task bundle with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskBundleTaskTemplateByTaskBundleIdAndTaskTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "List of file forms.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } + }, + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TaskTemplate" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -32335,88 +31736,64 @@ "x-access": { "any": "true" } - } - }, - "/tasks/{taskId}/files": { - "delete": { + }, + "put": { "tags": [ - "TaskFiles" + "TaskTemplates" ], - "summary": "Deletes the files of the specified task.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteTaskFiles", + "summary": "Updates the task template for the task bundle with the specified id.", + "description": "Updates the task template for the task bundle with the specified id.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PutTaskBundleTaskTemplateByTaskBundleIdAndTaskTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskBundleId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task bundle.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "get": { - "tags": [ - "TaskFiles" - ], - "summary": "Returns all files of the task with the specified id.", - "description": "Returns all file metadata of the task with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskFiles", - "parameters": [ + }, { - "name": "taskId", + "name": "taskTemplateId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "description": "The task Template form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskTemplateForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileInfo" - } + "$ref": "#/components/schemas/TaskTemplate" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -32433,21 +31810,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } - }, + } + }, + "/taskbundles/{taskBundleId}/tasktemplates/{taskTemplateId}/setassignees": { "post": { "tags": [ - "TaskFiles" + "TaskTemplates" ], - "summary": "Creates a new task file for the task with the specified id..", - "description": "Uploads a new task file for the task with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateTaskFile", + "summary": "Assigns a list of users to task templates.", + "description": "Users that are not passed and are already assigned will be removed.\r\n Removes existing task template assignments and adds the new assignment.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskBundlesTaskTemplatesSetAssigneesByTaskBundleIdAndTaskTemplateId", "parameters": [ { - "name": "taskId", + "name": "taskTemplateId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", @@ -32456,41 +31836,33 @@ } ], "requestBody": { + "description": "The id of the users.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" + "type": "array", + "items": { + "type": "string", + "format": "uuid" } } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } - }, - "400": { - "description": "Bad Request" } }, "security": [ @@ -32504,36 +31876,25 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/tasks/{taskId}/files/byuploadid": { + "/taskdependencies": { "post": { "tags": [ - "FileUpload" - ], - "summary": "Creates a file from an upload id.", - "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file task from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", - "operationId": "PostUploadByUploadId", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task to attach the file to.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TaskDependencies" ], + "summary": "Creates a new task dependency.", + "description": "To create a task dependency, the user needs to be the assignee of both tasks or have `ProjectPlanning`\r\n permissions in general or in the project the tasks are related to.", + "operationId": "PostTaskDependency", "requestBody": { - "description": "The model describing the uploaded file metadata.", + "description": "The task Dependency form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UploadByUploadIdForm" + "$ref": "#/components/schemas/TaskDependencyForm" } } }, @@ -32545,7 +31906,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TaskDependency" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -32576,19 +31947,19 @@ } } }, - "/tasks/{taskId}/files/byurl": { - "post": { + "/taskdependencies/{taskDependencyId}": { + "delete": { "tags": [ - "TaskFiles" + "TaskDependencies" ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateTaskFileByUrl", + "summary": "Deletes a task dependency.", + "description": "To delete a task dependency, the User needs to be the assignee of both tasks or have 'ProjectPlanning'\r\n permissions in general or in the project the task are related to.", + "operationId": "DeleteTaskdependencyByTaskDependencyId", "parameters": [ { - "name": "taskId", + "name": "taskDependencyId", "in": "path", - "description": "The id of the task the file is linked to.", + "description": "The id of the task dependency.", "required": true, "schema": { "type": "string", @@ -32596,82 +31967,30 @@ } } ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - } - } - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/tasks/{taskId}/files/{fileId}": { - "delete": { - "tags": [ - "TaskFiles" - ], - "summary": "Deletes the task file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteTaskFile", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } } - ], - "responses": { - "204": { - "description": "No Content" - } }, "security": [ { @@ -32686,49 +32005,40 @@ "x-access": { "any": "true" } - }, - "get": { + } + }, + "/tasks": { + "post": { "tags": [ - "Task Files" + "Tasks" ], - "summary": "Returns the file with the specified id of the task with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByTaskNameAndTaskIdAndFileId", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Creates a new project or private task.", + "description": "The user mast either have `project-planning-data:write` permissions, be assigned to the parent task (if a parent task is specified) or create a private task.", + "operationId": "PostTask", + "requestBody": { + "description": "The general Task Post form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GeneralTaskPostForm" + } } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TaskModel" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -32737,8 +32047,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -32761,58 +32071,47 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/tasks/assignuserbyemail": { + "post": { "tags": [ - "TaskFiles" - ], - "summary": "Updates the metadata of the task file with the specified id.", - "description": "Updates the metadata of the task file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateTaskFile", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Tasks" ], + "summary": "Invites a user by email and assigns them to a task.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTasksAssignUserByEmail", "requestBody": { - "description": "The model to update the file with the specified id.", + "description": "The assign By Email form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" + "$ref": "#/components/schemas/AssignByEmailForm" } } - } + }, + "required": true }, "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -32833,58 +32132,63 @@ } } }, - "/tasks/{taskId}/files/{fileId}/changeentity": { + "/tasks/batch/{operation}": { "post": { "tags": [ - "TaskFiles" + "Tasks" ], - "summary": "Changes the task this file belongs to.", - "description": "Changes the task this file belongs to.\nSwitch to the specified task or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeTask", + "summary": "Edits multiple tasks using the specified operation.", + "description": "Returns MultiStatus including the list of successful and failed tasks.\r\n \r\n Supported Operations:\r\n
    >\r\n
  • movetoproject: Moves all tasks to a new project.
  • movetotasklist: Moves all tasks to a new task list inside the same project.
  • moveundertask: Moves every selected task (and their subtasks) under the specified parent task, validating project boundaries.
  • setdates: Sets the due and optionally start date for all tasks.
  • adjustdates: Offsets start and due dates by the specified number of days while respecting the user's timezone.
  • addtags: Adds a list of tags to all tasks in the list that don't already have the tag.
  • delete: Deletes all tasks. Optional including time trackings.
  • changetypeofwork: Changes the type of work for a list of tasks. Optionally also for the related timetrackings.
  • assignusers: Assigns a list of users to a list of tasks.
  • unassignusers: Unassigns a list of users from a list of tasks. If the UserIds are not provided, all users are unassigned.
  • setprio: Sets the prio flag for a list of tasks.
  • changetaskstatus: Sets the task status for a list of tasks.
  • copy: Creates copies of all specified tasks (including subtasks) and reorders them to maintain hierarchy.
  • plannerbatch: Multiple operations to a single task. Used in the planner.
The user must have `write` permissions on all tasks as well as related entities modified by the operation.", + "operationId": "PostTasksBatchByOperation", "parameters": [ { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "operation", "in": "path", - "description": "The id of the file.", + "description": "The operation to perform on all tasks.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The model describing the batch task operation.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" + "$ref": "#/components/schemas/BatchOperationForm" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "207": { + "description": "Multi-Status", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/MultiStatusResult" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -32905,58 +32209,38 @@ } } }, - "/tasks/{taskId}/files/{fileId}/copy": { + "/tasks/changebasetypes": { "post": { "tags": [ - "TaskFiles" - ], - "summary": "Copies the file to a new task.", - "description": "Copies the file to a new task (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToTask", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Tasks" ], + "summary": "Changes the base type for multiple tasks.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTasksChangeBaseTypes", "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The tasks Change Base Types form payload.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" + "$ref": "#/components/schemas/TasksChangeBaseTypesForm" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "207": { + "description": "Multi-Status" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -32977,70 +32261,48 @@ } } }, - "/tasks/{taskId}/files/{fileId}/download": { - "get": { + "/tasks/changelists": { + "post": { "tags": [ - "TaskFiles" + "Tasks" ], - "summary": "Returns the content of the task file with the specified id.", - "description": "Returns the content of the task file. Uses the latest file version.\nIf the task file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskFileContent", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" + "summary": "Changes the lists of tasks.", + "description": "Adds tasks to lists, removes them and reorders tasks within lists.\r\n\r\nAny authenticated user.", + "operationId": "PostTasksChangeLists", + "requestBody": { + "description": "The change Task List forms.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeTaskListsForm" + } + } } }, - { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", - "schema": { - "type": "boolean" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeTaskListsForm" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -33061,53 +32323,41 @@ } } }, - "/tasks/{taskId}/files/{fileId}/pdf": { - "get": { + "/tasks/changestatuses": { + "post": { "tags": [ - "TaskFiles" + "Tasks" ], - "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the task file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskFileContent", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Changes statuses of tasks.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTasksChangeStatuses", + "requestBody": { + "description": "The change Status form list.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeStatusForm" + } + } } }, - { - "name": "inline", - "in": "query", - "description": "If inline is false, content-disposition header is attachment.", - "schema": { - "type": "boolean", - "default": false - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "207": { + "description": "Multi-Status" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -33128,43 +32378,38 @@ } } }, - "/tasks/{taskId}/files/{fileId}/shareurl": { - "get": { + "/tasks/changesubtasks": { + "post": { "tags": [ - "TaskFiles" + "Tasks" ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Changes the parent task and the order of subtasks.", + "description": "Changes parent task and order of subtasks. If the parent task of a subtask changed, its lists, base type and entity\r\n will change to match the parent ones.\r\n It is not possible to change a task to subtask if the task already has subtasks.\r\n\r\nAny authenticated user.", + "operationId": "PostTasksChangeSubtasks", + "requestBody": { + "description": "The subtask Changes model.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeSubtasksPostForm" + } + } } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -33185,58 +32430,38 @@ } } }, - "/tasks/{taskId}/files/{fileId}/versions": { - "get": { + "/tasks/changesubtaskstoparent": { + "post": { "tags": [ - "TaskFiles" + "Tasks" ], - "summary": "Returns all file versions of the specified task file.", - "description": "Returns all file versions of the specified task file.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskFileVersions", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Convert subtasks to a parent task.", + "description": "Convert subtasks to a parent task. If list ids are not provided it will keep the same lists as the old parent task,\r\n placing the task as last item in the lists.\r\n If multiple list ids are provided per task, the lists will be overwritten with the lists provided. In this case, if an\r\n order is not provided, it will be put as the last item in the list.\r\n\r\nAny authenticated user.", + "operationId": "PostTasksChangeSubtasksToParent", + "requestBody": { + "description": "The change Subtasks To Parent Post form list.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeSubtasksToParentPostForm" + } + } } }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileVersion" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -33255,72 +32480,43 @@ "x-access": { "any": "true" } - }, + } + }, + "/tasks/changetypeofwork": { "post": { "tags": [ - "TaskFiles" - ], - "summary": "Uploads a new version of the task file with the specified id.", - "description": "Uploads a new version of an task file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateTaskFileVersion", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Tasks" ], + "summary": "Changes the type of work for a batch of tasks.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTasksChangeTypeOfWork", "requestBody": { + "description": "The tasks Change Types form payload.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/TasksChangeTypesForm" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "207": { + "description": "Multi-Status" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/ErrorResponse" } } } - }, - "400": { - "description": "Bad Request" } }, "security": [ @@ -33338,69 +32534,34 @@ } } }, - "/tasks/{taskId}/files/{fileId}/versions/{versionId}": { - "get": { + "/tasks/delete": { + "post": { "tags": [ - "Task Files" + "Tasks" ], - "summary": "Returns the task file version with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByTaskNameAndTaskIdAndFileIdAndVersionId", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Deletes tasks and optionally related time entries.", + "description": "Returns 207 MultiStatus when individual deletions fail.\r\n\r\nAny authenticated user.", + "operationId": "PostTasksDelete", + "requestBody": { + "description": "The model describing the task deletion request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TasksDeleteForm" + } } }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } + "204": { + "description": "No Content" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "207": { + "description": "Multi-Status" }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -33425,54 +32586,45 @@ } } }, - "/tasks/{taskId}/files/{fileId}/versions/{versionId}/download": { - "get": { + "/tasks/deletetags": { + "post": { "tags": [ - "TaskFiles" + "TaskTags" ], - "summary": "Returns the content of the task file version with the specified id.", - "description": "Returns the content of the task file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskFileVersionContent", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Removes a tag from all project tasks.", + "description": "Removes a tag from all project tasks.\r\n\r\nThe user must be an admin or have `project-planning-data:write` permissions.", + "operationId": "PostTasksDeleteTags", + "requestBody": { + "description": "The model to delete the tag from all tasks.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTagForm" + } } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "required": true + }, + "responses": { + "204": { + "description": "No Content" }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -33489,27 +32641,27 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-planning-data": "write" } } }, - "/tasks/{taskId}/recurrency": { + "/tasks/key/{taskIdentifier}": { "get": { "tags": [ "Tasks" ], - "summary": "Gets the recurrence rule of a task.", + "summary": "Returns the task with the specified key.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskRecurrencyByTaskId", + "operationId": "GetTasksKeyByTaskIdentifier", "parameters": [ { - "name": "taskId", + "name": "taskIdentifier", "in": "path", - "description": "The id of the task.", + "description": "The task identifier to lookup (for example, KEY-123).", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -33519,7 +32671,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RecurrencyModel" + "$ref": "#/components/schemas/TaskModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -33560,36 +32722,20 @@ } } }, - "/tasks/{taskId}/setassignees": { + "/tasks/settaskpriority": { "post": { "tags": [ "Tasks" ], - "summary": "Assigns a list of users to a task.", - "description": "Replaces existing assignments with the provided list.\r\n\r\nAny authenticated user.", - "operationId": "PostTaskSetAssigneesByTaskId", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "summary": "Sets the priority flag for a task.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTasksSetTaskPriority", "requestBody": { - "description": "The id of the users.", + "description": "The task Set Prio form payload.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/schemas/TaskSetPrioForm" } } }, @@ -33609,8 +32755,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -33618,9 +32764,47 @@ } } } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/tasks/tags": { + "get": { + "tags": [ + "TaskTags" + ], + "summary": "Returns all task tags that are currently in use by tasks.", + "description": "Returns all task tags that are currently in use by tasks ordered by count.\r\n\r\nAny authenticated user.", + "operationId": "GetTasksTags", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } + } + } + } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -33645,35 +32829,20 @@ } } }, - "/tasks/{taskId}/setcustomfields": { + "/tasks/updatetags": { "post": { "tags": [ - "CustomFields" - ], - "summary": "Sets the custom fields for a task.", - "description": "The required properties depend on the type of the custom field.\r\n \r\n The user must have at least `write` permissions on the specified task.", - "operationId": "PostTaskSetCustomFieldsByTaskId", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task to set custom fields for.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TaskTags" ], + "summary": "Updates a tag globally for all project tasks.", + "description": "Updates a tag for all project tasks.\r\n\r\nThe user must be an admin or have `project-planning-data:write` permissions.", + "operationId": "PostTasksUpdateTags", "requestBody": { - "description": "The model containing the details for setting the custom fields for a task.", + "description": "The model to update the tag including the old and new tag names.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldPostForm" - } + "$ref": "#/components/schemas/TagUpdateForm" } } }, @@ -33683,6 +32852,9 @@ "204": { "description": "No Content" }, + "207": { + "description": "Multi-Status" + }, "400": { "description": "Bad Request", "content": { @@ -33692,26 +32864,6 @@ } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -33725,18 +32877,19 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-planning-data": "write" } } }, - "/tasks/{taskId}/setplannedefforts": { - "post": { + "/tasks/{taskId}": { + "get": { "tags": [ "Tasks" ], - "summary": "Modifies planned efforts for the given task assignments.", - "description": "Only the provided assignments are updated; missing assignments remain unchanged.\r\n\r\nAny authenticated user.", - "operationId": "PostTaskSetPlannedEffortsByTaskId", + "summary": "Returns the task with the specified id.", + "description": "The required permissions depend on the base type of the task.\r\n If the task is a project task, 'read' permissions on the 'project-planning-data' feature are required.\r\n For a user's private task, no special permissions are required.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskById", "parameters": [ { "name": "taskId", @@ -33749,30 +32902,13 @@ } } ], - "requestBody": { - "description": "The planned Efforts.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PlannedEffortForm" - } - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskModel" } } } @@ -33811,16 +32947,14 @@ "x-access": { "any": "true" } - } - }, - "/tasks/{taskId}/setrecurrency": { - "post": { + }, + "put": { "tags": [ "Tasks" ], - "summary": "Adds or updates a recurrence rule for a task.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTaskSetRecurrencyByTaskId", + "summary": "Updates the task with the specified id.", + "description": "To update the task, the user needs to be the assignee of the task or 'ProjectPlanning'\r\n permissions in general or in the project the task is related to.\r\n\r\nAny authenticated user.", + "operationId": "PutTaskById", "parameters": [ { "name": "taskId", @@ -33834,19 +32968,26 @@ } ], "requestBody": { - "description": "The model describing the recurrence rule to apply.", + "description": "The model describing the task updates.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskRecurrencyForm" + "$ref": "#/components/schemas/GeneralTaskForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskModel" + } + } + } }, "400": { "description": "Bad Request", @@ -33894,24 +33035,36 @@ } } }, - "/tasks/{taskId}/tags": { + "/tasks/{taskId}/activities": { "get": { "tags": [ - "TaskTags" + "Task Activities" ], - "summary": "Returns the tags of the task with the specified id.", - "description": "Returns the tags of the task with the specified id ordered by name.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTagsByTaskId", + "summary": "Returns all activities of the task with the specified id.", + "description": "The activities contain information about the type of the activity, which property was changed and by whom.\r\n This contains changes to first-level properties of the task, like name, description, status, etc., as well as several related entities, such as tags, assignments, etc.\r\n This does not include activities of sub-entities, like tasks of a project or comments on a task.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskActivities", "parameters": [ { "name": "taskId", "in": "path", - "description": "The id of the task to get the tags for.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -33922,14 +33075,14 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/ActivityModel" } } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -33937,53 +33090,13 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/tasks/{taskId}/taskdependencies": { - "get": { - "tags": [ - "TaskDependencies" - ], - "summary": "Returns all task dependencies for a specific task.", - "description": "To get all dependencies of a task, the user needs project planning permissions on that project or be assigned to that task.", - "operationId": "GetTaskTaskdependenciesByTaskId", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskDependency" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -34014,81 +33127,19 @@ } } }, - "/tasks/{taskId}/timeentries": { - "get": { - "tags": [ - "TimeEntries" - ], - "summary": "Returns all time entries of the specified task.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTimeEntries", - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TimeTracking" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/tasks/{taskId}/updateorder": { + "/tasks/{taskId}/addtags": { "post": { "tags": [ - "Tasks" + "TaskTags" ], - "summary": "Updates the order of a task within its list.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTaskUpdateOrderByTaskId", + "summary": "Adds a batch of tags to the task with the specified id.", + "description": "The request fails if one of the tags is invalid (e.g. empty or duplicate).\r\n To add tags to a task the user must have `write` permissions on the specified task.", + "operationId": "PostTaskAddTagsByTaskId", "parameters": [ { "name": "taskId", "in": "path", - "description": "The id of the task.", + "description": "The id of the task to add the tags to.", "required": true, "schema": { "type": "string", @@ -34097,11 +33148,14 @@ } ], "requestBody": { - "description": "The update Order form payload.", + "description": "The model with the tags to be added.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateOrderForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/TagForm" + } } } }, @@ -34115,7 +33169,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ReorderingResult" + "$ref": "#/components/schemas/BaseTagModel" } } } @@ -34140,16 +33194,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -34167,14 +33211,26 @@ } } }, - "/taskschedules": { + "/tasks/{taskId}/checklistitems": { "get": { "tags": [ - "TaskSchedules" + "ChecklistItems" + ], + "summary": "Returns the checklist items for the task with the specified id.", + "description": "The user must have at least `read` permissions on the specified task.", + "operationId": "GetTaskChecklistItemsByTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Returns a list of task schedules.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskSchedules", "responses": { "200": { "description": "OK", @@ -34183,7 +33239,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskSchedule" + "$ref": "#/components/schemas/ChecklistItem" } } } @@ -34198,6 +33254,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -34216,17 +33282,29 @@ }, "post": { "tags": [ - "TaskSchedules" + "ChecklistItems" + ], + "summary": "Creates a checklist item for a task with the specified id.", + "description": "The required permissions depend on the base type of the task. If the task is a project task, the user must have either `project-master-data:write` permissions or be assigned to the task. For a user's private task, no special permissions are required.", + "operationId": "PostTaskChecklistItemsByTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Creates a new task schedule for a given task and a given user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTaskSchedule", "requestBody": { - "description": "The model to create the task schedule.", + "description": "The checklist item form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskScheduleForm" + "$ref": "#/components/schemas/ChecklistItemForm" } } }, @@ -34238,17 +33316,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskSchedule" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ChecklistItem" } } } @@ -34289,14 +33357,14 @@ } } }, - "/taskschedules/bytaskid/{taskId}": { + "/tasks/{taskId}/checklistitems/tosubtasks": { "post": { "tags": [ - "TaskSchedules" + "ChecklistItems" ], - "summary": "Creates task schedules from a task by id.", - "description": "Creates task schedules from a task by id. The task must have start and due date and at least one assignee.\r\n If more than one user is assigned to the task, then the user needs to opt in to create task schedules for all assignees\r\n by setting the\r\n 'createSchedulesForAllAssignees' query param to true. This requires admin or feature permissions.\r\n\r\nAny authenticated user.", - "operationId": "PostTaskSchedulesByTaskIdByTaskId", + "summary": "Converts all checklist items of the specified task to subtasks.", + "description": "The user must have at least `write` permissions on the specified task.", + "operationId": "PostTaskChecklistItemsToSubtasksByTaskId", "parameters": [ { "name": "taskId", @@ -34307,20 +33375,21 @@ "type": "string", "format": "uuid" } - }, - { - "name": "createSchedulesForAllAssignees", - "in": "query", - "description": "Whether to create schedules for all assignees.", - "schema": { - "type": "boolean", - "default": false - } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskModel" + } + } + } + } }, "400": { "description": "Bad Request", @@ -34368,19 +33437,29 @@ } } }, - "/taskschedules/{taskScheduleId}": { + "/tasks/{taskId}/checklistitems/{checklistItemId}": { "delete": { "tags": [ - "TaskSchedules" + "ChecklistItems" ], - "summary": "Deletes a task schedule by id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "DeleteTaskScheduleById", + "summary": "Deletes a checklist item from a task.", + "description": "The user must have at least `write` permissions on the specified task.", + "operationId": "DeleteTaskChecklistItemByTaskIdAndChecklistItemId", "parameters": [ { - "name": "taskScheduleId", + "name": "taskId", "in": "path", - "description": "The id of the task schedule.", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item to delete.", "required": true, "schema": { "type": "string", @@ -34401,6 +33480,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -34419,16 +33508,26 @@ }, "get": { "tags": [ - "TaskSchedules" + "ChecklistItems" ], - "summary": "Returns a task schedule by id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTaskScheduleById", + "summary": "Returns the checklist item with the specified id for a task.", + "description": "The user must have at least `read` permissions on the specified task.", + "operationId": "GetTaskChecklistItemByTaskIdAndChecklistItemId", "parameters": [ { - "name": "taskScheduleId", + "name": "taskId", "in": "path", - "description": "The id of the task schedule.", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item.", "required": true, "schema": { "type": "string", @@ -34442,7 +33541,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskSchedule" + "$ref": "#/components/schemas/ChecklistItem" } } } @@ -34484,16 +33583,26 @@ }, "put": { "tags": [ - "TaskSchedules" + "ChecklistItems" ], - "summary": "Updates a given task schedule.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutTaskScheduleById", + "summary": "Updates a checklist item for a task with the specified id.", + "description": "The required permissions depend on the base type of the task. If the task is a project task, the user must have either `project-master-data:write` permissions or be assigned to the task. For a user's private task, no special permissions are required.", + "operationId": "PutTaskChecklistItemByTaskIdAndChecklistItemId", "parameters": [ { - "name": "taskScheduleId", + "name": "taskId", "in": "path", - "description": "The id of the task schedule.", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item.", "required": true, "schema": { "type": "string", @@ -34502,11 +33611,11 @@ } ], "requestBody": { - "description": "The model to update the task schedule.", + "description": "The checklist item form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskSchedulePutForm" + "$ref": "#/components/schemas/ChecklistItemForm" } } }, @@ -34518,13 +33627,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskSchedule" + "$ref": "#/components/schemas/ChecklistItem" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -34533,8 +33642,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -34559,39 +33668,30 @@ } } }, - "/tasktemplates/deletetags": { - "post": { + "/tasks/{taskId}/comments": { + "delete": { "tags": [ - "TaskTemplateTags" + "TaskComments" ], - "summary": "Removes a tag from all task templates.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostDeleteTagForAllTaskTemplates", - "requestBody": { - "description": "The model to remove the tag from all task templates.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteTagForm" - } + "summary": "Deletes all comments of the specified task.", + "description": "Deletes all comments of the specified task.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCommentsByTaskNameAndTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "401": { "description": "Unauthorized", "content": { @@ -34614,19 +33714,40 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } - } - }, - "/tasktemplates/tags": { + }, "get": { "tags": [ - "TaskTemplateTags" + "TaskComments" + ], + "summary": "Returns all comments of the task with the specified id.", + "description": "Returns all comments of the task with the specified id. The user needs read permissions on the task.\r\n\r\nAny authenticated user.", + "operationId": "GetCommentsByTaskNameAndTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } ], - "summary": "Returns all tags that are currently in use by task templates.", - "description": "Returns all tags that are currently in use by task templates ordered by count.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateTags", "responses": { "200": { "description": "OK", @@ -34635,11 +33756,31 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/Comment" } } } } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -34655,30 +33796,47 @@ "x-access": { "any": "true" } - } - }, - "/tasktemplates/updatetags": { + }, "post": { "tags": [ - "TaskTemplateTags" + "TaskComments" + ], + "summary": "Creates a new comment on the task with the specified id.", + "description": "Creates a new comment on the task with the specified id.\r\n A user can only create a comment for him/herself, except for admins and api users.\r\n \r\n To create a comment the user must have at least `read` permissions on the specified task.", + "operationId": "PostCommentsByTaskNameAndTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task to create the comment for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Updates a tag globally for all task templates.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskTemplatesUpdateTags", "requestBody": { - "description": "The model containing the tag updates.", + "description": "The model to create the comment.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TagUpdateForm" + "$ref": "#/components/schemas/CommentForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } }, "400": { "description": "Bad Request", @@ -34699,6 +33857,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -34712,24 +33880,33 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/tasktemplates/{taskTemplateId}": { - "get": { + "/tasks/{taskId}/comments/{commentId}": { + "delete": { "tags": [ - "TaskTemplates" + "TaskComments" ], - "summary": "Returns the task template with the specified id.", - "description": "Returns the task template with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateById", + "summary": "Deletes the comment with the specified id on the task with the specified id.", + "description": "Deletes the comment with the specified id on the task with the specified id.\r\n The delete includes the reactions of the comment.\r\n If there are any replies to the comment, they will be deleted as well.\r\n\r\nAny authenticated user.", + "operationId": "DeleteCommentByTaskNameAndTaskIdAndCommentId", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -34738,12 +33915,15 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskTemplate" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -34772,21 +33952,29 @@ "x-access": { "any": "true" } - } - }, - "/tasktemplates/{taskTemplateId}/addtags": { - "post": { + }, + "get": { "tags": [ - "TaskTemplateTags" + "TaskComments" ], - "summary": "Adds a batch of tags to the task template with the specified id.", - "description": "The request fails if one of the tags is invalid (e.g. empty or duplicate).\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostCreateTaskTemplateTag", + "summary": "Returns the comment with the specified id of the task with the specified id.", + "description": "Returns the comment with the specified id of the task with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetCommentByTaskNameAndTaskIdAndCommentId", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template to add tags to.", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "commentId", + "in": "path", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -34794,40 +33982,13 @@ } } ], - "requestBody": { - "description": "The model with the tags to be added.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagForm" - } - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/Comment" } } } @@ -34854,83 +34015,31 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } - } - }, - "/tasktemplates/{taskTemplateId}/checklistitemtemplates": { - "get": { + }, + "put": { "tags": [ - "TaskBundles" + "TaskComments" ], - "summary": "Lists checklist item templates for a task template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", - "operationId": "GetTaskTemplateChecklistItemTemplatesByTaskTemplateId", + "summary": "Updates the comment with the specified id on the task with the specified id.", + "description": "To update a comment the user must either have at least `read` permissions on the specified task, be the creator of the comment or be admin.", + "operationId": "PutCommentByTaskNameAndTaskIdAndCommentId", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChecklistItemTemplate" - } - } - } - } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "task-manage-config": "read" - } - }, - "post": { - "tags": [ - "TaskBundles" - ], - "summary": "Creates a checklist item template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskTemplateChecklistItemTemplatesByTaskTemplateId", - "parameters": [ { - "name": "taskTemplateId", + "name": "commentId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -34939,11 +34048,11 @@ } ], "requestBody": { - "description": "The checklist Item Template form.", + "description": "The model with the updated comment information.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItemTemplateForm" + "$ref": "#/components/schemas/CommentPutForm" } } }, @@ -34955,13 +34064,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItemTemplate" + "$ref": "#/components/schemas/Comment" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -34992,24 +34101,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/tasktemplates/{taskTemplateId}/checklistitemtemplates/{checklistItemTemplateId}": { - "delete": { + "/tasks/{taskId}/comments/{commentId}/react": { + "post": { "tags": [ - "TaskBundles" + "TaskComments" ], - "summary": "Deletes a checklist item template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "DeleteTaskTemplateChecklistItemTemplateByTaskTemplateIdAndChecklistItemTemplateId", + "summary": "Updates the reactions of the comment with the specified id on the task with the specified id.", + "description": "To update a reaction of a comment the user must have at least `read` permissions on the specified task.", + "operationId": "PostCommentReactByTaskNameAndTaskIdAndCommentId", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -35017,9 +34125,9 @@ } }, { - "name": "checklistItemTemplateId", + "name": "commentId", "in": "path", - "description": "The checklist Item Template Id.", + "description": "The id of the comment.", "required": true, "schema": { "type": "string", @@ -35027,12 +34135,23 @@ } } ], + "requestBody": { + "description": "The model used to update the reactions of the comment with the specified id.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReactionForm" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -35040,62 +34159,6 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "task-manage-config": "write" - } - }, - "get": { - "tags": [ - "TaskBundles" - ], - "summary": "Gets a checklist item template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", - "operationId": "GetTaskTemplateChecklistItemTemplateByTaskTemplateIdAndChecklistItemTemplateId", - "parameters": [ - { - "name": "taskTemplateId", - "in": "path", - "description": "The id of the task template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "checklistItemTemplateId", - "in": "path", - "description": "The checklist item template id.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChecklistItemTemplate" - } - } - } }, "404": { "description": "Not Found", @@ -35119,32 +34182,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "read" + "any": "true" } - }, - "put": { + } + }, + "/tasks/{taskId}/copy": { + "post": { "tags": [ - "TaskBundles" + "Tasks" ], - "summary": "Updates a checklist item template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PutTaskTemplateChecklistItemTemplateByTaskTemplateIdAndChecklistItemTemplateId", + "summary": "Creates a copy of the specified task.", + "description": "Comments, files and activity logs are not copied.\r\n To copy a task, the user needs to be the assignee of the task or 'ProjectPlanning'\r\n permissions in general or in the project the task is related to.\r\n If the task is a parent task, it will also copy its subtasks.\r\n\r\nAny authenticated user.", + "operationId": "PostTaskCopyByTaskId", "parameters": [ { - "name": "taskTemplateId", - "in": "path", - "description": "The id of the task template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "checklistItemTemplateId", + "name": "taskId", "in": "path", - "description": "The checklist Item Template Id.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -35152,30 +34206,19 @@ } } ], - "requestBody": { - "description": "The checklist Item Template form.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChecklistItemTemplateForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItemTemplate" + "$ref": "#/components/schemas/TaskModel" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -35206,24 +34249,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/tasktemplates/{taskTemplateId}/deleterecurrency": { + "/tasks/{taskId}/deleterecurrency": { "post": { "tags": [ - "TaskBundles" + "Tasks" ], - "summary": "Deletes recurrence information from a task template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskTemplateDeleteRecurrencyByTaskTemplateId", + "summary": "Deletes the recurrence rule for a task.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTaskDeleteRecurrencyByTaskId", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -35244,6 +34286,16 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -35257,24 +34309,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/tasktemplates/{taskTemplateId}/deletetags": { + "/tasks/{taskId}/deletetags": { "post": { "tags": [ - "TaskTemplateTags" + "TaskTags" ], - "summary": "Removes tags from the task template with the specified id.", - "description": "Returns 204 NoContent if all tags have been removed successfully.\r\n Returns 207 MultiStatus if at least one tag could not be removed, including the reasons.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostDeleteTaskTemplatesTags", + "summary": "Removes tags from the task with the specified id.", + "description": "Returns 204 NoContent if all tags have been removed successfully.\r\n Returns 207 MultiStatus if at least one tag could not be removed, including the reasons.\r\n \r\n To remove tags from a task the user must have `write` permissions on the specified task.", + "operationId": "PostTaskDeleteTagsByTaskId", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template to remove tags from.", + "description": "The id of the task to remove the tags from.", "required": true, "schema": { "type": "string", @@ -35283,7 +34334,7 @@ } ], "requestBody": { - "description": "The list of tags to remove from the task template.", + "description": "The model with the tags to be removed.", "content": { "application/json": { "schema": { @@ -35335,24 +34386,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/tasktemplates/{taskTemplateId}/recurrency": { - "get": { + "/tasks/{taskId}/externalfiles": { + "post": { "tags": [ - "TaskBundles" + "TaskFiles" ], - "summary": "Gets recurrency details for a task template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", - "operationId": "GetTaskTemplateRecurrencyByTaskTemplateId", + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -35360,23 +34410,34 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskRecurrencyForm" + "requestBody": { + "description": "List of file forms.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" } } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -35393,24 +34454,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "read" + "any": "true" } } }, - "/tasktemplates/{taskTemplateId}/setcustomfields": { - "post": { + "/tasks/{taskId}/files": { + "delete": { "tags": [ - "CustomFields" + "TaskFiles" ], - "summary": "Sets the custom fields for the specified task template.", - "description": "The required properties depend on the type of the custom field. Only task templates which are linked to a project template may have custom fields set.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostTaskTemplateSetCustomFieldsByTaskTemplateId", + "summary": "Deletes the files of the specified task.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteTaskFiles", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template to set custom fields for.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -35418,43 +34478,9 @@ } } ], - "requestBody": { - "description": "The model containing the details for setting the custom fields for a task template.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CustomFieldPostForm" - } - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -35468,52 +34494,50 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - } - }, - "/tasktemplates/{taskTemplateId}/setrecurrency": { - "post": { + }, + "get": { "tags": [ - "TaskBundles" + "TaskFiles" ], - "summary": "Adds or updates a recurrence rule for a task template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTaskTemplateSetRecurrencyByTaskTemplateId", + "summary": "Returns all files of the task with the specified id.", + "description": "Returns all file metadata of the task with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskFiles", "parameters": [ { - "name": "taskTemplateId", + "name": "taskId", "in": "path", - "description": "The id of the task template.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model describing the recurrence rule to apply.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskBundleRecurrencyForm" - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } } } } @@ -35530,311 +34554,21 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" - } - } - }, - "/tasktemplates/{taskTemplateId}/tags": { - "get": { - "tags": [ - "TaskTemplateTags" - ], - "summary": "Returns the tags of the task template with the specified id.", - "description": "Returns the tags of the task template with the specified id ordered by name.\r\n\r\nAny authenticated user.", - "operationId": "GetTagsByTaskTemplateId", - "parameters": [ - { - "name": "taskTemplateId", - "in": "path", - "description": "The id of the task template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/tasktemplates/{taskTemplateId}/taskdependencytemplates": { - "get": { - "tags": [ - "TaskDependencyTemplates" - ], - "summary": "Returns the task dependency templates for a given task template.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", - "operationId": "GetTaskTemplateTaskDependencyTemplatesByTaskTemplateId", - "parameters": [ - { - "name": "taskTemplateId", - "in": "path", - "description": "The id of the task template.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskDependencyTemplate" - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "task-manage-config": "read" - } - } - }, - "/tasktemplates/{tasktemplateId}/externalfiles": { - "post": { - "tags": [ - "TaskTemplateFiles" - ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", - "parameters": [ - { - "name": "tasktemplateId", - "in": "path", - "description": "The id of the tasktemplate.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "List of file forms.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileInfo" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/tasktemplates/{tasktemplateId}/files": { - "delete": { - "tags": [ - "TaskTemplateFiles" - ], - "summary": "Deletes the files of the specified tasktemplate.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteTaskTemplateFiles", - "parameters": [ - { - "name": "tasktemplateId", - "in": "path", - "description": "The id of the tasktemplate.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "get": { - "tags": [ - "TaskTemplateFiles" - ], - "summary": "Returns all files of the tasktemplate with the specified id.", - "description": "Returns all file metadata of the tasktemplate with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateFiles", - "parameters": [ - { - "name": "tasktemplateId", - "in": "path", - "description": "The id of the tasktemplate.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileInfo" - } - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" + "any": "true" } }, "post": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Creates a new tasktemplate file for the tasktemplate with the specified id..", - "description": "Uploads a new tasktemplate file for the tasktemplate with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateTaskTemplateFile", + "summary": "Creates a new task file for the task with the specified id..", + "description": "Uploads a new task file for the task with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateTaskFile", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -35895,19 +34629,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/byuploadid": { + "/tasks/{taskId}/files/byuploadid": { "post": { "tags": [ "FileUpload" ], "summary": "Creates a file from an upload id.", - "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file tasktemplate from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", + "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file task from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", "operationId": "PostUploadByUploadId", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate to attach the file to.", + "description": "The id of the task to attach the file to.", "required": true, "schema": { "type": "string", @@ -35963,19 +34697,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/byurl": { + "/tasks/{taskId}/files/byurl": { "post": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], "summary": "Uploads a new file by providing an url.", "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateTaskTemplateFileByUrl", + "operationId": "CreateTaskFileByUrl", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate the file is linked to.", + "description": "The id of the task the file is linked to.", "required": true, "schema": { "type": "string", @@ -36025,19 +34759,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}": { + "/tasks/{taskId}/files/{fileId}": { "delete": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Deletes the tasktemplate file with the specified id.", + "summary": "Deletes the task file with the specified id.", "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteTaskTemplateFile", + "operationId": "DeleteTaskFile", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36076,16 +34810,16 @@ }, "get": { "tags": [ - "TaskTemplate Files" + "Task Files" ], - "summary": "Returns the file with the specified id of the tasktemplate with the specified id.", + "summary": "Returns the file with the specified id of the task with the specified id.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByTaskTemplateNameAndTaskTemplateIdAndFileId", + "operationId": "GetFilesByTaskNameAndTaskIdAndFileId", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36151,16 +34885,16 @@ }, "put": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Updates the metadata of the tasktemplate file with the specified id.", - "description": "Updates the metadata of the tasktemplate file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateTaskTemplateFile", + "summary": "Updates the metadata of the task file with the specified id.", + "description": "Updates the metadata of the task file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateTaskFile", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36220,19 +34954,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/changeentity": { + "/tasks/{taskId}/files/{fileId}/changeentity": { "post": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Changes the tasktemplate this file belongs to.", - "description": "Changes the tasktemplate this file belongs to.\nSwitch to the specified tasktemplate or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeTaskTemplate", + "summary": "Changes the task this file belongs to.", + "description": "Changes the task this file belongs to.\nSwitch to the specified task or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeTask", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36292,19 +35026,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/copy": { + "/tasks/{taskId}/files/{fileId}/copy": { "post": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Copies the file to a new tasktemplate.", - "description": "Copies the file to a new tasktemplate (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToTaskTemplate", + "summary": "Copies the file to a new task.", + "description": "Copies the file to a new task (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToTask", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36364,19 +35098,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/download": { + "/tasks/{taskId}/files/{fileId}/download": { "get": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Returns the content of the tasktemplate file with the specified id.", - "description": "Returns the content of the tasktemplate file. Uses the latest file version.\nIf the tasktemplate file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateFileContent", + "summary": "Returns the content of the task file with the specified id.", + "description": "Returns the content of the task file. Uses the latest file version.\nIf the task file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskFileContent", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36448,19 +35182,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/pdf": { + "/tasks/{taskId}/files/{fileId}/pdf": { "get": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the tasktemplate file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateFileContent", + "description": "Returns the content of the task file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskFileContent", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36515,19 +35249,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/shareurl": { + "/tasks/{taskId}/files/{fileId}/shareurl": { "get": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], "summary": "Returns an url to share the file.", "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", "operationId": "GetPublicToken", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36572,19 +35306,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/versions": { + "/tasks/{taskId}/files/{fileId}/versions": { "get": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Returns all file versions of the specified tasktemplate file.", - "description": "Returns all file versions of the specified tasktemplate file.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateFileVersions", + "summary": "Returns all file versions of the specified task file.", + "description": "Returns all file versions of the specified task file.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskFileVersions", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36645,16 +35379,16 @@ }, "post": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Uploads a new version of the tasktemplate file with the specified id.", - "description": "Uploads a new version of an tasktemplate file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateTaskTemplateFileVersion", + "summary": "Uploads a new version of the task file with the specified id.", + "description": "Uploads a new version of an task file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateTaskFileVersion", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36725,19 +35459,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/versions/{versionId}": { + "/tasks/{taskId}/files/{fileId}/versions/{versionId}": { "get": { "tags": [ - "TaskTemplate Files" + "Task Files" ], - "summary": "Returns the tasktemplate file version with the specified id.", + "summary": "Returns the task file version with the specified id.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByTaskTemplateNameAndTaskTemplateIdAndFileIdAndVersionId", + "operationId": "GetFilesVersionsByTaskNameAndTaskIdAndFileIdAndVersionId", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36812,19 +35546,19 @@ } } }, - "/tasktemplates/{tasktemplateId}/files/{fileId}/versions/{versionId}/download": { + "/tasks/{taskId}/files/{fileId}/versions/{versionId}/download": { "get": { "tags": [ - "TaskTemplateFiles" + "TaskFiles" ], - "summary": "Returns the content of the tasktemplate file version with the specified id.", - "description": "Returns the content of the tasktemplate file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetTaskTemplateFileVersionContent", + "summary": "Returns the content of the task file version with the specified id.", + "description": "Returns the content of the task file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskFileVersionContent", "parameters": [ { - "name": "tasktemplateId", + "name": "taskId", "in": "path", - "description": "The id of the tasktemplate.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -36880,44 +35614,24 @@ } } }, - "/teams": { + "/tasks/{taskId}/recurrency": { "get": { "tags": [ - "Teams" + "Tasks" ], - "summary": "Returns all teams.", - "description": "When team restrictions are applied for the workspace, the user must either be an admin or member of the team to retrieve it.", - "operationId": "GetTeams", + "summary": "Gets the recurrence rule of a task.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTaskRecurrencyByTaskId", "parameters": [ { - "name": "includeUserIds", - "in": "query", - "description": "Whether to include the ids of users that are in the team.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "includeProjectIds", - "in": "query", - "description": "Whether to include the ids of projects that are assigned to the team.", + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -36926,100 +35640,20 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Team" - } + "$ref": "#/components/schemas/RecurrencyModel" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "Teams" - ], - "summary": "Creates a new team.", - "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin.", - "operationId": "PostTeam", - "requestBody": { - "description": "The model used to create the team.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamForm" - } - } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Team" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true" - }, - "x-subscriptionlevel": { - "minimumPlan": "standard" - } - } - }, - "/teams/{teamId}": { - "delete": { - "tags": [ - "Teams" - ], - "summary": "Deletes the team with the specified id.", - "description": "\r\n\r\nThe user must be an admin.", - "operationId": "DeleteTeamById", - "parameters": [ - { - "name": "teamId", - "in": "path", - "description": "The id of the team to delete.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" }, "404": { "description": "Not Found", @@ -37043,53 +35677,55 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } - }, - "get": { + } + }, + "/tasks/{taskId}/setassignees": { + "post": { "tags": [ - "Teams" + "Tasks" ], - "summary": "Returns the team with the specified id.", - "description": "When team restrictions are applied for the workspace, the user must either be an admin or member of the team to retrieve it.", - "operationId": "GetTeamById", + "summary": "Assigns a list of users to a task.", + "description": "Replaces existing assignments with the provided list.\r\n\r\nAny authenticated user.", + "operationId": "PostTaskSetAssigneesByTaskId", "parameters": [ { - "name": "teamId", + "name": "taskId", "in": "path", - "description": "The id of the team.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "includeUserIds", - "in": "query", - "description": "Whether to include the ids of users that are in the team.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "includeProjectIds", - "in": "query", - "description": "Whether to include the ids of projects that are assigned to the team.", - "schema": { - "type": "boolean", - "default": false - } } ], + "requestBody": { + "description": "The id of the users.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Team" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -37128,62 +35764,62 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/tasks/{taskId}/setcustomfields": { + "post": { "tags": [ - "Teams" + "CustomFields" ], - "summary": "Updates the team with the specified id.", - "description": "\r\n\r\nThe user must be an admin.", - "operationId": "PutTeamById", + "summary": "Sets the custom fields for a task.", + "description": "The required properties depend on the type of the custom field.\r\n \r\n The user must have at least `write` permissions on the specified task.", + "operationId": "PostTaskSetCustomFieldsByTaskId", "parameters": [ { - "name": "teamId", + "name": "taskId", "in": "path", - "description": "The id of the team to update.", + "description": "The id of the task to set custom fields for.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "includeUserIds", - "in": "query", - "description": "Whether to include the ids of users that are in the team.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "includeProjectIds", - "in": "query", - "description": "Whether to include the ids of projects that are assigned to the team.", - "schema": { - "type": "boolean", - "default": false - } } ], "requestBody": { - "description": "The model with the team data.", + "description": "The model containing the details for setting the custom fields for a task.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TeamForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldPostForm" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Team" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -37210,23 +35846,23 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/teams/{teamId}/addprojects": { + "/tasks/{taskId}/setplannedefforts": { "post": { "tags": [ - "Teams" + "Tasks" ], - "summary": "Adds projects to the specified team.", - "description": "The user must have `project-master-data:write` permissions or be the owner of the projects.", - "operationId": "PostTeamAddProjectsByTeamId", + "summary": "Modifies planned efforts for the given task assignments.", + "description": "Only the provided assignments are updated; missing assignments remain unchanged.\r\n\r\nAny authenticated user.", + "operationId": "PostTaskSetPlannedEffortsByTaskId", "parameters": [ { - "name": "teamId", + "name": "taskId", "in": "path", - "description": "The id of the team.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -37235,14 +35871,13 @@ } ], "requestBody": { - "description": "The model with the list of project ids to add.", + "description": "The planned Efforts.", "content": { "application/json": { "schema": { "type": "array", "items": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/PlannedEffortForm" } } } @@ -37250,21 +35885,21 @@ "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectInTeam" - } + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37299,19 +35934,19 @@ } } }, - "/teams/{teamId}/addusers": { + "/tasks/{taskId}/setrecurrency": { "post": { "tags": [ - "Teams" + "Tasks" ], - "summary": "Adds users to the specified team.", - "description": "\r\n\r\nThe user must be an admin.", - "operationId": "PostTeamAddUsersByTeamId", + "summary": "Adds or updates a recurrence rule for a task.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTaskSetRecurrencyByTaskId", "parameters": [ { - "name": "teamId", + "name": "taskId", "in": "path", - "description": "The id of the team.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -37320,36 +35955,32 @@ } ], "requestBody": { - "description": "The model with the list of user ids to add.", + "description": "The model describing the recurrence rule to apply.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/schemas/TaskRecurrencyForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UserInTeam" - } + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37380,23 +36011,23 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/teams/{teamId}/removeprojects": { - "post": { + "/tasks/{taskId}/tags": { + "get": { "tags": [ - "Teams" + "TaskTags" ], - "summary": "Removes projects from the specified team.", - "description": "The user must have `project-master-data:write` permissions or be the owner of the projects.", - "operationId": "PostTeamRemoveProjectsByTeamId", + "summary": "Returns the tags of the task with the specified id.", + "description": "Returns the tags of the task with the specified id ordered by name.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTagsByTaskId", "parameters": [ { - "name": "teamId", + "name": "taskId", "in": "path", - "description": "The id of the team.", + "description": "The id of the task to get the tags for.", "required": true, "schema": { "type": "string", @@ -37404,37 +36035,22 @@ } } ], - "requestBody": { - "description": "The model with the list of project ids to remove.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } } } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37459,19 +36075,19 @@ } } }, - "/teams/{teamId}/removeusers": { - "post": { + "/tasks/{taskId}/taskdependencies": { + "get": { "tags": [ - "Teams" + "TaskDependencies" ], - "summary": "Removes users from the specified team.", - "description": "\r\n\r\nThe user must be an admin.", - "operationId": "PostTeamRemoveUsersByTeamId", + "summary": "Returns all task dependencies for a specific task.", + "description": "To get all dependencies of a task, the user needs project planning permissions on that project or be assigned to that task.", + "operationId": "GetTaskTaskdependenciesByTaskId", "parameters": [ { - "name": "teamId", + "name": "taskId", "in": "path", - "description": "The id of the team.", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -37479,31 +36095,16 @@ } } ], - "requestBody": { - "description": "The model with the list of user ids to remove.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } - } - } - }, - "required": true - }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskDependency" + } } } } @@ -37530,19 +36131,29 @@ "v1" ], "x-access": { - "admin": "true" + "any": "true" } } }, - "/temporaryfiles": { + "/tasks/{taskId}/timeentries": { "get": { "tags": [ - "Temporary Files" + "TimeEntries" ], - "summary": "Returns all temporary files of the current user.", + "summary": "Returns all time entries of the specified task.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTemporaryFiles", + "operationId": "GetTaskTimeEntries", "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -37564,7 +36175,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeTracking" } } } @@ -37584,22 +36195,38 @@ "x-access": { "any": "true" } - }, + } + }, + "/tasks/{taskId}/updateorder": { "post": { "tags": [ - "Temporary Files" + "Tasks" ], - "summary": "Creates a new temporary file.", + "summary": "Updates the order of a task within its list.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTemporaryFiles", + "operationId": "PostTaskUpdateOrderByTaskId", + "parameters": [ + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { + "description": "The update Order form payload.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "$ref": "#/components/schemas/FileUploadModel" + "$ref": "#/components/schemas/UpdateOrderForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -37607,7 +36234,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/ReorderingResult" + } } } } @@ -37621,14 +36251,34 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } ], "x-api-versions": [ "v1" @@ -37638,38 +36288,30 @@ } } }, - "/temporaryfiles/{fileId}": { + "/taskschedules": { "get": { "tags": [ - "Temporary Files" + "TaskSchedules" ], - "summary": "Returns the temporary file with the specified id.", + "summary": "Returns a list of task schedules.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTemporaryFilesByFileId", - "parameters": [ - { - "name": "fileId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "operationId": "GetTaskSchedules", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskSchedule" + } } } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37693,29 +36335,19 @@ "any": "true" } }, - "put": { + "post": { "tags": [ - "Temporary Files" + "TaskSchedules" ], - "summary": "Updates the meta information of the temporary file with the specified id.", + "summary": "Creates a new task schedule for a given task and a given user.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutTemporaryFilesByFileId", - "parameters": [ - { - "name": "fileId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "operationId": "PostTaskSchedule", "requestBody": { + "description": "The model to create the task schedule.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" + "$ref": "#/components/schemas/TaskScheduleForm" } } }, @@ -37727,7 +36359,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TaskSchedule" } } } @@ -37742,8 +36374,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37751,45 +36383,6 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/temporaryfiles/{fileId}/download": { - "get": { - "tags": [ - "Temporary Files" - ], - "summary": "Returns the content of the temporary file with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTemporaryFilesDownloadByFileId", - "parameters": [ - { - "name": "fileId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK" }, "404": { "description": "Not Found", @@ -37817,48 +36410,51 @@ } } }, - "/temporaryfiles/{fileId}/setentity": { + "/taskschedules/bytaskid/{taskId}": { "post": { "tags": [ - "Temporary Files" + "TaskSchedules" ], - "summary": "Sets the temporary file to a global or entity file.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTemporaryFilesSetEntityByFileId", + "summary": "Creates task schedules from a task by id.", + "description": "Creates task schedules from a task by id. The task must have start and due date and at least one assignee.\r\n If more than one user is assigned to the task, then the user needs to opt in to create task schedules for all assignees\r\n by setting the\r\n 'createSchedulesForAllAssignees' query param to true. This requires admin or feature permissions.\r\n\r\nAny authenticated user.", + "operationId": "PostTaskSchedulesByTaskIdByTaskId", "parameters": [ { - "name": "fileId", + "name": "taskId", "in": "path", + "description": "The id of the task.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "createSchedulesForAllAssignees", + "in": "query", + "description": "Whether to create schedules for all assignees.", + "schema": { + "type": "boolean", + "default": false + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37893,38 +36489,36 @@ } } }, - "/timebookings": { - "get": { + "/taskschedules/{taskScheduleId}": { + "delete": { "tags": [ - "TimeBookings" + "TaskSchedules" ], - "summary": "Returns a list of time bookings.", + "summary": "Deletes a task schedule by id.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTimeBookings", + "operationId": "DeleteTaskScheduleById", "parameters": [ { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "taskScheduleId", + "in": "path", + "description": "The id of the task schedule.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TimeBooking" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -37944,37 +36538,38 @@ "any": "true" } }, - "post": { + "get": { "tags": [ - "TimeBookings" + "TaskSchedules" ], - "summary": "Creates a new time booking for a given project and user.", + "summary": "Returns a task schedule by id.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTimeBooking", - "requestBody": { - "description": "The model to create the time booking.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeBookingForm" - } + "operationId": "GetTaskScheduleById", + "parameters": [ + { + "name": "taskScheduleId", + "in": "path", + "description": "The id of the task schedule.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeBooking" + "$ref": "#/components/schemas/TaskSchedule" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -37983,8 +36578,8 @@ } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -38007,21 +36602,19 @@ "x-access": { "any": "true" } - } - }, - "/timebookings/{timeBookingId}": { - "delete": { + }, + "put": { "tags": [ - "TimeBookings" + "TaskSchedules" ], - "summary": "Deletes a time booking by id.", + "summary": "Updates a given task schedule.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "DeleteTimeBookingById", + "operationId": "PutTaskScheduleById", "parameters": [ { - "name": "timeBookingId", + "name": "taskScheduleId", "in": "path", - "description": "The id of the time booking to delete.", + "description": "The id of the task schedule.", "required": true, "schema": { "type": "string", @@ -38029,9 +36622,27 @@ } } ], + "requestBody": { + "description": "The model to update the task schedule.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskSchedulePutForm" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskSchedule" + } + } + } }, "400": { "description": "Bad Request", @@ -38067,47 +36678,30 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/tasktemplates/deletetags": { + "post": { "tags": [ - "TimeBookings" - ], - "summary": "Updates a given time booking.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PutTimeBookingById", - "parameters": [ - { - "name": "timeBookingId", - "in": "path", - "description": "The id of the time booking.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TaskTemplateTags" ], + "summary": "Removes a tag from all task templates.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostDeleteTagForAllTaskTemplates", "requestBody": { - "description": "The model to update the time booking.", + "description": "The model to remove the tag from all task templates.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeBookingForm" + "$ref": "#/components/schemas/DeleteTagForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeBooking" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -38141,41 +36735,19 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timeentries": { + "/tasktemplates/tags": { "get": { "tags": [ - "TimeEntries" - ], - "summary": "Returns all time entries.", - "description": "Returns all time entries.\r\n Depending on the time entry, the calling users has to have several permissions to get the time entry.\r\n No permissions are required if the calling user is owner of this time entry (this includes external timetrackings from connected projects).\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions on the 'project-timetracking' feature are necessary (this does NOT include external timetrackings from connected projects).\r\n\r\nAny authenticated user.", - "operationId": "GetTimeEntries", - "parameters": [ - { - "name": "searchReindex", - "in": "query", - "description": "Whether to reindex for search.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } + "TaskTemplateTags" ], + "summary": "Returns all tags that are currently in use by task templates.", + "description": "Returns all tags that are currently in use by task templates ordered by count.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateTags", "responses": { "200": { "description": "OK", @@ -38184,7 +36756,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/BaseTagModel" } } } @@ -38204,35 +36776,30 @@ "x-access": { "any": "true" } - }, + } + }, + "/tasktemplates/updatetags": { "post": { "tags": [ - "TimeEntries" + "TaskTemplateTags" ], - "summary": "Creates a new time entry.", - "description": "Creates a new time entry.\r\n Depending on the time entry, the calling users has to have several permissions to create the time entry.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntry", + "summary": "Updates a tag globally for all task templates.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskTemplatesUpdateTags", "requestBody": { - "description": "The time entry data.", + "description": "The model containing the tag updates.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeEntryPostForm" + "$ref": "#/components/schemas/TagUpdateForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeTracking" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -38266,57 +36833,38 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timeentries/batch/{operation}": { - "post": { + "/tasktemplates/{taskTemplateId}": { + "get": { "tags": [ - "TimeEntries" + "TaskTemplates" ], - "summary": "Edits multiple time entries using the specified operation.", - "description": "The user is only allowed to edit time entries they have permissions for.\r\n Returns MultiStatus. Includes the list of successfully changed, not found, unauthorized, and invalid time entry ids.\r\n Returns BadRequest if the validation of the form fails, f.e. the new type of work cannot be found.\r\n Returns NotFound if the operation route value is not supported.\r\n \r\n Supported Operations:\r\n
    \r\n
  • \r\n delete: Deletes all time entries. Only admins can delete already billed time entries.
  • \r\n
  • \r\n setTypeOfWork: Changes the type of work for a list of time entries.
  • \r\n
  • \r\n setIsBillable: Changes the billability for a list of time entries. Already billed time entries can only be changed to\r\n being unbillable by admins. In this case, the IsBilled flag is also set to false.
  • \r\n
  • \r\n setIsBilled: Changes the billing status for a list of time entries. Only admins can change the billing status back to\r\n unbilled for already billed time entries.
  • \r\n
  • \r\n setProject: Changes the project for a list of time entries. Only admins can change the project for already billed time\r\n entries. Setting the project unsets the previous project and task.
  • \r\n
  • \r\n setTask: Changes the task for a list of time entries. Only admins can change the task for already billed time entries.\r\n Setting the task automatically sets the project if that task is a project task.
  • \r\n
  • \r\n setUser: Changes the user for a list of time entries. Only admins can change the user for already billed time entries.
  • \r\n
\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesBatchByOperation", + "summary": "Returns the task template with the specified id.", + "description": "Returns the task template with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateById", "parameters": [ { - "name": "operation", + "name": "taskTemplateId", "in": "path", - "description": "The batch operation type.", + "description": "The id of the task template.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "description": "The time entry batch operation data.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeEntryBatchOperationForm" - } - } - }, - "required": true - }, "responses": { - "207": { - "description": "Multi-Status", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MultiStatusResult" - } - } - } - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TaskTemplate" } } } @@ -38347,28 +36895,53 @@ } } }, - "/timeentries/delete": { + "/tasktemplates/{taskTemplateId}/addtags": { "post": { "tags": [ - "TimeEntries" + "TaskTemplateTags" + ], + "summary": "Adds a batch of tags to the task template with the specified id.", + "description": "The request fails if one of the tags is invalid (e.g. empty or duplicate).\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostCreateTaskTemplateTag", + "parameters": [ + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template to add tags to.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Deletes the time entry with the specified ids.", - "description": "This endpoint is deprecated, please use the batch endpoint POST /timeentries/batch/delete instead.\r\n \r\n Deletes the time entries with the specified ids.\r\n Depending on the time entry, the calling users has to have several permissions to delete the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n If the time entry is billed, Admin permissions are required.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesDelete", "requestBody": { - "description": "The time entry ids to delete.", + "description": "The model with the tags to be added.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteTimeEntriesForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/TagForm" + } } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } + } + } + } }, "400": { "description": "Bad Request", @@ -38379,9 +36952,18 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, - "deprecated": true, "security": [ { "oauth2": [ @@ -38393,49 +36975,41 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timeentries/setbillable": { - "post": { + "/tasktemplates/{taskTemplateId}/checklistitemtemplates": { + "get": { "tags": [ - "TimeEntries" + "TaskBundles" ], - "summary": "Sets the time entries with the specified ids to billable.", - "description": "Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user must have 'write'\r\n permissions on:\r\n 'project-timetracking' if it is a project task.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesSetBillable", - "requestBody": { - "description": "The time entry ids and billable flag.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetTimeEntryBillableForm" - } + "summary": "Lists checklist item templates for a task template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", + "operationId": "GetTaskTemplateChecklistItemTemplatesByTaskTemplateId", + "parameters": [ + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/ChecklistItemTemplate" + } } } } @@ -38451,7 +37025,6 @@ } } }, - "deprecated": true, "security": [ { "oauth2": [ @@ -38463,45 +37036,53 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "read" } - } - }, - "/timeentries/setbilled": { + }, "post": { "tags": [ - "TimeEntries" + "TaskBundles" + ], + "summary": "Creates a checklist item template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskTemplateChecklistItemTemplatesByTaskTemplateId", + "parameters": [ + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Sets the time entries with the specified ids to billed.", - "description": "Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n If the time entry is billed, the permissions can be ignored because there is no change.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesSetBilled", "requestBody": { - "description": "The time entry ids and billed flag.", + "description": "The checklist Item Template form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetTimeEntryBilledForm" + "$ref": "#/components/schemas/ChecklistItemTemplateForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ChecklistItemTemplate" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -38521,7 +37102,6 @@ } } }, - "deprecated": true, "security": [ { "oauth2": [ @@ -38533,53 +37113,45 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timeentries/settypeofwork": { - "post": { + "/tasktemplates/{taskTemplateId}/checklistitemtemplates/{checklistItemTemplateId}": { + "delete": { "tags": [ - "TimeEntries" + "TaskBundles" ], - "summary": "Sets the type of work of the specified timeentries.", - "description": "Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesSetTypeOfWork", - "requestBody": { - "description": "The time entry ids and type of work.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetTimeEntryTypeOfWork" - } + "summary": "Deletes a checklist item template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "DeleteTaskTemplateChecklistItemTemplateByTaskTemplateIdAndChecklistItemTemplateId", + "parameters": [ + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "checklistItemTemplateId", + "in": "path", + "description": "The checklist Item Template Id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "204": { "description": "No Content" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -38591,7 +37163,6 @@ } } }, - "deprecated": true, "security": [ { "oauth2": [ @@ -38603,49 +37174,46 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } - } - }, - "/timeentries/setunbillable": { - "post": { + }, + "get": { "tags": [ - "TimeEntries" + "TaskBundles" ], - "summary": "Sets the time entries with the specified ids to unbillable.", - "description": "Already billed time entries cannot be set to unbillable -> Badrequest\r\n Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs write\r\n permissions on:\r\n 'project-timetracking' if it is a project task.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesSetUnbillable", - "requestBody": { - "description": "The time entry ids and billable flag.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetTimeEntryBillableForm" - } + "summary": "Gets a checklist item template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", + "operationId": "GetTaskTemplateChecklistItemTemplateByTaskTemplateIdAndChecklistItemTemplateId", + "parameters": [ + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "checklistItemTemplateId", + "in": "path", + "description": "The checklist item template id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "401": { - "description": "Unauthorized", + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/ChecklistItemTemplate" } } } @@ -38661,7 +37229,6 @@ } } }, - "deprecated": true, "security": [ { "oauth2": [ @@ -38673,32 +37240,60 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "read" } - } - }, - "/timeentries/setunbilled": { - "post": { + }, + "put": { "tags": [ - "TimeEntries" + "TaskBundles" + ], + "summary": "Updates a checklist item template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PutTaskTemplateChecklistItemTemplateByTaskTemplateIdAndChecklistItemTemplateId", + "parameters": [ + { + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemTemplateId", + "in": "path", + "description": "The checklist Item Template Id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Sets the time entries with the specified ids to unbilled.", - "description": "For setting already billed time entries to unbilled, the user needs to have admin permissions.\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntriesSetUnBilled", "requestBody": { - "description": "The time entry ids and billed flag.", + "description": "The checklist Item Template form.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetTimeEntryBilledForm" + "$ref": "#/components/schemas/ChecklistItemTemplateForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChecklistItemTemplate" + } + } + } }, "400": { "description": "Bad Request", @@ -38709,9 +37304,18 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, - "deprecated": true, "security": [ { "oauth2": [ @@ -38723,50 +37327,41 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timeentries/simplified": { - "get": { + "/tasktemplates/{taskTemplateId}/deleterecurrency": { + "post": { "tags": [ - "TimeEntries" + "TaskBundles" ], - "summary": "Retrieves all time entries with a simplified model based on the grouping parameter.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTimeEntriesSimplified", + "summary": "Deletes recurrence information from a task template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskTemplateDeleteRecurrencyByTaskTemplateId", "parameters": [ { - "name": "grouping", - "in": "query", - "description": "The grouping type.", + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SimplifiedTimeTracking" - } + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -38783,23 +37378,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timeentries/{timeEntryId}": { - "delete": { + "/tasktemplates/{taskTemplateId}/deletetags": { + "post": { "tags": [ - "TimeEntries" + "TaskTemplateTags" ], - "summary": "Deletes the time entry with the specified id.", - "description": "Deletes the time entry with the specified id.\r\n Depending on the time entry, the calling users has to have several permissions to delete the time entry.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is billed, Admin permissions are required.\r\n\r\nAny authenticated user.", - "operationId": "DeleteTimeEntryById", + "summary": "Removes tags from the task template with the specified id.", + "description": "Returns 204 NoContent if all tags have been removed successfully.\r\n Returns 207 MultiStatus if at least one tag could not be removed, including the reasons.\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostDeleteTaskTemplatesTags", "parameters": [ { - "name": "timeEntryId", + "name": "taskTemplateId", "in": "path", - "description": "The id of the time entry.", + "description": "The id of the task template to remove tags from.", "required": true, "schema": { "type": "string", @@ -38807,12 +37403,29 @@ } } ], + "requestBody": { + "description": "The list of tags to remove from the task template.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeleteTagForm" + } + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" }, - "401": { - "description": "Unauthorized", + "207": { + "description": "Multi-Status" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -38821,8 +37434,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -38843,21 +37456,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } - }, + } + }, + "/tasktemplates/{taskTemplateId}/recurrency": { "get": { "tags": [ - "TimeEntries" + "TaskBundles" ], - "summary": "Get a time entry by id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTimeEntryById", + "summary": "Gets recurrency details for a task template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", + "operationId": "GetTaskTemplateRecurrencyByTaskTemplateId", "parameters": [ { - "name": "timeEntryId", + "name": "taskTemplateId", "in": "path", - "description": "The id of the time entry.", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", @@ -38871,7 +37487,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/TaskRecurrencyForm" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -38888,21 +37514,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "read" } - }, - "put": { + } + }, + "/tasktemplates/{taskTemplateId}/setcustomfields": { + "post": { "tags": [ - "TimeEntries" + "CustomFields" ], - "summary": "Updates the time entry with the specified id.", - "description": "Updates the time entry with the specified id.\r\n Depending on the time entry, the calling users has to have several permissions to update the time entry:\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n The break duration of the time entry is kept the same. The break duration cannot be smaller than the duration of the\r\n time entry. To remove the breaks, use the endpoint POST /timeentries/{id}/removeBreaks.\r\n Following combination of times and duration are allowed for already completed time entries:\r\n - start time (local or utc) and end time (local or utc) (this option always takes precedence)\r\n - start time (local or utc) and duration\r\n - end time (local or utc) and duration\r\n For running time entries, you can only update the start time (local or utc) while the duration stays 0.\r\n\r\nAny authenticated user.", - "operationId": "PutTimeEntryById", + "summary": "Sets the custom fields for the specified task template.", + "description": "The required properties depend on the type of the custom field. Only task templates which are linked to a project template may have custom fields set.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostTaskTemplateSetCustomFieldsByTaskTemplateId", "parameters": [ { - "name": "timeEntryId", + "name": "taskTemplateId", "in": "path", - "description": "The id of the time entry.", + "description": "The id of the task template to set custom fields for.", "required": true, "schema": { "type": "string", @@ -38911,26 +37540,22 @@ } ], "requestBody": { - "description": "The time entry data to update.", + "description": "The model containing the details for setting the custom fields for a task template.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTrackingPutForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldPostForm" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeTracking" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -38942,16 +37567,6 @@ } } }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, "404": { "description": "Not Found", "content": { @@ -38974,23 +37589,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/timeentries/{timeEntryId}/removebreaks": { + "/tasktemplates/{taskTemplateId}/setrecurrency": { "post": { "tags": [ - "TimeEntries" + "TaskBundles" ], - "summary": "Handles removing all breaks from a time entry, effectively resuming the timer.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "PostTimeEntryRemoveBreaks", + "summary": "Adds or updates a recurrence rule for a task template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTaskTemplateSetRecurrencyByTaskTemplateId", "parameters": [ { - "name": "timeEntryId", + "name": "taskTemplateId", "in": "path", - "description": "The id of the time entry.", + "description": "The id of the task template.", "required": true, "schema": { "type": "string", @@ -38998,13 +37614,27 @@ } } ], + "requestBody": { + "description": "The model describing the recurrence rule to apply.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskBundleRecurrencyForm" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -39021,56 +37651,31 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/timereports": { + "/tasktemplates/{taskTemplateId}/tags": { "get": { "tags": [ - "TimeReports" + "TaskTemplateTags" ], - "summary": "Returns all time reports of a user.", - "description": "Returns time reports the user created as well as the shared time reports of\r\n other users.\r\n\r\nAny authenticated user.", - "operationId": "GetTimeReports", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TimeReport" - } - } - } - } - } - }, - "security": [ + "summary": "Returns the tags of the task template with the specified id.", + "description": "Returns the tags of the task template with the specified id ordered by name.\r\n\r\nAny authenticated user.", + "operationId": "GetTagsByTaskTemplateId", + "parameters": [ { - "oauth2": [ - "full_access" - ] + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/timetracking/settings": { - "get": { - "tags": [ - "TimeTrackingSettings" - ], - "summary": "Returns the global timetracking settings.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTimeTrackingSettings", "responses": { "200": { "description": "OK", @@ -39079,7 +37684,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TimeTrackingSetting" + "$ref": "#/components/schemas/BaseTagModel" } } } @@ -39101,35 +37706,24 @@ } } }, - "/typeofwork": { + "/tasktemplates/{taskTemplateId}/taskdependencytemplates": { "get": { "tags": [ - "TypeOfWork" + "TaskDependencyTemplates" ], - "summary": "Gets all types of work.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTypesOfWork", + "summary": "Returns the task dependency templates for a given task template.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:read` permissions.", + "operationId": "GetTaskTemplateTaskDependencyTemplatesByTaskTemplateId", "parameters": [ { - "name": "showArchived", - "in": "query", - "description": "The show Archived.", + "name": "taskTemplateId", + "in": "path", + "description": "The id of the task template.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -39140,11 +37734,31 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TypeOfWork" + "$ref": "#/components/schemas/TaskDependencyTemplate" } } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -39158,26 +37772,51 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "read" } - }, + } + }, + "/tasktemplates/{tasktemplateId}/externalfiles": { "post": { "tags": [ - "TypeOfWork" + "TaskTemplateFiles" + ], + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", + "parameters": [ + { + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Creates a new type of work.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PostTypesOfWork", "requestBody": { - "description": "The type Of Work form payload.", + "description": "List of file forms.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TypeOfWorkForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -39185,17 +37824,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TypeOfWork" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -39212,33 +37841,34 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/typeofwork/icons": { - "get": { + "/tasktemplates/{tasktemplateId}/files": { + "delete": { "tags": [ - "TypeOfWork" + "TaskTemplateFiles" ], - "summary": "Gets all possible icons for type of work.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTypesOfWorkIcons", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } + "summary": "Deletes the files of the specified tasktemplate.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteTaskTemplateFiles", + "parameters": [ + { + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } + ], + "responses": { + "204": { + "description": "No Content" + } }, "security": [ { @@ -39253,26 +37883,36 @@ "x-access": { "any": "true" } - } - }, - "/typeofwork/{typeOfWorkId}": { + }, "get": { "tags": [ - "TypeOfWork" + "TaskTemplateFiles" ], - "summary": "Gets the type of work with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetTypeOfWorkById", + "summary": "Returns all files of the tasktemplate with the specified id.", + "description": "Returns all file metadata of the tasktemplate with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateFiles", "parameters": [ { - "name": "typeOfWorkId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the type of work.", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -39281,17 +37921,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TypeOfWork" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } } } } @@ -39311,18 +37944,18 @@ "any": "true" } }, - "put": { + "post": { "tags": [ - "TypeOfWork" + "TaskTemplateFiles" ], - "summary": "Changes the properties of an existing type of work.", - "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", - "operationId": "PutTypeOfWorkById", + "summary": "Creates a new tasktemplate file for the tasktemplate with the specified id..", + "description": "Uploads a new tasktemplate file for the tasktemplate with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateTaskTemplateFile", "parameters": [ { - "name": "typeOfWorkId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the type of work.", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", @@ -39331,15 +37964,27 @@ } ], "requestBody": { - "description": "The type Of Work form payload.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/TypeOfWorkForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -39347,30 +37992,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TypeOfWork" + "$ref": "#/components/schemas/FileInfo" } } } }, "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "description": "Bad Request" } }, "security": [ @@ -39384,24 +38012,23 @@ "v1" ], "x-access": { - "admin": "true", - "task-manage-config": "write" + "any": "true" } } }, - "/typeofwork/{typeOfWorkId}/delete": { + "/tasktemplates/{tasktemplateId}/files/byuploadid": { "post": { "tags": [ - "TypeOfWork" + "FileUpload" ], - "summary": "Deletes the type of work with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostTypeOfWorkDeleteByTypeOfWorkId", + "summary": "Creates a file from an upload id.", + "description": "After a file has been uploaded to an upload URL generated from the endpoint, this endpoint can be used to create a file tasktemplate from the uploaded file by providing the upload id.\r\n\r\nAny authenticated user.", + "operationId": "PostUploadByUploadId", "parameters": [ { - "name": "typeOfWorkId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the type of work.", + "description": "The id of the tasktemplate to attach the file to.", "required": true, "schema": { "type": "string", @@ -39410,26 +38037,23 @@ } ], "requestBody": { - "description": "The model containing the new type of work id to substitute.", + "description": "The model describing the uploaded file metadata.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteTaskTypeForm" + "$ref": "#/components/schemas/UploadByUploadIdForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -39456,24 +38080,23 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/typeofwork/{typeOfWorkId}/setarchived": { + "/tasktemplates/{tasktemplateId}/files/byurl": { "post": { "tags": [ - "TypeOfWork" + "TaskTemplateFiles" ], - "summary": "Archives or unarchives the type of work with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostTypeOfWorkSetArchivedByTypeOfWorkId", + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateTaskTemplateFileByUrl", "parameters": [ { - "name": "typeOfWorkId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the type of work.", + "description": "The id of the tasktemplate the file is linked to.", "required": true, "schema": { "type": "string", @@ -39482,15 +38105,19 @@ } ], "requestBody": { - "description": "The archived form payload.", + "description": "The url, name and description of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchivedForm" + "$ref": "#/components/schemas/FilePostForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -39498,27 +38125,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TypeOfWork" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -39535,55 +38142,43 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "write" + "any": "true" } } }, - "/users": { - "get": { + "/tasktemplates/{tasktemplateId}/files/{fileId}": { + "delete": { "tags": [ - "Users" + "TaskTemplateFiles" ], - "summary": "Returns all users with their details.", - "description": "Returns all users with their details like status, contact info and more.\r\n Returns all users if the user has read permissions on the feature\r\n user-master-data, otherwise returns only his own user.\r\n Archived users are excluded by default. You can include them by setting the 'showArchived' query parameter.\r\n If the permissions have UserTeamsData Feature, the filter for teams is applied.\r\n Beware that this will also include API users in the response.\r\n\r\nAny authenticated user.", - "operationId": "GetUsers", + "summary": "Deletes the tasktemplate file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteTaskTemplateFile", "parameters": [ { - "name": "showArchived", - "in": "query", - "description": "Whether to show archived users.", + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -39599,24 +38194,33 @@ "x-access": { "any": "true" } - } - }, - "/users/autofill/{email}": { + }, "get": { "tags": [ - "Users" + "TaskTemplate Files" ], - "summary": "Tries to retrieve user name and gender for the specified email.", - "description": "Returns the first name, last name and gender of the given email address.\r\n\r\nAny authenticated user.", - "operationId": "GetUsersAutofillByEmail", + "summary": "Returns the file with the specified id of the tasktemplate with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByTaskTemplateNameAndTaskTemplateIdAndFileId", "parameters": [ { - "name": "email", + "name": "tasktemplateId", "in": "path", - "description": "The user's email.", + "description": "The id of the tasktemplate.", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -39626,13 +38230,30 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutofillUser" + "$ref": "#/components/schemas/FileInfo" } } } }, - "204": { - "description": "No Content" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -39648,73 +38269,58 @@ "x-access": { "any": "true" } - } - }, - "/users/deletetags": { - "post": { + }, + "put": { "tags": [ - "UserTags" + "TaskTemplateFiles" ], - "summary": "Removes a tag from all users.", - "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", - "operationId": "PostUsersDeleteTags", - "requestBody": { - "description": "The model with the tag to be removed.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteTagForm" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] + "summary": "Updates the metadata of the tasktemplate file with the specified id.", + "description": "Updates the metadata of the tasktemplate file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateTaskTemplateFile", + "parameters": [ + { + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "user-master-data": "write" - } - } - }, - "/users/me": { - "get": { - "tags": [ - "Users" - ], - "summary": "Returns the currently logged-in user and workspace.", - "description": "This is an alternate URL for the /me endpoint.\r\n\r\nAny authenticated user.", - "operationId": "GetUsersMe", + "requestBody": { + "description": "The model to update the file with the specified id.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserAndWorkspace" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -39735,77 +38341,58 @@ } } }, - "/users/projecttimebookings": { - "get": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/changeentity": { + "post": { "tags": [ - "TimeBookings" + "TaskTemplateFiles" ], - "summary": "Returns the time bookings in a specified time range for a list of users.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetProjectTimeBookingsForUsers", + "summary": "Changes the tasktemplate this file belongs to.", + "description": "Changes the tasktemplate this file belongs to.\nSwitch to the specified tasktemplate or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeTaskTemplate", "parameters": [ { - "name": "userIds", - "in": "query", - "description": "The ids of the users.", - "required": true, - "schema": { - "type": "string", - "description": "This class is used to bind a querystring list of Guid (as a comma-separated list) to the List of Guid parameter in a\nminimal API endpoint.", - "example": "123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001" - } - }, - { - "name": "intervalStart", - "in": "query", - "description": "The start of the interval.", + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", - "format": "date" + "format": "uuid" } }, { - "name": "intervalEnd", - "in": "query", - "description": "The end of the interval.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", - "format": "date" + "format": "uuid" } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/GetTimeBookingForUsersResult" - } - } + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" } } - }, - "401": { - "description": "Unauthorized", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -39826,24 +38413,58 @@ } } }, - "/users/tags": { - "get": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/copy": { + "post": { "tags": [ - "UserTags" + "TaskTemplateFiles" ], - "summary": "Returns all tags that are currently in use.", - "description": "Returns all tags that are currently in use ordered by count.\r\n\r\nAny authenticated user.", - "operationId": "GetUsersTags", + "summary": "Copies the file to a new tasktemplate.", + "description": "Copies the file to a new tasktemplate (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToTaskTemplate", + "parameters": [ + { + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } + "$ref": "#/components/schemas/FileInfo" } } } @@ -39864,44 +38485,59 @@ } } }, - "/users/timebookings": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/download": { "get": { "tags": [ - "TimeBookings" + "TaskTemplateFiles" ], - "summary": "Returns the time bookings in a specified time range for a list of users.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUsersTimeBookings", + "summary": "Returns the content of the tasktemplate file with the specified id.", + "description": "Returns the content of the tasktemplate file. Uses the latest file version.\nIf the tasktemplate file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateFileContent", "parameters": [ { - "name": "userIds", - "in": "query", - "description": "The ids of the users.", + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", - "description": "This class is used to bind a querystring list of Guid (as a comma-separated list) to the List of Guid parameter in a\nminimal API endpoint.", - "example": "123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001" + "format": "uuid" } }, { - "name": "intervalStart", - "in": "query", - "description": "The start of the interval.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", - "format": "date" + "format": "uuid" } }, { - "name": "intervalEnd", + "name": "width", "in": "query", - "description": "The end of the interval.", - "required": true, + "description": "Set width to resize.", "schema": { - "type": "string", - "format": "date" + "type": "number", + "format": "double" + } + }, + { + "name": "height", + "in": "query", + "description": "Set height to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" } } ], @@ -39911,30 +38547,8 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/GetTimeBookingForUsersResult" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -39955,44 +38569,53 @@ } } }, - "/users/updatetags": { - "post": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/pdf": { + "get": { "tags": [ - "UserTags" + "TaskTemplateFiles" ], - "summary": "Updates a tag globally for all users.", - "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", - "operationId": "PostUsersUpdateTags", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TagUpdateForm" - } + "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", + "description": "Returns the content of the tasktemplate file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateFileContent", + "parameters": [ + { + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "404": { - "description": "Not Found", + { + "name": "inline", + "in": "query", + "description": "If inline is false, content-disposition header is attachment.", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -40009,77 +38632,37 @@ "v1" ], "x-access": { - "admin": "true", - "user-master-data": "write" + "any": "true" } } }, - "/users/workload": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/shareurl": { "get": { "tags": [ - "Workload" + "TaskTemplateFiles" ], - "summary": "Returns the users' workloads per day.", - "description": "Returns the users' workloads per day for projects, tasks, task schedules and calendar events\r\n that have an overlap with the interval specified by intervalStart and intervalEnd.\r\n Takes into consideration weekly availability, absences, user capacity, planned efforts, as well as project budget.\r\n\r\nThe user must be an admin or have `user-planning-data:read` permissions.", - "operationId": "GetUsersWorkload", + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", "parameters": [ { - "name": "userIds", - "in": "query", - "description": "The ids of the users to get the workload for, as a comma-separated list of Guids.", - "required": true, - "schema": { - "type": "string", - "description": "This class is used to bind a querystring list of Guid (as a comma-separated list) to the List of Guid parameter in a\nminimal API endpoint.", - "example": "123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001" - } - }, - { - "name": "intervalStart", - "in": "query", - "description": "The start of the interval to filter by.", + "name": "tasktemplateId", + "in": "path", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", - "format": "date-time" + "format": "uuid" } }, { - "name": "intervalEnd", - "in": "query", - "description": "The end of the interval to filter by.", + "name": "fileId", + "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", - "format": "date-time" - } - }, - { - "name": "roughPlanningFrom", - "in": "query", - "description": "The number of days from today when the rough planning should start.", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "fetchDetails", - "in": "query", - "description": "(Optional - default: false) If set to true, the result will contain the hierarchy of elements that are contributing\n to the workload (projects, tasks, appointments).\n Otherwise it will return only the workload value.\n Works only for single day queries.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "ignoreCalendarEvents", - "in": "query", - "description": "Whether to ignore calendar events. Can significantly improve performance.", - "schema": { - "type": "boolean", - "default": false + "format": "uuid" } } ], @@ -40089,30 +38672,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/GetWorkloadForUsersResult" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string" } } } @@ -40129,51 +38689,62 @@ "v1" ], "x-access": { - "admin": "true", - "user-planning-data": "read" + "any": "true" } } }, - "/users/{userId}": { - "delete": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/versions": { + "get": { "tags": [ - "Users" + "TaskTemplateFiles" ], - "summary": "Deletes the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `user-manage-config:delete` permissions.", - "operationId": "DeleteUserById", + "summary": "Returns all file versions of the specified tasktemplate file.", + "description": "Returns all file versions of the specified tasktemplate file.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateFileVersions", "parameters": [ { - "name": "userId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the user.", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "204": { - "description": "No Content" }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "404": { - "description": "Not Found", + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/FileVersion" + } } } } @@ -40190,87 +38761,31 @@ "v1" ], "x-access": { - "admin": "true", - "user-manage-config": "delete" + "any": "true" } }, - "get": { + "post": { "tags": [ - "Users" + "TaskTemplateFiles" ], - "summary": "Returns the user with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUserById", + "summary": "Uploads a new version of the tasktemplate file with the specified id.", + "description": "Uploads a new version of an tasktemplate file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateTaskTemplateFileVersion", "parameters": [ { - "name": "userId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the user.", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "put": { - "tags": [ - "Users" - ], - "summary": "Updates the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", - "operationId": "PutUserById", - "parameters": [ { - "name": "userId", + "name": "fileId", "in": "path", - "description": "The id of the user.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -40279,15 +38794,27 @@ } ], "requestBody": { - "description": "The model to update the user.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/UserForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -40295,20 +38822,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/User" + "$ref": "#/components/schemas/FileVersion" } } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "400": { + "description": "Bad Request" } }, "security": [ @@ -40322,25 +38842,43 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true", - "user-master-data": "write" + "any": "true" } } }, - "/users/{userId}/activate": { - "post": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/versions/{versionId}": { + "get": { "tags": [ - "Users" + "TaskTemplate Files" ], - "summary": "Activates the user with the specified id.", - "description": "The user is then allowed to sign in again and will be notified via email.\r\n\r\nThe user must be an admin or have `user-manage-config:write` permissions.", - "operationId": "PostUserActivateByUserId", + "summary": "Returns the tasktemplate file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByTaskTemplateNameAndTaskTemplateIdAndFileIdAndVersionId", "parameters": [ { - "name": "userId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the user.", + "description": "The id of the tasktemplate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", "required": true, "schema": { "type": "string", @@ -40349,15 +38887,12 @@ } ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileVersion" } } } @@ -40394,75 +38929,58 @@ "v1" ], "x-access": { - "admin": "true", - "user-manage-config": "write" + "any": "true" } } }, - "/users/{userId}/addtags": { - "post": { + "/tasktemplates/{tasktemplateId}/files/{fileId}/versions/{versionId}/download": { + "get": { "tags": [ - "UserTags" + "TaskTemplateFiles" ], - "summary": "Adds a batch of tags to the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", - "operationId": "PostUserAddTagsByUserId", + "summary": "Returns the content of the tasktemplate file version with the specified id.", + "description": "Returns the content of the tasktemplate file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetTaskTemplateFileVersionContent", "parameters": [ { - "name": "userId", + "name": "tasktemplateId", "in": "path", - "description": "The id of the user to add tags to.", + "description": "The id of the tasktemplate.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "The model with the tags to be added.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagForm" - } - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -40479,28 +38997,35 @@ "v1" ], "x-access": { - "admin": "true", - "user-master-data": "write" + "any": "true" } } }, - "/users/{userId}/allavailabletasks": { + "/teams": { "get": { "tags": [ - "AssignedTasks" + "Teams" ], - "summary": "Returns all tasks the specified user is allowed to see.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUserAllAvailableTasksByUserId", + "summary": "Returns all teams.", + "description": "When team restrictions are applied for the workspace, the user must either be an admin or member of the team to retrieve it.", + "operationId": "GetTeams", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, + "name": "includeUserIds", + "in": "query", + "description": "Whether to include the ids of users that are in the team.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false + } + }, + { + "name": "includeProjectIds", + "in": "query", + "description": "Whether to include the ids of projects that are assigned to the team.", + "schema": { + "type": "boolean", + "default": false } }, { @@ -40524,7 +39049,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/Team" } } } @@ -40544,77 +39069,32 @@ "x-access": { "any": "true" } - } - }, - "/users/{userId}/assignedtasks": { - "get": { + }, + "post": { "tags": [ - "AssignedTasks" + "Teams" ], - "summary": "Returns all tasks assigned to the specified user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUserAssignedTasksByUserId", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user to get the tasks for.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "inProgress", - "in": "query", - "description": "Whether to return only assigned project tasks of running projects. Defaults to true.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "assignedOnFrom", - "in": "query", - "description": "The start date for filtering by assignment date. If set, tasks are returned only when the assignment date is greater or equal than this value.", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "assignedOnTo", - "in": "query", - "description": "The end date for filtering by assignment date. If set, tasks are returned only when the assignment date is less or equal than this value.", - "schema": { - "type": "string", - "format": "date-time" + "summary": "Creates a new team.", + "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin.", + "operationId": "PostTeam", + "requestBody": { + "description": "The model used to create the team.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamForm" + } } }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/Team" } } } @@ -40631,33 +39111,26 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" + }, + "x-subscriptionlevel": { + "minimumPlan": "standard" } } }, - "/users/{userId}/assignedtasks/{taskId}": { - "get": { + "/teams/{teamId}": { + "delete": { "tags": [ - "AssignedTasks" + "Teams" ], - "summary": "Returns the assigned task with the specified id of a specified user.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUserAssignedTaskByUserIdAndTaskId", + "summary": "Deletes the team with the specified id.", + "description": "\r\n\r\nThe user must be an admin.", + "operationId": "DeleteTeamById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", + "name": "teamId", "in": "path", - "description": "The id of the task to return.", + "description": "The id of the team to delete.", "required": true, "schema": { "type": "string", @@ -40666,25 +39139,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskModel" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" }, "404": { "description": "Not Found", @@ -40708,28 +39164,44 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } - } - }, - "/users/{userId}/capacity": { + }, "get": { "tags": [ - "UserCapacities" + "Teams" ], - "summary": "Returns the capacity of the specified user.", - "description": "Returns the capacity of the specified user.\r\n User planning data or admin permissions are required if the capacity of the specified user\r\n does not belong to the calling user.\r\n\r\nAny authenticated user.", - "operationId": "GetUserCapacityByUserId", + "summary": "Returns the team with the specified id.", + "description": "When team restrictions are applied for the workspace, the user must either be an admin or member of the team to retrieve it.", + "operationId": "GetTeamById", "parameters": [ { - "name": "userId", + "name": "teamId", "in": "path", - "description": "The id of the user.", + "description": "The id of the team.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "includeUserIds", + "in": "query", + "description": "Whether to include the ids of users that are in the team.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "includeProjectIds", + "in": "query", + "description": "Whether to include the ids of projects that are assigned to the team.", + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { @@ -40738,7 +39210,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserCapacity" + "$ref": "#/components/schemas/Team" } } } @@ -40752,6 +39224,16 @@ } } } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -40770,29 +39252,47 @@ }, "put": { "tags": [ - "UserCapacities" + "Teams" ], - "summary": "Updates the capacity of the specified user.", - "description": "Updates the capacity of the user with the specified id.\r\n User planning data or admin permissions are required if the capacity of the specified user\r\n does not belong to the calling user.\r\n\r\nAny authenticated user.", - "operationId": "PutUserCapacityByUserId", + "summary": "Updates the team with the specified id.", + "description": "\r\n\r\nThe user must be an admin.", + "operationId": "PutTeamById", "parameters": [ { - "name": "userId", + "name": "teamId", "in": "path", - "description": "The user whose capacity should be updated.", + "description": "The id of the team to update.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "includeUserIds", + "in": "query", + "description": "Whether to include the ids of users that are in the team.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "includeProjectIds", + "in": "query", + "description": "Whether to include the ids of projects that are assigned to the team.", + "schema": { + "type": "boolean", + "default": false + } } ], "requestBody": { - "description": "Updated capacity values for each day of the week.", + "description": "The model with the team data.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserCapacityForm" + "$ref": "#/components/schemas/TeamForm" } } }, @@ -40804,13 +39304,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserCapacity" + "$ref": "#/components/schemas/Team" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -40831,42 +39331,45 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true" } } }, - "/users/{userId}/contactinfo": { - "get": { + "/teams/{teamId}/addprojects": { + "post": { "tags": [ - "Users" + "Teams" ], - "summary": "Returns the contact infos of the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:read` permissions.", - "operationId": "GetUserContactInfoByUserId", + "summary": "Adds projects to the specified team.", + "description": "The user must have `project-master-data:write` permissions or be the owner of the projects.", + "operationId": "PostTeamAddProjectsByTeamId", "parameters": [ { - "name": "userId", + "name": "teamId", "in": "path", - "description": "The id of the user.", + "description": "The id of the team.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], + "requestBody": { + "description": "The model with the list of project ids to add.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -40875,12 +39378,22 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ContactInfo" + "$ref": "#/components/schemas/ProjectInTeam" } } } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -40903,23 +39416,23 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true", - "user-master-data": "read" + "any": "true" } - }, + } + }, + "/teams/{teamId}/addusers": { "post": { "tags": [ - "Users" + "Teams" ], - "summary": "Creates a new contact info for the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", - "operationId": "PostUserContactInfoByUserId", + "summary": "Adds users to the specified team.", + "description": "\r\n\r\nThe user must be an admin.", + "operationId": "PostTeamAddUsersByTeamId", "parameters": [ { - "name": "userId", + "name": "teamId", "in": "path", - "description": "The user to add contact information to.", + "description": "The id of the team.", "required": true, "schema": { "type": "string", @@ -40928,11 +39441,15 @@ } ], "requestBody": { - "description": "The model containing contact information details including address, phone number, and type.", + "description": "The model with the list of user ids to add.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfoFormForUsers" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } }, @@ -40944,7 +39461,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/UserInTeam" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -40971,35 +39501,23 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true", - "user-master-data": "write" + "admin": "true" } } }, - "/users/{userId}/contactinfo/{contactInfoId}": { - "delete": { + "/teams/{teamId}/removeprojects": { + "post": { "tags": [ - "Users" + "Teams" ], - "summary": "Deletes the contact info of the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", - "operationId": "DeleteUserContactInfoByUserIdAndContactInfoId", + "summary": "Removes projects from the specified team.", + "description": "The user must have `project-master-data:write` permissions or be the owner of the projects.", + "operationId": "PostTeamRemoveProjectsByTeamId", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "contactInfoId", + "name": "teamId", "in": "path", - "description": "The id of the contact info.", + "description": "The id of the team.", "required": true, "schema": { "type": "string", @@ -41007,6 +39525,21 @@ } } ], + "requestBody": { + "description": "The model with the list of project ids to remove.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" @@ -41043,33 +39576,23 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true", - "user-master-data": "write" + "any": "true" } - }, - "get": { + } + }, + "/teams/{teamId}/removeusers": { + "post": { "tags": [ - "Users" + "Teams" ], - "summary": "Returns the contact info of the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:read` permissions.", - "operationId": "GetUserContactInfoByUserIdAndContactInfoId", + "summary": "Removes users from the specified team.", + "description": "\r\n\r\nThe user must be an admin.", + "operationId": "PostTeamRemoveUsersByTeamId", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "contactInfoId", + "name": "teamId", "in": "path", - "description": "The id of the contact info.", + "description": "The id of the team.", "required": true, "schema": { "type": "string", @@ -41077,13 +39600,31 @@ } } ], + "requestBody": { + "description": "The model with the list of user ids to remove.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -41110,50 +39651,76 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true", - "user-master-data": "read" + "admin": "true" } - }, - "put": { + } + }, + "/temporaryfiles": { + "get": { "tags": [ - "Users" + "Temporary Files" ], - "summary": "Updates the contact info of the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", - "operationId": "PutUserContactInfoByUserIdAndContactInfoId", + "summary": "Returns all temporary files of the current user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTemporaryFiles", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "contactInfoId", - "in": "path", - "description": "The id of the contact info.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } + } + } } } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "Temporary Files" ], + "summary": "Creates a new temporary file.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTemporaryFiles", "requestBody": { - "description": "The contact info model.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ContactInfoFormForUsers" + "$ref": "#/components/schemas/FileUploadModel" } } - }, - "required": true + } }, "responses": { "200": { @@ -41161,7 +39728,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ContactInfo" + "$ref": "#/components/schemas/FileInfo" } } } @@ -41175,16 +39742,6 @@ } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -41198,39 +39755,27 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true", - "user-master-data": "write" + "any": "true" } } }, - "/users/{userId}/deactivate": { - "post": { + "/temporaryfiles/{fileId}": { + "get": { "tags": [ - "Users" + "Temporary Files" ], - "summary": "Deactivates the user with the specified id.", - "description": "A deactivated user can no longer sign in.\r\n This is only possible if the user is not the last admin user.\r\n\r\nThe user must be an admin or have `user-manage-config:write` permissions.", - "operationId": "PostUserDeactivateByUserId", + "summary": "Returns the temporary file with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTemporaryFilesByFileId", "parameters": [ { - "name": "userId", + "name": "fileId", "in": "path", - "description": "The id of the user.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "includeSummary", - "in": "query", - "description": "Whether to return the private project orphan resolution summary.", - "schema": { - "type": "boolean", - "default": false - } } ], "responses": { @@ -41239,30 +39784,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PostUserDeactivateByUserIdResponse" - } - } - } - }, - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -41289,24 +39811,20 @@ "v1" ], "x-access": { - "admin": "true", - "user-manage-config": "write" + "any": "true" } - } - }, - "/users/{userId}/deletetags": { - "post": { + }, + "put": { "tags": [ - "UserTags" + "Temporary Files" ], - "summary": "Removes tags from the user with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", - "operationId": "PostUserDeleteTagsByUserId", + "summary": "Updates the meta information of the temporary file with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PutTemporaryFilesByFileId", "parameters": [ { - "name": "userId", + "name": "fileId", "in": "path", - "description": "The id of the user whose tags should be removed.", "required": true, "schema": { "type": "string", @@ -41315,25 +39833,45 @@ } ], "requestBody": { - "description": "The model with the tags to be removed.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DeleteTagForm" - } + "$ref": "#/components/schemas/FileInfoUpdateForm" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } }, - "207": { - "description": "Multi-Status" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -41347,24 +39885,23 @@ "v1" ], "x-access": { - "admin": "true", - "user-master-data": "write" + "any": "true" } } }, - "/users/{userId}/externalfiles": { - "post": { + "/temporaryfiles/{fileId}/download": { + "get": { "tags": [ - "UserFiles" + "Temporary Files" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Returns the content of the temporary file with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTemporaryFilesDownloadByFileId", "parameters": [ { - "name": "userId", + "name": "fileId", "in": "path", - "description": "The id of the user.", + "description": "The temporary file to download.", "required": true, "schema": { "type": "string", @@ -41372,34 +39909,29 @@ } } ], - "requestBody": { - "description": "List of file forms.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" + "responses": { + "200": { + "description": "OK" + }, + "206": { + "description": "Partial Content" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } - } - }, - "responses": { - "200": { - "description": "OK", + }, + "416": { + "description": "Range Not Satisfiable", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -41420,19 +39952,18 @@ } } }, - "/users/{userId}/files": { - "delete": { + "/temporaryfiles/{fileId}/setentity": { + "post": { "tags": [ - "UserFiles" + "Temporary Files" ], - "summary": "Deletes the files of the specified user.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteUserFiles", + "summary": "Sets the temporary file to a global or entity file.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTemporaryFilesSetEntityByFileId", "parameters": [ { - "name": "userId", + "name": "fileId", "in": "path", - "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -41440,9 +39971,46 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -41458,25 +40026,17 @@ "x-access": { "any": "true" } - }, + } + }, + "/timebookings": { "get": { "tags": [ - "UserFiles" + "TimeBookings" ], - "summary": "Returns all files of the user with the specified id.", - "description": "Returns all file metadata of the user with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetUserFiles", + "summary": "Returns a list of time bookings.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTimeBookings", "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, { "$ref": "#/components/parameters/page" }, @@ -41498,7 +40058,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeBooking" } } } @@ -41521,45 +40081,21 @@ }, "post": { "tags": [ - "UserFiles" - ], - "summary": "Creates a new user file for the user with the specified id..", - "description": "Uploads a new user file for the user with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateUserFile", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TimeBookings" ], + "summary": "Creates a new time booking for a given project and user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "PostTimeBooking", "requestBody": { + "description": "The model to create the time booking.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/TimeBookingForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -41567,72 +40103,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeBooking" } } } }, "400": { - "description": "Bad Request" - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/users/{userId}/files/byurl": { - "post": { - "tags": [ - "UserFiles" - ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateUserFileByUrl", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user the file is linked to.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } - } - }, - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -41653,29 +40144,19 @@ } } }, - "/users/{userId}/files/{fileId}": { + "/timebookings/{timeBookingId}": { "delete": { "tags": [ - "UserFiles" + "TimeBookings" ], - "summary": "Deletes the user file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteUserFile", + "summary": "Deletes a time booking by id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "DeleteTimeBookingById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "timeBookingId", "in": "path", - "description": "The id of the file.", + "description": "The id of the time booking to delete.", "required": true, "schema": { "type": "string", @@ -41686,6 +40167,26 @@ "responses": { "204": { "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -41702,28 +40203,18 @@ "any": "true" } }, - "get": { + "put": { "tags": [ - "User Files" + "TimeBookings" ], - "summary": "Returns the file with the specified id of the user with the specified id.", + "summary": "Updates a given time booking.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByUserNameAndUserIdAndFileId", + "operationId": "PutTimeBookingById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "timeBookingId", "in": "path", - "description": "The id of the file.", + "description": "The id of the time booking.", "required": true, "schema": { "type": "string", @@ -41731,19 +40222,30 @@ } } ], + "requestBody": { + "description": "The model to update the time booking.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeBookingForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeBooking" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -41752,8 +40254,8 @@ } } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -41776,58 +40278,49 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/timeentries": { + "get": { "tags": [ - "UserFiles" + "TimeEntries" ], - "summary": "Updates the metadata of the user file with the specified id.", - "description": "Updates the metadata of the user file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateUserFile", + "summary": "Returns all time entries.", + "description": "Returns all time entries.\r\n Depending on the time entry, the calling users has to have several permissions to get the time entry.\r\n No permissions are required if the calling user is owner of this time entry (this includes external timetrackings from connected projects).\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions on the 'project-timetracking' feature are necessary (this does NOT include external timetrackings from connected projects).\r\n\r\nAny authenticated user.", + "operationId": "GetTimeEntries", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, + "name": "searchReindex", + "in": "query", + "description": "Whether to reindex for search.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } }, { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model to update the file with the specified id.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/TimeTracking" + } } } } @@ -41846,52 +40339,24 @@ "x-access": { "any": "true" } - } - }, - "/users/{userId}/files/{fileId}/changeentity": { + }, "post": { "tags": [ - "UserFiles" - ], - "summary": "Changes the user this file belongs to.", - "description": "Changes the user this file belongs to.\nSwitch to the specified user or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeUser", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TimeEntries" ], + "summary": "Creates a new time entry.", + "description": "Creates a new time entry.\r\n Depending on the time entry, the calling users has to have several permissions to create the time entry.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntry", "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The time entry data.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" + "$ref": "#/components/schemas/TimeEntryPostForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -41899,7 +40364,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeTracking" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -41920,58 +40405,63 @@ } } }, - "/users/{userId}/files/{fileId}/copy": { + "/timeentries/batch/{operation}": { "post": { "tags": [ - "UserFiles" + "TimeEntries" ], - "summary": "Copies the file to a new user.", - "description": "Copies the file to a new user (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToUser", + "summary": "Edits multiple time entries using the specified operation.", + "description": "The user is only allowed to edit time entries they have permissions for.\r\n Returns MultiStatus. Includes the list of successfully changed, not found, unauthorized, and invalid time entry ids.\r\n Returns BadRequest if the validation of the form fails, f.e. the new type of work cannot be found.\r\n Returns NotFound if the operation route value is not supported.\r\n \r\n Supported Operations:\r\n
    \r\n
  • \r\n delete: Deletes all time entries. Only admins can delete already billed time entries.
  • \r\n
  • \r\n setTypeOfWork: Changes the type of work for a list of time entries.
  • \r\n
  • \r\n setIsBillable: Changes the billability for a list of time entries. Already billed time entries can only be changed to\r\n being unbillable by admins. In this case, the IsBilled flag is also set to false.
  • \r\n
  • \r\n setIsBilled: Changes the billing status for a list of time entries. Only admins can change the billing status back to\r\n unbilled for already billed time entries.
  • \r\n
  • \r\n setProject: Changes the project for a list of time entries. Only admins can change the project for already billed time\r\n entries. Setting the project unsets the previous project and task.
  • \r\n
  • \r\n setTask: Changes the task for a list of time entries. Only admins can change the task for already billed time entries.\r\n Setting the task automatically sets the project if that task is a project task.
  • \r\n
  • \r\n setUser: Changes the user for a list of time entries. Only admins can change the user for already billed time entries.
  • \r\n
\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesBatchByOperation", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "operation", "in": "path", - "description": "The id of the file.", + "description": "The batch operation type.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "requestBody": { - "description": "The model to change the entity information of the file.", + "description": "The time entry batch operation data.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" + "$ref": "#/components/schemas/TimeEntryBatchOperationForm" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "207": { + "description": "Multi-Status", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/MultiStatusResult" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -41992,75 +40482,41 @@ } } }, - "/users/{userId}/files/{fileId}/download": { - "get": { + "/timeentries/delete": { + "post": { "tags": [ - "UserFiles" + "TimeEntries" ], - "summary": "Returns the content of the user file with the specified id.", - "description": "Returns the content of the user file. Uses the latest file version.\nIf the user file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetUserFileContent", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" + "summary": "Deletes the time entry with the specified ids.", + "description": "This endpoint is deprecated, please use the batch endpoint POST /timeentries/batch/delete instead.\r\n \r\n Deletes the time entries with the specified ids.\r\n Depending on the time entry, the calling users has to have several permissions to delete the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n If the time entry is billed, Admin permissions are required.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesDelete", + "requestBody": { + "description": "The time entry ids to delete.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTimeEntriesForm" + } } }, - { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", - "schema": { - "type": "boolean" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } } }, + "deprecated": true, "security": [ { "oauth2": [ @@ -42076,115 +40532,61 @@ } } }, - "/users/{userId}/files/{fileId}/pdf": { - "get": { + "/timeentries/setbillable": { + "post": { "tags": [ - "UserFiles" + "TimeEntries" ], - "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the user file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetUserFileContent", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Sets the time entries with the specified ids to billable.", + "description": "Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user must have 'write'\r\n permissions on:\r\n 'project-timetracking' if it is a project task.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesSetBillable", + "requestBody": { + "description": "The time entry ids and billable flag.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetTimeEntryBillableForm" + } } }, - { - "name": "inline", - "in": "query", - "description": "If inline is false, content-disposition header is attachment.", - "schema": { - "type": "boolean", - "default": false - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/users/{userId}/files/{fileId}/shareurl": { - "get": { - "tags": [ - "UserFiles" - ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/ErrorResponse" } } } } }, + "deprecated": true, "security": [ { "oauth2": [ @@ -42200,63 +40602,61 @@ } } }, - "/users/{userId}/files/{fileId}/versions": { - "get": { + "/timeentries/setbilled": { + "post": { "tags": [ - "UserFiles" + "TimeEntries" ], - "summary": "Returns all file versions of the specified user file.", - "description": "Returns all file versions of the specified user file.\r\n\r\nAny authenticated user.", - "operationId": "GetUserFileVersions", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Sets the time entries with the specified ids to billed.", + "description": "Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n If the time entry is billed, the permissions can be ignored because there is no change.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesSetBilled", + "requestBody": { + "description": "The time entry ids and billed flag.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetTimeEntryBilledForm" + } } }, - { - "$ref": "#/components/parameters/page" + "required": true + }, + "responses": { + "204": { + "description": "No Content" }, - { - "$ref": "#/components/parameters/pageSize" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/orderby" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileVersion" - } + "$ref": "#/components/schemas/ErrorResponse" } } } } }, + "deprecated": true, "security": [ { "oauth2": [ @@ -42270,74 +40670,63 @@ "x-access": { "any": "true" } - }, + } + }, + "/timeentries/settypeofwork": { "post": { "tags": [ - "UserFiles" - ], - "summary": "Uploads a new version of the user file with the specified id.", - "description": "Uploads a new version of an user file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateUserFileVersion", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "TimeEntries" ], + "summary": "Sets the type of work of the specified timeentries.", + "description": "Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesSetTypeOfWork", "requestBody": { + "description": "The time entry ids and type of work.", "content": { - "multipart/form-data": { + "application/json": { "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } + "$ref": "#/components/schemas/SetTimeEntryTypeOfWork" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, + "deprecated": true, "security": [ { "oauth2": [ @@ -42353,53 +40742,35 @@ } } }, - "/users/{userId}/files/{fileId}/versions/{versionId}": { - "get": { + "/timeentries/setunbillable": { + "post": { "tags": [ - "User Files" + "TimeEntries" ], - "summary": "Returns the user file version with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByUserNameAndUserIdAndFileIdAndVersionId", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Sets the time entries with the specified ids to unbillable.", + "description": "Already billed time entries cannot be set to unbillable -> Badrequest\r\n Depending on the time entry, the calling users has to have several permissions to edit the time entries.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs write\r\n permissions on:\r\n 'project-timetracking' if it is a project task.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesSetUnbillable", + "requestBody": { + "description": "The time entry ids and billable flag.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetTimeEntryBillableForm" + } } }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileVersion" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -42425,6 +40796,7 @@ } } }, + "deprecated": true, "security": [ { "oauth2": [ @@ -42440,59 +40812,41 @@ } } }, - "/users/{userId}/files/{fileId}/versions/{versionId}/download": { - "get": { + "/timeentries/setunbilled": { + "post": { "tags": [ - "UserFiles" + "TimeEntries" ], - "summary": "Returns the content of the user file version with the specified id.", - "description": "Returns the content of the user file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetUserFileVersionContent", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Sets the time entries with the specified ids to unbilled.", + "description": "For setting already billed time entries to unbilled, the user needs to have admin permissions.\r\n\r\nAny authenticated user.", + "operationId": "PostTimeEntriesSetUnBilled", + "requestBody": { + "description": "The time entry ids and billed flag.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetTimeEntryBilledForm" + } } }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/ErrorResponse" } } } } }, + "deprecated": true, "security": [ { "oauth2": [ @@ -42508,23 +40862,21 @@ } } }, - "/users/{userId}/otherprivatetasks": { + "/timeentries/simplified": { "get": { "tags": [ - "PrivateTasks" + "TimeEntries" ], - "summary": "Returns all private tasks that a user created and assigned to someone else.", - "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns all private tasks that were originally created by the user but were reassigned to someone else.\r\n\r\nAny authenticated user.", - "operationId": "GetUserOtherPrivateTasksByUserId", + "summary": "Retrieves all time entries with a simplified model based on the grouping parameter.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTimeEntriesSimplified", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user that created the private tasks.", - "required": true, + "name": "grouping", + "in": "query", + "description": "The grouping type.", "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { @@ -42548,31 +40900,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/SimplifiedTimeTracking" } } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -42590,29 +40922,19 @@ } } }, - "/users/{userId}/otherprivatetasks/{taskId}": { - "get": { + "/timeentries/{timeEntryId}": { + "delete": { "tags": [ - "PrivateTasks" + "TimeEntries" ], - "summary": "Returns a private task that a user created and assigned to someone else.", - "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns a private task that was originally created by the user but was reassigned to someone else.\r\n\r\nAny authenticated user.", - "operationId": "GetUserOtherPrivateTaskByUserIdAndTaskId", + "summary": "Deletes the time entry with the specified id.", + "description": "Deletes the time entry with the specified id.\r\n Depending on the time entry, the calling users has to have several permissions to delete the time entry.\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is billed, Admin permissions are required.\r\n\r\nAny authenticated user.", + "operationId": "DeleteTimeEntryById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user the task is assigned to.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", + "name": "timeEntryId", "in": "path", - "description": "The id of the task to return.", + "description": "The id of the time entry.", "required": true, "schema": { "type": "string", @@ -42621,15 +40943,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskModel" - } - } - } + "204": { + "description": "No Content" }, "401": { "description": "Unauthorized", @@ -42665,31 +40980,19 @@ "x-access": { "any": "true" } - } - }, - "/users/{userId}/otherprivatetasks/{taskId}/checklistitems": { + }, "get": { "tags": [ - "ChecklistItems" + "TimeEntries" ], - "summary": "Returns the checklist items for a private task with the specified id.", - "description": "The user must be the creator of the task.", - "operationId": "GetUserOtherPrivateTaskChecklistItemsByUserIdAndTaskId", + "summary": "Get a time entry by id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTimeEntryById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", + "name": "timeEntryId", "in": "path", - "description": "The id of the task.", + "description": "The id of the time entry.", "required": true, "schema": { "type": "string", @@ -42703,30 +41006,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TimeTracking" } } } @@ -42745,41 +41025,19 @@ "x-access": { "any": "true" } - } - }, - "/users/{userId}/otherprivatetasks/{taskId}/checklistitems/{checklistItemId}": { - "get": { + }, + "put": { "tags": [ - "ChecklistItems" + "TimeEntries" ], - "summary": "Returns a checklist item for a private task with the specified id.", - "description": "The user must be the creator of the task.", - "operationId": "GetUserOtherPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", + "summary": "Updates the time entry with the specified id.", + "description": "Updates the time entry with the specified id.\r\n Depending on the time entry, the calling users has to have several permissions to update the time entry:\r\n No permissions are required if the calling user is owner of this time entry.\r\n If the calling user is not the creator of the time entry and the time entry is connected to a project, 'write'\r\n permissions\r\n on the 'project-timetracking' feature are necessary.\r\n If the time entry is connected to a task, the user needs to be assignee of this task or the user needs permissions on:\r\n 'project-planning-data' if it is a project task.\r\n The break duration of the time entry is kept the same. The break duration cannot be smaller than the duration of the\r\n time entry. To remove the breaks, use the endpoint POST /timeentries/{id}/removeBreaks.\r\n Following combination of times and duration are allowed for already completed time entries:\r\n - start time (local or utc) and end time (local or utc) (this option always takes precedence)\r\n - start time (local or utc) and duration\r\n - end time (local or utc) and duration\r\n For running time entries, you can only update the start time (local or utc) while the duration stays 0.\r\n\r\nAny authenticated user.", + "operationId": "PutTimeEntryById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "checklistItemId", + "name": "timeEntryId", "in": "path", - "description": "The id of the checklist item.", + "description": "The id of the time entry.", "required": true, "schema": { "type": "string", @@ -42787,13 +41045,34 @@ } } ], + "requestBody": { + "description": "The time entry data to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeTrackingPutForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" + "$ref": "#/components/schemas/TimeTracking" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -42834,36 +41113,24 @@ } } }, - "/users/{userId}/privatetasks": { - "get": { + "/timeentries/{timeEntryId}/removebreaks": { + "post": { "tags": [ - "PrivateTasks" + "TimeEntries" ], - "summary": "Returns all private tasks of the user with the specified id.", + "summary": "Handles removing all breaks from a time entry, effectively resuming the timer.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUserPrivateTasksByUserId", + "operationId": "PostTimeEntryRemoveBreaks", "parameters": [ { - "name": "userId", + "name": "timeEntryId", "in": "path", - "description": "The id of the user to fetch private tasks for.", + "description": "The id of the time entry.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -42872,30 +41139,83 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TaskModel" - } + "$ref": "#/components/schemas/TimeTracking" } } } - }, - "401": { - "description": "Unauthorized", + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/timereports": { + "get": { + "tags": [ + "TimeReports" + ], + "summary": "Returns all time reports of a user.", + "description": "Returns time reports the user created as well as the shared time reports of\r\n other users.\r\n\r\nAny authenticated user.", + "operationId": "GetTimeReports", + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TimeReport" + } } } } - }, - "404": { - "description": "Not Found", + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/timetracking/settings": { + "get": { + "tags": [ + "TimeTrackingSettings" + ], + "summary": "Returns the global timetracking settings.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTimeTrackingSettings", + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TimeTrackingSetting" + } } } } @@ -42916,23 +41236,22 @@ } } }, - "/users/{userId}/privatetasks/taskstatuses": { + "/typeofwork": { "get": { "tags": [ - "PrivateTasks" + "TypeOfWork" ], - "summary": "Returns the task statuses for private tasks for the specified user.", + "summary": "Gets all types of work.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetPrivateTaskStatusesByUserId", + "operationId": "GetTypesOfWork", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, + "name": "showArchived", + "in": "query", + "description": "The show Archived.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } }, { @@ -42956,7 +41275,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/TypeOfWork" } } } @@ -42976,51 +41295,38 @@ "x-access": { "any": "true" } - } - }, - "/users/{userId}/privatetasks/{taskId}": { - "get": { + }, + "post": { "tags": [ - "PrivateTasks" + "TypeOfWork" ], - "summary": "Returns the private task of a user with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetUserPrivateTaskByUserIdAndTaskId", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Creates a new type of work.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PostTypesOfWork", + "requestBody": { + "description": "The type Of Work form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TypeOfWorkForm" + } } }, - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskModel" + "$ref": "#/components/schemas/TypeOfWork" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -43028,13 +41334,42 @@ } } } - }, - "404": { - "description": "Not Found", + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "task-manage-config": "write" + } + } + }, + "/typeofwork/icons": { + "get": { + "tags": [ + "TypeOfWork" + ], + "summary": "Gets all possible icons for type of work.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTypesOfWorkIcons", + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "type": "string" + } } } } @@ -43055,29 +41390,19 @@ } } }, - "/users/{userId}/privatetasks/{taskId}/checklistitems": { + "/typeofwork/{typeOfWorkId}": { "get": { "tags": [ - "ChecklistItems" + "TypeOfWork" ], - "summary": "Returns the checklist for a private task with the specified id.", - "description": "The user must be be assigned to the task.", - "operationId": "GetUserPrivateTaskChecklistItemsByUserIdAndTaskId", + "summary": "Gets the type of work with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetTypeOfWorkById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", + "name": "typeOfWorkId", "in": "path", - "description": "The id of the task.", + "description": "The id of the type of work.", "required": true, "schema": { "type": "string", @@ -43091,20 +41416,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ChecklistItem" - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TypeOfWork" } } } @@ -43133,41 +41445,19 @@ "x-access": { "any": "true" } - } - }, - "/users/{userId}/privatetasks/{taskId}/checklistitems/{checklistItemId}": { - "get": { + }, + "put": { "tags": [ - "ChecklistItems" + "TypeOfWork" ], - "summary": "Retrieves a checklist item from a private task.", - "description": "The user must be assigned to the task.", - "operationId": "GetUserPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", + "summary": "Changes the properties of an existing type of work.", + "description": "\r\n\r\nThe user must be an admin or have `task-manage-config:write` permissions.", + "operationId": "PutTypeOfWorkById", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "taskId", - "in": "path", - "description": "The id of the task.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "checklistItemId", + "name": "typeOfWorkId", "in": "path", - "description": "The id of the checklist item to retrieve.", + "description": "The id of the type of work.", "required": true, "schema": { "type": "string", @@ -43175,19 +41465,30 @@ } } ], + "requestBody": { + "description": "The type Of Work form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TypeOfWorkForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChecklistItem" + "$ref": "#/components/schemas/TypeOfWork" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -43218,23 +41519,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "task-manage-config": "write" } } }, - "/users/{userId}/setarchived": { + "/typeofwork/{typeOfWorkId}/delete": { "post": { "tags": [ - "Users" + "TypeOfWork" ], - "summary": "Archives or unarchives the user with the specified id.", - "description": "Archived objects can not be used any longer but still exist for being referenced by other entities.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostUserSetArchivedByUserId", + "summary": "Deletes the type of work with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostTypeOfWorkDeleteByTypeOfWorkId", "parameters": [ { - "name": "userId", + "name": "typeOfWorkId", "in": "path", - "description": "The id of the user.", + "description": "The id of the type of work.", "required": true, "schema": { "type": "string", @@ -43243,26 +41545,19 @@ } ], "requestBody": { - "description": "The model to archive or unarchive the user.", + "description": "The model containing the new type of work id to substitute.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchivedForm" + "$ref": "#/components/schemas/DeleteTaskTypeForm" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExtendedUser" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -43297,23 +41592,23 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "workspace-manage-config": "write" } } }, - "/users/{userId}/tags": { - "get": { + "/typeofwork/{typeOfWorkId}/setarchived": { + "post": { "tags": [ - "UserTags" + "TypeOfWork" ], - "summary": "Returns the tags of the users with the specified id.", - "description": "Returns the tags of the user with the specified id ordered by name.\r\n \r\n To read the tags of a user the user must have 'read' permissions on the specified user.", - "operationId": "GetUserTagsByUserId", + "summary": "Archives or unarchives the type of work with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostTypeOfWorkSetArchivedByTypeOfWorkId", "parameters": [ { - "name": "userId", + "name": "typeOfWorkId", "in": "path", - "description": "The id of the user to get the tags for.", + "description": "The id of the type of work.", "required": true, "schema": { "type": "string", @@ -43321,22 +41616,30 @@ } } ], + "requestBody": { + "description": "The archived form payload.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArchivedForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BaseTagModel" - } + "$ref": "#/components/schemas/TypeOfWork" } } } }, - "401": { - "description": "Unauthorized", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -43367,28 +41670,40 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/users/{userId}/tasks/tags": { + "/users": { "get": { "tags": [ - "AssignedTasks" + "Users" ], - "summary": "Returns all task tags the specified user is allowed to see.", - "description": "The tags can be filtered by the properties of the task model.\r\n\r\nAny authenticated user.", - "operationId": "GetUserTasksTagsByUserId", + "summary": "Returns all users with their details.", + "description": "Returns all users with their details like status, contact info and more.\r\n Returns all users if the user has read permissions on the feature\r\n user-master-data, otherwise returns only his own user.\r\n Archived users are excluded by default. You can include them by setting the 'showArchived' query parameter.\r\n If the permissions have UserTeamsData Feature, the filter for teams is applied.\r\n Beware that this will also include API users in the response.\r\n\r\nAny authenticated user.", + "operationId": "GetUsers", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user to get the tags for.", - "required": true, + "name": "showArchived", + "in": "query", + "description": "Whether to show archived users.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -43399,7 +41714,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/BaseTagModel" + "$ref": "#/components/schemas/User" } } } @@ -43421,23 +41736,22 @@ } } }, - "/users/{userId}/timeentries/last": { + "/users/autofill/{email}": { "get": { "tags": [ - "TimeEntries" + "Users" ], - "summary": "Returns the last time entry of a specified user.", - "description": "The last time entry is always the last one that was started.\r\n Time entries which are started in the future are ignored.\r\n If a time entry does not have a start time, 12.00 am is automatically assumed as the start time\r\n for comparison with other time entries from the same day.\r\n\r\nThe user must be an admin or the creator.", - "operationId": "GetLastTimeEntriesByUserId", + "summary": "Tries to retrieve user name and gender for the specified email.", + "description": "Returns the first name, last name and gender of the given email address.\r\n\r\nAny authenticated user.", + "operationId": "GetUsersAutofillByEmail", "parameters": [ { - "name": "userId", + "name": "email", "in": "path", - "description": "The id of the user.", + "description": "The user's email.", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -43447,7 +41761,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/AutofillUser" } } } @@ -43467,42 +41781,30 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true" + "any": "true" } } }, - "/users/{userId}/timetracking/pause": { + "/users/deletetags": { "post": { "tags": [ - "TimeTracking" + "UserTags" ], - "summary": "Pauses a running time tracking for a user.", - "description": "If there is already a paused time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", - "operationId": "PostPauseTimeTrackingByUserId", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TimeTracking" - } - } + "summary": "Removes a tag from all users.", + "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", + "operationId": "PostUsersDeleteTags", + "requestBody": { + "description": "The model with the tag to be removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTagForm" + } } }, + "required": true + }, + "responses": { "204": { "description": "No Content" } @@ -43518,43 +41820,39 @@ "v1" ], "x-access": { - "owner": "true" + "admin": "true", + "user-master-data": "write" } } }, - "/users/{userId}/timetracking/resume": { - "post": { + "/users/me": { + "get": { "tags": [ - "TimeTracking" - ], - "summary": "Resumes a paused time tracking for a user.", - "description": "If there is already a running time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", - "operationId": "PostResumeTimeTrackingByUserId", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Users" ], + "summary": "Returns the currently logged-in user and workspace.", + "description": "This is an alternate URL for the /me endpoint.\r\n\r\nAny authenticated user.", + "operationId": "GetUsersMe", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "$ref": "#/components/schemas/UserAndWorkspace" } } } }, - "204": { - "description": "No Content" + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -43568,48 +41866,81 @@ "v1" ], "x-access": { - "owner": "true" + "any": "true" } } }, - "/users/{userId}/timetracking/start": { - "post": { + "/users/projecttimebookings": { + "get": { "tags": [ - "TimeTracking" + "TimeBookings" ], - "summary": "Starts a new time tracking for a user.", - "description": "If there is already a running/paused time tracking it will be stopped automatically in order to start the new one.\r\n\r\nThe user must be an admin or the creator.", - "operationId": "PostStartTimeTrackingByUserId", + "summary": "Returns the time bookings in a specified time range for a list of users.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetProjectTimeBookingsForUsers", "parameters": [ { - "name": "userId", - "in": "path", - "description": "The id of the user.", + "name": "userIds", + "in": "query", + "description": "The ids of the users.", "required": true, "schema": { "type": "string", - "format": "uuid" + "description": "This class is used to bind a querystring list of Guid (as a comma-separated list) to the List of Guid parameter in a\nminimal API endpoint.", + "example": "123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001" } - } - ], - "requestBody": { - "description": "The model describing the time tracking to start.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StartTimeTrackingForm" - } + }, + { + "name": "intervalStart", + "in": "query", + "description": "The start of the interval.", + "required": true, + "schema": { + "type": "string", + "format": "date" } }, - "required": true - }, + { + "name": "intervalEnd", + "in": "query", + "description": "The end of the interval.", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "type": "array", + "items": { + "$ref": "#/components/schemas/GetTimeBookingForUsersResult" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -43626,53 +41957,31 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true" + "any": "true" } } }, - "/users/{userId}/timetracking/stop": { - "post": { + "/users/tags": { + "get": { "tags": [ - "TimeTracking" - ], - "summary": "Stops the currently running time tracking of the specified user.", - "description": "The request body is optional. You can provide a stopReason to indicate how the tracking was stopped.\r\n For external API clients, the stopReason is automatically set to \"external-api\" regardless of what is provided.\r\n For this operation to work there must be a running time tracking for the user.\r\n\r\nThe user must be an admin or the creator.", - "operationId": "PostStopTimeTrackingByUserId", - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "The id of the user.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "UserTags" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StopTimeTrackingForm" - } - } - } - }, + "summary": "Returns all tags that are currently in use.", + "description": "Returns all tags that are currently in use ordered by count.\r\n\r\nAny authenticated user.", + "operationId": "GetUsersTags", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TimeTracking" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } } } } - }, - "204": { - "description": "No Content" } }, "security": [ @@ -43686,31 +41995,49 @@ "v1" ], "x-access": { - "admin": "true", - "owner": "true" + "any": "true" } } }, - "/webhooks": { + "/users/timebookings": { "get": { "tags": [ - "Webhooks" + "TimeBookings" ], - "summary": "Returns all configured webhooks.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetWebhooks", + "summary": "Returns the time bookings in a specified time range for a list of users.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetUsersTimeBookings", "parameters": [ { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" + "name": "userIds", + "in": "query", + "description": "The ids of the users.", + "required": true, + "schema": { + "type": "string", + "description": "This class is used to bind a querystring list of Guid (as a comma-separated list) to the List of Guid parameter in a\nminimal API endpoint.", + "example": "123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001" + } }, { - "$ref": "#/components/parameters/orderby" + "name": "intervalStart", + "in": "query", + "description": "The start of the interval.", + "required": true, + "schema": { + "type": "string", + "format": "date" + } }, { - "$ref": "#/components/parameters/filterby" + "name": "intervalEnd", + "in": "query", + "description": "The end of the interval.", + "required": true, + "schema": { + "type": "string", + "format": "date" + } } ], "responses": { @@ -43721,11 +42048,31 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/WebhookConfig" + "$ref": "#/components/schemas/GetTimeBookingForUsersResult" } } } } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -43739,22 +42086,23 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } - }, + } + }, + "/users/updatetags": { "post": { "tags": [ - "Webhooks" + "UserTags" ], - "summary": "Creates a new webhook.", - "description": "The receiver type is inferred from the URI. All unknown receivers are treated as 'custom'.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PostWebhook", + "summary": "Updates a tag globally for all users.", + "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", + "operationId": "PostUsersUpdateTags", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookConfigForm" + "$ref": "#/components/schemas/TagUpdateForm" } } }, @@ -43762,17 +42110,20 @@ }, "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookConfig" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -43794,18 +42145,79 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "user-master-data": "write" } } }, - "/webhooks/eventtypes": { + "/users/workload": { "get": { "tags": [ - "Webhooks" + "Workload" + ], + "summary": "Returns the users' workloads per day.", + "description": "Returns the users' workloads per day for projects, tasks, task schedules and calendar events\r\n that have an overlap with the interval specified by intervalStart and intervalEnd.\r\n Takes into consideration weekly availability, absences, user capacity, planned efforts, as well as project budget.\r\n\r\nThe user must be an admin or have `user-planning-data:read` permissions.", + "operationId": "GetUsersWorkload", + "parameters": [ + { + "name": "userIds", + "in": "query", + "description": "The ids of the users to get the workload for, as a comma-separated list of Guids.", + "required": true, + "schema": { + "type": "string", + "description": "This class is used to bind a querystring list of Guid (as a comma-separated list) to the List of Guid parameter in a\nminimal API endpoint.", + "example": "123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001" + } + }, + { + "name": "intervalStart", + "in": "query", + "description": "The start of the interval to filter by.", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "intervalEnd", + "in": "query", + "description": "The end of the interval to filter by.", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "roughPlanningFrom", + "in": "query", + "description": "The number of days from today when the rough planning should start.", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "fetchDetails", + "in": "query", + "description": "(Optional - default: false) If set to true, the result will contain the hierarchy of elements that are contributing\n to the workload (projects, tasks, appointments).\n Otherwise it will return only the workload value.\n Works only for single day queries.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "ignoreCalendarEvents", + "in": "query", + "description": "Whether to ignore calendar events. Can significantly improve performance.", + "schema": { + "type": "boolean", + "default": false + } + } ], - "summary": "Returns all available event types.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetWebhookEventTypes", "responses": { "200": { "description": "OK", @@ -43814,46 +42226,28 @@ "schema": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/GetWorkloadForUsersResult" } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/webhooks/eventtypes/slack": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "Returns all available event types for Slack webhooks.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetSlackEventTypes", - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - } + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -43870,22 +42264,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "user-planning-data": "read" } } }, - "/webhooks/{webhookId}": { + "/users/{userId}": { "delete": { "tags": [ - "Webhooks" + "Users" ], - "summary": "Deletes the webhook with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "DeleteWebhook", + "summary": "Deletes the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `user-manage-config:delete` permissions.", + "operationId": "DeleteUserById", "parameters": [ { - "name": "webhookId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -43897,6 +42293,16 @@ "204": { "description": "No Content" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "404": { "description": "Not Found", "content": { @@ -43920,20 +42326,21 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "user-manage-config": "delete" } }, "get": { "tags": [ - "Webhooks" + "Users" ], - "summary": "Returns the webhook with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetWebhook", + "summary": "Returns the user with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetUserById", "parameters": [ { - "name": "webhookId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -43947,7 +42354,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookConfig" + "$ref": "#/components/schemas/User" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -43974,21 +42391,21 @@ "v1" ], "x-access": { - "admin": "true", - "workspace-manage-config": "read" + "any": "true" } }, "put": { "tags": [ - "Webhooks" + "Users" ], - "summary": "Updates the webhook with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", - "operationId": "PutWebhook", + "summary": "Updates the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", + "operationId": "PutUserById", "parameters": [ { - "name": "webhookId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -43997,10 +42414,11 @@ } ], "requestBody": { + "description": "The model to update the user.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookConfigForm" + "$ref": "#/components/schemas/UserForm" } } }, @@ -44012,17 +42430,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookConfig" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/User" } } } @@ -44050,51 +42458,51 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "write" + "owner": "true", + "user-master-data": "write" } } }, - "/webhooks/{webhookId}/logs": { - "get": { + "/users/{userId}/activate": { + "post": { "tags": [ - "Webhooks" + "Users" ], - "summary": "Returns all logs of the webhook with the specified id.", - "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", - "operationId": "GetWebhookLogs", + "summary": "Activates the user with the specified id.", + "description": "The user is then allowed to sign in again and will be notified via email.\r\n\r\nThe user must be an admin or have `user-manage-config:write` permissions.", + "operationId": "PostUserActivateByUserId", "parameters": [ { - "name": "webhookId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/WebhookLog" - } + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -44122,81 +42530,39 @@ ], "x-access": { "admin": "true", - "workspace-manage-config": "read" + "user-manage-config": "write" } } }, - "/workflows": { - "get": { + "/users/{userId}/addtags": { + "post": { "tags": [ - "Workflows" + "UserTags" ], - "summary": "Retrieves all workflows.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetWorkflows", + "summary": "Adds a batch of tags to the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", + "operationId": "PostUserAddTagsByUserId", "parameters": [ { - "name": "showArchived", - "in": "query", + "name": "userId", + "in": "path", + "description": "The id of the user to add tags to.", + "required": true, "schema": { - "type": "boolean", - "default": false - } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Workflow" - } - } - } + "type": "string", + "format": "uuid" } } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - }, - "post": { - "tags": [ - "Workflows" ], - "summary": "Creates a new workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflow", "requestBody": { + "description": "The model with the tags to be added.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WorkflowForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/TagForm" + } } } }, @@ -44208,7 +42574,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Workflow" + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } } } } @@ -44222,6 +42591,16 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -44236,28 +42615,42 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "user-master-data": "write" } } }, - "/workflows/automations/copy": { - "post": { + "/users/{userId}/allavailabletasks": { + "get": { "tags": [ - "Workflow Automations" + "AssignedTasks" ], - "summary": "Copies automations from one workflow to another.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostCopyWorkflowAutomations", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CopyWorkflowAutomationsForm" - } + "summary": "Returns all tasks the specified user is allowed to see.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetUserAllAvailableTasksByUserId", + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], "responses": { "200": { "description": "OK", @@ -44266,7 +42659,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/TaskModel" } } } @@ -44284,28 +42677,67 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}": { + "/users/{userId}/assignedtasks": { "get": { "tags": [ - "Workflows" + "AssignedTasks" ], - "summary": "Retrieves a specified workflow.", + "summary": "Returns all tasks assigned to the specified user.", "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetWorkflowById", + "operationId": "GetUserAssignedTasksByUserId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user to get the tasks for.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "inProgress", + "in": "query", + "description": "Whether to return only assigned project tasks of running projects. Defaults to true.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "assignedOnFrom", + "in": "query", + "description": "The start date for filtering by assignment date. If set, tasks are returned only when the assignment date is greater or equal than this value.", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "assignedOnTo", + "in": "query", + "description": "The end date for filtering by assignment date. If set, tasks are returned only when the assignment date is less or equal than this value.", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -44314,17 +42746,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Workflow" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskModel" + } } } } @@ -44343,18 +42768,31 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/users/{userId}/assignedtasks/{taskId}": { + "get": { "tags": [ - "Workflows" + "AssignedTasks" ], - "summary": "Updates a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutWorkflowById", + "summary": "Returns the assigned task with the specified id of a specified user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetUserAssignedTaskByUserIdAndTaskId", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", "in": "path", + "description": "The id of the task to return.", "required": true, "schema": { "type": "string", @@ -44362,29 +42800,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WorkflowForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Workflow" + "$ref": "#/components/schemas/TaskModel" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -44415,23 +42843,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/automations": { + "/users/{userId}/capacity": { "get": { "tags": [ - "Workflow Automations" + "UserCapacities" ], - "summary": "Retrieves automations of the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetWorkflowAutomations", + "summary": "Returns the capacity of the specified user.", + "description": "Returns the capacity of the specified user.\r\n User planning data or admin permissions are required if the capacity of the specified user\r\n does not belong to the calling user.\r\n\r\nAny authenticated user.", + "operationId": "GetUserCapacityByUserId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -44445,10 +42873,17 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Automation" - } + "$ref": "#/components/schemas/UserCapacity" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -44465,21 +42900,21 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "read" + "any": "true" } }, - "post": { + "put": { "tags": [ - "Workflow Automations" + "UserCapacities" ], - "summary": "Creates a new automation for a workflow.", - "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowAutomation", + "summary": "Updates the capacity of the specified user.", + "description": "Updates the capacity of the user with the specified id.\r\n User planning data or admin permissions are required if the capacity of the specified user\r\n does not belong to the calling user.\r\n\r\nAny authenticated user.", + "operationId": "PutUserCapacityByUserId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The user whose capacity should be updated.", "required": true, "schema": { "type": "string", @@ -44488,10 +42923,11 @@ } ], "requestBody": { + "description": "Updated capacity values for each day of the week.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AutomationTriggerForm" + "$ref": "#/components/schemas/UserCapacityForm" } } }, @@ -44503,13 +42939,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/UserCapacity" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -44530,26 +42966,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" - }, - "x-subscriptionlevel": { - "minimumPlan": "standard" + "any": "true" } } }, - "/workflows/{workflowId}/automations/{automationId}": { - "delete": { + "/users/{userId}/contactinfo": { + "get": { "tags": [ - "Workflow Automations" + "Users" ], - "summary": "Deletes a workflow automation by id.", - "description": "Requires specifying whether to delete or unlink synced automations on linked projects/templates.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteWorkflowAutomation", + "summary": "Returns the contact infos of the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:read` permissions.", + "operationId": "GetUserContactInfoByUserId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -44557,28 +42990,34 @@ } }, { - "name": "automationId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "deleteSyncedAutomations", - "in": "query", - "schema": { - "type": "boolean" - } + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ContactInfo" + } + } + } + } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -44600,29 +43039,22 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "owner": "true", + "user-master-data": "read" } }, - "get": { + "post": { "tags": [ - "Workflow Automations" + "Users" ], - "summary": "Retrieves a specific automation of the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetWorkflowAutomation", + "summary": "Creates a new contact info for the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", + "operationId": "PostUserContactInfoByUserId", "parameters": [ { - "name": "workflowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", + "name": "userId", "in": "path", + "description": "The user to add contact information to.", "required": true, "schema": { "type": "string", @@ -44630,13 +43062,24 @@ } } ], + "requestBody": { + "description": "The model containing contact information details including address, phone number, and type.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContactInfoFormForUsers" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Automation" + "$ref": "#/components/schemas/ContactInfo" } } } @@ -44664,20 +43107,24 @@ ], "x-access": { "admin": "true", - "project-manage-config": "read" + "owner": "true", + "user-master-data": "write" } - }, - "put": { + } + }, + "/users/{userId}/contactinfo/{contactInfoId}": { + "delete": { "tags": [ - "Workflow Automations" + "Users" ], - "summary": "Updates an automation of the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutWorkflowAutomation", + "summary": "Deletes the contact info of the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", + "operationId": "DeleteUserContactInfoByUserIdAndContactInfoId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -44685,8 +43132,9 @@ } }, { - "name": "automationId", + "name": "contactInfoId", "in": "path", + "description": "The id of the contact info.", "required": true, "schema": { "type": "string", @@ -44694,26 +43142,9 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationPutForm" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Automation" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad Request", @@ -44748,22 +43179,22 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "owner": "true", + "user-master-data": "write" } - } - }, - "/workflows/{workflowId}/automations/{automationId}/actions": { + }, "get": { "tags": [ - "Workflow Automations" + "Users" ], - "summary": "Gets all actions of an automation of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetWorkflowActions", + "summary": "Returns the contact info of the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:read` permissions.", + "operationId": "GetUserContactInfoByUserIdAndContactInfoId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -44771,8 +43202,9 @@ } }, { - "name": "automationId", + "name": "contactInfoId", "in": "path", + "description": "The id of the contact info.", "required": true, "schema": { "type": "string", @@ -44786,10 +43218,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Action" - } + "$ref": "#/components/schemas/ContactInfo" } } } @@ -44817,20 +43246,22 @@ ], "x-access": { "admin": "true", - "project-manage-config": "read" + "owner": "true", + "user-master-data": "read" } }, - "post": { + "put": { "tags": [ - "Workflow Automations" + "Users" ], - "summary": "Creates a new action for an automation of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowAction", + "summary": "Updates the contact info of the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or the creator or have `user-master-data:write` permissions.", + "operationId": "PutUserContactInfoByUserIdAndContactInfoId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -44838,8 +43269,9 @@ } }, { - "name": "automationId", + "name": "contactInfoId", "in": "path", + "description": "The id of the contact info.", "required": true, "schema": { "type": "string", @@ -44848,10 +43280,11 @@ } ], "requestBody": { + "description": "The contact info model.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionForm" + "$ref": "#/components/schemas/ContactInfoFormForUsers" } } }, @@ -44863,7 +43296,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/ContactInfo" } } } @@ -44901,31 +43334,24 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" - } + "owner": "true", + "user-master-data": "write" + } } }, - "/workflows/{workflowId}/automations/{automationId}/actions/{actionId}": { - "delete": { + "/users/{userId}/deactivate": { + "post": { "tags": [ - "Workflow Automations" + "Users" ], - "summary": "Deletes an action from an automation of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "DeleteWorkflowAction", + "summary": "Deactivates the user with the specified id.", + "description": "A deactivated user can no longer sign in.\r\n This is only possible if the user is not the last admin user.\r\n\r\nThe user must be an admin or have `user-manage-config:write` permissions.", + "operationId": "PostUserDeactivateByUserId", "parameters": [ { - "name": "workflowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -44933,21 +43359,31 @@ } }, { - "name": "actionId", - "in": "path", - "required": true, + "name": "includeSummary", + "in": "query", + "description": "Whether to return the private project orphan resolution summary.", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } } ], "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUserDeactivateByUserIdResponse" + } + } + } + }, "204": { "description": "No Content" }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { @@ -44955,66 +43391,13 @@ } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "project-manage-config": "write" - } - }, - "get": { - "tags": [ - "Workflow Automations" - ], - "summary": "Gets a specific action of an automation of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", - "operationId": "GetWorkflowAction", - "parameters": [ - { - "name": "workflowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "actionId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Action" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -45042,38 +43425,23 @@ ], "x-access": { "admin": "true", - "project-manage-config": "read" + "user-manage-config": "write" } - }, - "put": { + } + }, + "/users/{userId}/deletetags": { + "post": { "tags": [ - "Workflow Automations" + "UserTags" ], - "summary": "Updates an action of an automation of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutWorkflowAction", + "summary": "Removes tags from the user with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `user-master-data:write` permissions.", + "operationId": "PostUserDeleteTagsByUserId", "parameters": [ { - "name": "workflowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "actionId", + "name": "userId", "in": "path", + "description": "The id of the user whose tags should be removed.", "required": true, "schema": { "type": "string", @@ -45082,45 +43450,25 @@ } ], "requestBody": { + "description": "The model with the tags to be removed.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/DeleteTagForm" + } } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Action" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "207": { + "description": "Multi-Status" } }, "security": [ @@ -45135,40 +43483,23 @@ ], "x-access": { "admin": "true", - "project-manage-config": "write" + "user-master-data": "write" } } }, - "/workflows/{workflowId}/automations/{automationId}/actions/{actionId}/updateorder": { + "/users/{userId}/externalfiles": { "post": { "tags": [ - "Workflow Automations" + "UserFiles" ], - "summary": "Updates the order of an action within an automation of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostUpdateWorkflowActionOrder", + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", "parameters": [ { - "name": "workflowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "automationId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "actionId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45177,25 +43508,33 @@ } ], "requestBody": { + "description": "List of file forms.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateOrderForm" + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -45212,23 +43551,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/copy": { - "post": { + "/users/{userId}/files": { + "delete": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Creates a copy of an existing workflow.", - "description": "Creates a new workflow with the same properties as the original.\r\n The new workflow will have a unique name with \" (Copy)\" appended.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowCopyByWorkflowId", + "summary": "Deletes the files of the specified user.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteUserFiles", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45237,25 +43576,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Workflow" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -45269,29 +43591,38 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - } - }, - "/workflows/{workflowId}/customfielddefinitions": { + }, "get": { "tags": [ - "CustomFields" + "UserFiles" ], - "summary": "Returns all custom field definitions linked to a workflow.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetWorkflowCustomFieldDefinitionsByWorkflowId", + "summary": "Returns all files of the user with the specified id.", + "description": "Returns all file metadata of the user with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetUserFiles", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", - "description": "The id of the workflow.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -45302,21 +43633,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" + "$ref": "#/components/schemas/FileInfo" } } } } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -45332,31 +43653,19 @@ "x-access": { "any": "true" } - } - }, - "/workflows/{workflowId}/customfielddefinitions/{customFieldDefinitionId}": { - "put": { + }, + "post": { "tags": [ - "CustomFields" + "UserFiles" ], - "summary": "Updates the order of a custom field definition linked to a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutWorkflowCustomFieldDefinitionByWorkflowIdAndCustomFieldDefinitionId", + "summary": "Creates a new user file for the user with the specified id..", + "description": "Uploads a new user file for the user with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateUserFile", "parameters": [ { - "name": "workflowId", - "in": "path", - "description": "The workflow Id.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "customFieldDefinitionId", + "name": "userId", "in": "path", - "description": "The custom field definition Id.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45365,15 +43674,27 @@ } ], "requestBody": { - "description": "The order update form.", "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/CustomFieldOrderPutForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -45381,20 +43702,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomFieldOrderForm" + "$ref": "#/components/schemas/FileInfo" } } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "400": { + "description": "Bad Request" } }, "security": [ @@ -45408,23 +43722,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/delete": { + "/users/{userId}/files/byurl": { "post": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Deletes a workflow.", - "description": "If the workflow is linked to projects or project templates they can either be unlinked\r\n or migrated to another workflow before the workflow is deleted.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowDeleteByWorkflowId", + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateUserFileByUrl", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user the file is linked to.", "required": true, "schema": { "type": "string", @@ -45433,35 +43747,27 @@ } ], "requestBody": { + "description": "The url, name and description of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteWorkflowForm" + "$ref": "#/components/schemas/FilePostForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -45478,23 +43784,33 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/linkcustomfielddefinition": { - "post": { + "/users/{userId}/files/{fileId}": { + "delete": { "tags": [ - "CustomFields" + "UserFiles" ], - "summary": "Links a custom field definition to a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowLinkCustomFieldDefinitionByWorkflowId", + "summary": "Deletes the user file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteUserFile", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -45502,39 +43818,9 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LinkCustomFieldDefinitionForm" - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -45548,23 +43834,21 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } - } - }, - "/workflows/{workflowId}/projectstatuses": { + }, "get": { "tags": [ - "Workflows" + "User Files" ], - "summary": "Returns all project statuses of the workflow with the specified id.", - "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", - "operationId": "GetWorkflowProjectStatusesByWorkflowId", + "summary": "Returns the file with the specified id of the user with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByUserNameAndUserIdAndFileId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45572,16 +43856,14 @@ } }, { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -45590,10 +43872,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectStatus" - } + "$ref": "#/components/schemas/FileInfo" } } } @@ -45633,17 +43912,28 @@ "any": "true" } }, - "post": { + "put": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Creates a new project status for the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowProjectStatusesByWorkflowId", + "summary": "Updates the metadata of the user file with the specified id.", + "description": "Updates the metadata of the user file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateUserFile", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -45652,14 +43942,19 @@ } ], "requestBody": { + "description": "The model to update the file with the specified id.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatusForm" + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -45667,27 +43962,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatus" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -45704,23 +43979,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/projectstatuses/{projectStatusId}": { - "get": { + "/users/{userId}/files/{fileId}/changeentity": { + "post": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Returns the project status of the workflow with the specified id.", - "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", - "operationId": "GetWorkflowProjectStatusByWorkflowIdAndProjectStatusId", + "summary": "Changes the user this file belongs to.", + "description": "Changes the user this file belongs to.\nSwitch to the specified user or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeUser", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45728,8 +44003,9 @@ } }, { - "name": "projectStatusId", + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -45737,33 +44013,28 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectStatus" - } + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" } } - }, - "404": { - "description": "Not Found", + } + }, + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -45782,18 +44053,21 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/users/{userId}/files/{fileId}/copy": { + "post": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Updates a project status for the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutWorkflowProjectStatusByWorkflowIdAndProjectStatusId", + "summary": "Copies the file to a new user.", + "description": "Copies the file to a new user (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToUser", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45801,8 +44075,9 @@ } }, { - "name": "projectStatusId", + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -45811,14 +44086,19 @@ } ], "requestBody": { + "description": "The model to change the entity information of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatusForm" + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" } } - }, - "required": true + } }, "responses": { "200": { @@ -45826,27 +44106,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectStatus" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/FileInfo" } } } @@ -45863,24 +44123,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/projectstatuses/{projectStatusId}/delete": { - "post": { + "/users/{userId}/files/{fileId}/download": { + "get": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Deletes a project status from the workflow.", - "description": "A workflow must always have at least one project status to ensure projects\r\n using this workflow have a valid status. If you attempt to delete the last\r\n remaining project status, this endpoint will return a BadRequest error.\r\n \r\n If any projects are currently using this status, you must provide a\r\n NewProjectStatusId in the request body to migrate those projects to a\r\n different status within the same workflow.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowProjectStatusDeleteByWorkflowIdAndProjectStatusId", + "summary": "Returns the content of the user file with the specified id.", + "description": "Returns the content of the user file. Uses the latest file version.\nIf the user file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetUserFileContent", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", - "description": "The Id of the workflow.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -45888,47 +44147,50 @@ } }, { - "name": "projectStatusId", + "name": "fileId", "in": "path", - "description": "The Id of the project status to delete.", + "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "description": "Optional form containing the new status Id for migration.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteWorkflowProjectStatusForm" - } - } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + { + "name": "width", + "in": "query", + "description": "Set width to resize.", + "schema": { + "type": "number", + "format": "double" + } }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "height", + "in": "query", + "description": "Set height to resize.", + "schema": { + "type": "number", + "format": "double" } }, - "404": { - "description": "Not Found", + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string", + "format": "binary" } } } @@ -45945,67 +44207,114 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/setarchived": { - "post": { + "/users/{userId}/files/{fileId}/pdf": { + "get": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Sets the archived status of a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowSetArchivedByWorkflowId", + "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", + "description": "Returns the content of the user file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetUserFileContent", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ArchivedForm" - } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "inline", + "in": "query", + "description": "If inline is false, content-disposition header is attachment.", + "schema": { + "type": "boolean", + "default": false + } + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Workflow" + "type": "string", + "format": "binary" } } } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/users/{userId}/files/{fileId}/shareurl": { + "get": { + "tags": [ + "UserFiles" + ], + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "404": { - "description": "Not Found", + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "string" } } } @@ -46022,23 +44331,33 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/taskstatuses": { + "/users/{userId}/files/{fileId}/versions": { "get": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Returns all task statuses of the workflow with the specified id.", - "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", - "operationId": "GetWorkflowTaskStatusesByWorkflowId", + "summary": "Returns all file versions of the specified user file.", + "description": "Returns all file versions of the specified user file.\r\n\r\nAny authenticated user.", + "operationId": "GetUserFileVersions", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -46066,31 +44385,11 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/FileVersion" } } } } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } } }, "security": [ @@ -46109,15 +44408,26 @@ }, "post": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Creates a new task status for the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowTaskStatusesByWorkflowId", + "summary": "Uploads a new version of the user file with the specified id.", + "description": "Uploads a new version of an user file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateUserFileVersion", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", @@ -46127,13 +44437,26 @@ ], "requestBody": { "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/TaskStatusForm" + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } } } - }, - "required": true + } }, "responses": { "200": { @@ -46141,30 +44464,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/FileVersion" } } } }, "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "description": "Bad Request" } }, "security": [ @@ -46178,23 +44484,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/taskstatuses/{taskStatusId}": { + "/users/{userId}/files/{fileId}/versions/{versionId}": { "get": { "tags": [ - "Workflows" + "User Files" ], - "summary": "Returns the task status of the workflow with the specified id.", - "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", - "operationId": "GetWorkflowTaskStatusByWorkflowIdAndTaskStatusId", + "summary": "Returns the user file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByUserNameAndUserIdAndFileIdAndVersionId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -46202,22 +44508,33 @@ } }, { - "name": "taskStatusId", + "name": "fileId", "in": "path", + "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "responses": { - "200": { + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" + "$ref": "#/components/schemas/FileVersion" } } } @@ -46256,18 +44573,21 @@ "x-access": { "any": "true" } - }, - "put": { + } + }, + "/users/{userId}/files/{fileId}/versions/{versionId}/download": { + "get": { "tags": [ - "Workflows" + "UserFiles" ], - "summary": "Updates a task status for the specified workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PutWorkflowTaskStatusByWorkflowIdAndTaskStatusId", + "summary": "Returns the content of the user file version with the specified id.", + "description": "Returns the content of the user file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetUserFileVersionContent", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -46275,8 +44595,19 @@ } }, { - "name": "taskStatusId", + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", "in": "path", + "description": "The id of the file version.", "required": true, "schema": { "type": "string", @@ -46284,29 +44615,82 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskStatusForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } } } - }, - "required": true + } }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/users/{userId}/otherprivatetasks": { + "get": { + "tags": [ + "PrivateTasks" + ], + "summary": "Returns all private tasks that a user created and assigned to someone else.", + "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns all private tasks that were originally created by the user but were reassigned to someone else.\r\n\r\nAny authenticated user.", + "operationId": "GetUserOtherPrivateTasksByUserId", + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The id of the user that created the private tasks.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TaskStatus" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskModel" + } } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -46337,24 +44721,23 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/taskstatuses/{taskStatusId}/delete": { - "post": { + "/users/{userId}/otherprivatetasks/{taskId}": { + "get": { "tags": [ - "Workflows" + "PrivateTasks" ], - "summary": "Deletes the task status of the workflow with the specified id.", - "description": "A workflow must always have at least one task status of type 'todo' and one\r\n of type 'done'. If you attempt to delete the last status of either type,\r\n this endpoint will return a BadRequest error.\r\n \r\n If any tasks are currently using this status, you must provide a\r\n NewTaskStatusId in the request body to migrate those tasks to a\r\n different status within the same workflow.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowTaskStatusDeleteByWorkflowIdAndTaskStatusId", + "summary": "Returns a private task that a user created and assigned to someone else.", + "description": "Private tasks are always created for the current user but can be reassigned to other users afterwards.\r\n This endpoint returns a private task that was originally created by the user but was reassigned to someone else.\r\n\r\nAny authenticated user.", + "operationId": "GetUserOtherPrivateTaskByUserIdAndTaskId", "parameters": [ { - "name": "workflowId", + "name": "userId", "in": "path", - "description": "The Id of the workflow.", + "description": "The id of the user the task is assigned to.", "required": true, "schema": { "type": "string", @@ -46362,9 +44745,9 @@ } }, { - "name": "taskStatusId", + "name": "taskId", "in": "path", - "description": "The Id of the task status to delete.", + "description": "The id of the task to return.", "required": true, "schema": { "type": "string", @@ -46372,23 +44755,19 @@ } } ], - "requestBody": { - "description": "Optional form containing the new status Id for migration.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteWorkflowTaskStatusForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskModel" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -46419,23 +44798,33 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/unlinkcustomfielddefinition": { - "post": { + "/users/{userId}/otherprivatetasks/{taskId}/checklistitems": { + "get": { "tags": [ - "CustomFields" + "ChecklistItems" ], - "summary": "Unlinks a custom field definition from a workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowUnlinkCustomFieldDefinitionByWorkflowId", + "summary": "Returns the checklist items for a private task with the specified id.", + "description": "The user must be the creator of the task.", + "operationId": "GetUserOtherPrivateTaskChecklistItemsByUserIdAndTaskId", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", "in": "path", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -46443,22 +44832,22 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnlinkWorkflowCustomFieldDefinitionForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChecklistItem" + } + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -46489,23 +44878,43 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workflows/{workflowId}/updateprojectstatusorder": { - "post": { + "/users/{userId}/otherprivatetasks/{taskId}/checklistitems/{checklistItemId}": { + "get": { "tags": [ - "Workflows" + "ChecklistItems" ], - "summary": "Updates the order of a project status in the workflow.", - "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", - "operationId": "PostWorkflowUpdateProjectStatusOrderByWorkflowId", + "summary": "Returns a checklist item for a private task with the specified id.", + "description": "The user must be the creator of the task.", + "operationId": "GetUserOtherPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", "parameters": [ { - "name": "workflowId", + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemId", "in": "path", + "description": "The id of the checklist item.", "required": true, "schema": { "type": "string", @@ -46513,22 +44922,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateProjectStatusOrderForm" + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChecklistItem" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -46559,20 +44965,29 @@ "v1" ], "x-access": { - "admin": "true", - "project-manage-config": "write" + "any": "true" } } }, - "/workspaceabsences": { + "/users/{userId}/privatetasks": { "get": { "tags": [ - "WorkspaceAbsences" + "PrivateTasks" ], - "summary": "Gets all workspace absences.", - "description": "Gets all workspace absences. The result can be filtered, sorted, and paged.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", - "operationId": "GetWorkspaceAbsences", + "summary": "Returns all private tasks of the user with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetUserPrivateTasksByUserId", "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The id of the user to fetch private tasks for.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, { "$ref": "#/components/parameters/page" }, @@ -46594,59 +45009,24 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/WorkspaceAbsenceModel" + "$ref": "#/components/schemas/TaskModel" } } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "admin": "true", - "user-planning-data": "write" - } - }, - "post": { - "tags": [ - "WorkspaceAbsences" - ], - "summary": "Creates a new workspace absence.", - "description": "Creates a new workspace absence.\r\n A workspace absence is a kind of absence that is applied to all users in a workspace.\r\n It can be used to define special holidays (e.g: company offsite) that apply to all users in a workspace.\r\n It can be limited to a specific absence region, in which case only users in that region will be affected.\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", - "operationId": "PostWorkspaceAbsence", - "requestBody": { - "description": "Workspace absence details including start date, end date, description, and optional region.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WorkspaceAbsenceForm" - } - } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WorkspaceAbsenceModel" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -46667,44 +45047,52 @@ "v1" ], "x-access": { - "admin": "true", - "user-planning-data": "write" - }, - "x-subscriptionlevel": { - "minimumPlan": "standard" + "any": "true" } } }, - "/workspaceabsences/{workspaceAbsenceId}": { - "delete": { + "/users/{userId}/privatetasks/taskstatuses": { + "get": { "tags": [ - "WorkspaceAbsences" + "PrivateTasks" ], - "summary": "Deletes a workspace absence.", - "description": "Deletes a workspace absence.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", - "operationId": "DeleteWorkspaceAbsenceById", + "summary": "Returns the task statuses for private tasks for the specified user.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetPrivateTaskStatusesByUserId", "parameters": [ { - "name": "workspaceAbsenceId", + "name": "userId", "in": "path", - "description": "The workspace absence to delete.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { - "204": { - "description": "No Content" - }, - "404": { - "description": "Not Found", + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskStatus" + } } } } @@ -46721,22 +45109,33 @@ "v1" ], "x-access": { - "admin": "true", - "user-planning-data": "write" + "any": "true" } - }, - "put": { + } + }, + "/users/{userId}/privatetasks/{taskId}": { + "get": { "tags": [ - "WorkspaceAbsences" + "PrivateTasks" ], - "summary": "Updates a workspace absence.", - "description": "Updates a workspace absence.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", - "operationId": "PutWorkspaceAbsenceById", + "summary": "Returns the private task of a user with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetUserPrivateTaskByUserIdAndTaskId", "parameters": [ { - "name": "workspaceAbsenceId", + "name": "userId", "in": "path", - "description": "The workspace absence to update.", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", "required": true, "schema": { "type": "string", @@ -46744,30 +45143,19 @@ } } ], - "requestBody": { - "description": "Updated workspace absence details including start date, end date, description, and optional region.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WorkspaceAbsenceForm" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WorkspaceAbsenceModel" + "$ref": "#/components/schemas/TaskModel" } } } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "content": { "application/json": { "schema": { @@ -46798,19 +45186,40 @@ "v1" ], "x-access": { - "admin": "true", - "user-planning-data": "write" + "any": "true" } } }, - "/workspaces/types": { + "/users/{userId}/privatetasks/{taskId}/checklistitems": { "get": { "tags": [ - "Workspaces" + "ChecklistItems" + ], + "summary": "Returns the checklist for a private task with the specified id.", + "description": "The user must be be assigned to the task.", + "operationId": "GetUserPrivateTaskChecklistItemsByUserIdAndTaskId", + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Returns all available workspace types.", - "description": "\r\n\r\nAllows unauthenticated access.", - "operationId": "GetWorkspacesTypes", "responses": { "200": { "description": "OK", @@ -46819,11 +45228,31 @@ "schema": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/ChecklistItem" } } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -46837,23 +45266,43 @@ "v1" ], "x-access": { - "anonymous": "true" + "any": "true" } } }, - "/workspaces/{workspaceId}": { + "/users/{userId}/privatetasks/{taskId}/checklistitems/{checklistItemId}": { "get": { "tags": [ - "Workspaces" + "ChecklistItems" ], - "summary": "Returns the workspace with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetWorkspacesByWorkspaceId", - "parameters": [ + "summary": "Retrieves a checklist item from a private task.", + "description": "The user must be assigned to the task.", + "operationId": "GetUserPrivateTaskChecklistItemByUserIdAndTaskIdAndChecklistItemId", + "parameters": [ { - "name": "workspaceId", + "name": "userId", "in": "path", - "description": "The id of the workspace.", + "description": "The id of the user.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskId", + "in": "path", + "description": "The id of the task.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "checklistItemId", + "in": "path", + "description": "The id of the checklist item to retrieve.", "required": true, "schema": { "type": "string", @@ -46867,7 +45316,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Workspace" + "$ref": "#/components/schemas/ChecklistItem" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -46898,19 +45357,19 @@ } } }, - "/workspaces/{workspaceId}/externalfiles": { + "/users/{userId}/setarchived": { "post": { "tags": [ - "WorkspaceFiles" + "Users" ], - "summary": "Endpoint to batch create external files without uploading.", - "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", - "operationId": "CreateExternalFiles", + "summary": "Archives or unarchives the user with the specified id.", + "description": "Archived objects can not be used any longer but still exist for being referenced by other entities.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostUserSetArchivedByUserId", "parameters": [ { - "name": "workspaceId", + "name": "userId", "in": "path", - "description": "The id of the workspace.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -46919,25 +45378,15 @@ } ], "requestBody": { - "description": "List of file forms.", + "description": "The model to archive or unarchive the user.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ExternalFileForm" - } + "$ref": "#/components/schemas/ArchivedForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -46945,7 +45394,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/ExtendedUser" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -46962,23 +45431,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "project-manage-config": "write" } } }, - "/workspaces/{workspaceId}/files": { - "delete": { + "/users/{userId}/tags": { + "get": { "tags": [ - "WorkspaceFiles" + "UserTags" ], - "summary": "Deletes the files of the specified workspace.", - "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", - "operationId": "DeleteWorkspaceFiles", + "summary": "Returns the tags of the users with the specified id.", + "description": "Returns the tags of the user with the specified id ordered by name.\r\n \r\n To read the tags of a user the user must have 'read' permissions on the specified user.", + "operationId": "GetUserTagsByUserId", "parameters": [ { - "name": "workspaceId", + "name": "userId", "in": "path", - "description": "The id of the workspace.", + "description": "The id of the user to get the tags for.", "required": true, "schema": { "type": "string", @@ -46987,8 +45457,38 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseTagModel" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } }, "security": [ @@ -47004,36 +45504,26 @@ "x-access": { "any": "true" } - }, + } + }, + "/users/{userId}/tasks/tags": { "get": { "tags": [ - "WorkspaceFiles" + "AssignedTasks" ], - "summary": "Returns all files of the workspace with the specified id.", - "description": "Returns all file metadata of the workspace with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetWorkspaceFiles", + "summary": "Returns all task tags the specified user is allowed to see.", + "description": "The tags can be filtered by the properties of the task model.\r\n\r\nAny authenticated user.", + "operationId": "GetUserTasksTagsByUserId", "parameters": [ { - "name": "workspaceId", + "name": "userId", "in": "path", - "description": "The id of the workspace.", + "description": "The id of the user to get the tags for.", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "$ref": "#/components/parameters/page" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/orderby" - }, - { - "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -47044,7 +45534,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/BaseTagModel" } } } @@ -47064,19 +45554,21 @@ "x-access": { "any": "true" } - }, - "post": { + } + }, + "/users/{userId}/timeentries/last": { + "get": { "tags": [ - "WorkspaceFiles" + "TimeEntries" ], - "summary": "Creates a new workspace file for the workspace with the specified id..", - "description": "Uploads a new workspace file for the workspace with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateWorkspaceFile", + "summary": "Returns the last time entry of a specified user.", + "description": "The last time entry is always the last one that was started.\r\n Time entries which are started in the future are ignored.\r\n If a time entry does not have a start time, 12.00 am is automatically assumed as the start time\r\n for comparison with other time entries from the same day.\r\n\r\nThe user must be an admin or the creator.", + "operationId": "GetLastTimeEntriesByUserId", "parameters": [ { - "name": "workspaceId", + "name": "userId", "in": "path", - "description": "The id of the workspace.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -47084,42 +45576,19 @@ } } ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeTracking" } } } }, - "400": { - "description": "Bad Request" + "204": { + "description": "No Content" } }, "security": [ @@ -47133,23 +45602,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "owner": "true" } } }, - "/workspaces/{workspaceId}/files/byurl": { + "/users/{userId}/timetracking/pause": { "post": { "tags": [ - "WorkspaceFiles" + "TimeTracking" ], - "summary": "Uploads a new file by providing an url.", - "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", - "operationId": "CreateWorkspaceFileByUrl", + "summary": "Pauses a running time tracking for a user.", + "description": "If there is already a paused time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", + "operationId": "PostPauseTimeTrackingByUserId", "parameters": [ { - "name": "workspaceId", + "name": "userId", "in": "path", - "description": "The id of the workspace the file is linked to.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -47157,79 +45627,17 @@ } } ], - "requestBody": { - "description": "The url, name and description of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FilePostForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeTracking" } } } - } - }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/workspaces/{workspaceId}/files/{fileId}": { - "delete": { - "tags": [ - "WorkspaceFiles" - ], - "summary": "Deletes the workspace file with the specified id.", - "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", - "operationId": "DeleteWorkspaceFile", - "parameters": [ - { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { "204": { "description": "No Content" } @@ -47245,31 +45653,23 @@ "v1" ], "x-access": { - "any": "true" + "owner": "true" } - }, - "get": { + } + }, + "/users/{userId}/timetracking/resume": { + "post": { "tags": [ - "Workspace Files" + "TimeTracking" ], - "summary": "Returns the file with the specified id of the workspace with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesByWorkspaceNameAndWorkspaceIdAndFileId", + "summary": "Resumes a paused time tracking for a user.", + "description": "If there is already a running time tracking nothing happens. If there is no running time tracking, returns NoContent.\r\n\r\nThe user must be the creator.", + "operationId": "PostResumeTimeTrackingByUserId", "parameters": [ { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "userId", "in": "path", - "description": "The id of the file.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -47283,30 +45683,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TimeTracking" } } } }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "204": { + "description": "No Content" } }, "security": [ @@ -47320,31 +45703,23 @@ "v1" ], "x-access": { - "any": "true" + "owner": "true" } - }, - "put": { + } + }, + "/users/{userId}/timetracking/start": { + "post": { "tags": [ - "WorkspaceFiles" + "TimeTracking" ], - "summary": "Updates the metadata of the workspace file with the specified id.", - "description": "Updates the metadata of the workspace file with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "UpdateWorkspaceFile", + "summary": "Starts a new time tracking for a user.", + "description": "If there is already a running/paused time tracking it will be stopped automatically in order to start the new one.\r\n\r\nThe user must be an admin or the creator.", + "operationId": "PostStartTimeTrackingByUserId", "parameters": [ { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "userId", "in": "path", - "description": "The id of the file.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -47353,19 +45728,15 @@ } ], "requestBody": { - "description": "The model to update the file with the specified id.", + "description": "The model describing the time tracking to start.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileInfoUpdateForm" + "$ref": "#/components/schemas/StartTimeTrackingForm" } } - } + }, + "required": true }, "responses": { "200": { @@ -47373,7 +45744,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeTracking" } } } @@ -47390,33 +45761,24 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "owner": "true" } } }, - "/workspaces/{workspaceId}/files/{fileId}/changeentity": { + "/users/{userId}/timetracking/stop": { "post": { "tags": [ - "WorkspaceFiles" + "TimeTracking" ], - "summary": "Changes the workspace this file belongs to.", - "description": "Changes the workspace this file belongs to.\nSwitch to the specified workspace or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", - "operationId": "ChangeWorkspace", + "summary": "Stops the currently running time tracking of the specified user.", + "description": "The request body is optional. You can provide a stopReason to indicate how the tracking was stopped.\r\n For external API clients, the stopReason is automatically set to \"external-api\" regardless of what is provided.\r\n For this operation to work there must be a running time tracking for the user.\r\n\r\nThe user must be an admin or the creator.", + "operationId": "PostStopTimeTrackingByUserId", "parameters": [ { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", + "name": "userId", "in": "path", - "description": "The id of the file.", + "description": "The id of the user.", "required": true, "schema": { "type": "string", @@ -47425,16 +45787,10 @@ } ], "requestBody": { - "description": "The model to change the entity information of the file.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileEntityForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileEntityForm" + "$ref": "#/components/schemas/StopTimeTrackingForm" } } } @@ -47445,10 +45801,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "$ref": "#/components/schemas/TimeTracking" } } } + }, + "204": { + "description": "No Content" } }, "security": [ @@ -47462,62 +45821,43 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "owner": "true" } } }, - "/workspaces/{workspaceId}/files/{fileId}/copy": { - "post": { + "/webhooks": { + "get": { "tags": [ - "WorkspaceFiles" + "Webhooks" ], - "summary": "Copies the file to a new workspace.", - "description": "Copies the file to a new workspace (meta and content).\r\n\r\nAny authenticated user.", - "operationId": "CopyToWorkspace", + "summary": "Returns all configured webhooks.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetWebhooks", "parameters": [ { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/page" }, { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], - "requestBody": { - "description": "The model to change the entity information of the file.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/FileCopyForm" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FileInfo" + "type": "array", + "items": { + "$ref": "#/components/schemas/WebhookConfig" + } } } } @@ -47534,74 +45874,121 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "read" } - } - }, - "/workspaces/{workspaceId}/files/{fileId}/download": { - "get": { + }, + "post": { "tags": [ - "WorkspaceFiles" + "Webhooks" ], - "summary": "Returns the content of the workspace file with the specified id.", - "description": "Returns the content of the workspace file. Uses the latest file version.\nIf the workspace file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", - "operationId": "GetWorkspaceFileContent", - "parameters": [ - { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Creates a new webhook.", + "description": "The receiver type is inferred from the URI. All unknown receivers are treated as 'custom'.\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PostWebhook", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebhookConfigForm" + } } }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebhookConfig" + } + } } }, - { - "name": "width", - "in": "query", - "description": "Set width to resize.", - "schema": { - "type": "number", - "format": "double" + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - }, + } + }, + "security": [ { - "name": "height", - "in": "query", - "description": "Set height to resize.", - "schema": { - "type": "number", - "format": "double" + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "workspace-manage-config": "write" + } + } + }, + "/webhooks/eventtypes": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Returns all available event types.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetWebhookEventTypes", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } } - }, + } + }, + "security": [ { - "name": "crop", - "in": "query", - "description": "Whether to crop the image when resizing it.", - "schema": { - "type": "boolean" - } + "oauth2": [ + "full_access" + ] } ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/webhooks/eventtypes/slack": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Returns all available event types for Slack webhooks.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetSlackEventTypes", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "type": "array", + "items": { + "type": "string" + } } } } @@ -47622,53 +46009,165 @@ } } }, - "/workspaces/{workspaceId}/files/{fileId}/pdf": { - "get": { + "/webhooks/{webhookId}": { + "delete": { "tags": [ - "WorkspaceFiles" + "Webhooks" ], - "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", - "description": "Returns the content of the workspace file. Uses the latest file version.\r\n\r\nAny authenticated user.", - "operationId": "GetWorkspaceFileContent", + "summary": "Deletes the webhook with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "DeleteWebhook", "parameters": [ { - "name": "workspaceId", + "name": "webhookId", "in": "path", - "description": "The id of the workspace.", "required": true, "schema": { "type": "string", "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ { - "name": "fileId", + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "workspace-manage-config": "write" + } + }, + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Returns the webhook with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetWebhook", + "parameters": [ + { + "name": "webhookId", "in": "path", - "description": "The id of the file.", "required": true, "schema": { "type": "string", "format": "uuid" } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebhookConfig" + } + } + } }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ { - "name": "inline", - "in": "query", - "description": "If inline is false, content-disposition header is attachment.", + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "workspace-manage-config": "read" + } + }, + "put": { + "tags": [ + "Webhooks" + ], + "summary": "Updates the webhook with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:write` permissions.", + "operationId": "PutWebhook", + "parameters": [ + { + "name": "webhookId", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebhookConfigForm" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/WebhookConfig" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -47685,23 +46184,23 @@ "v1" ], "x-access": { - "any": "true" + "admin": "true", + "workspace-manage-config": "write" } } }, - "/workspaces/{workspaceId}/files/{fileId}/shareurl": { + "/webhooks/{webhookId}/logs": { "get": { "tags": [ - "WorkspaceFiles" + "Webhooks" ], - "summary": "Returns an url to share the file.", - "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", - "operationId": "GetPublicToken", + "summary": "Returns all logs of the webhook with the specified id.", + "description": "\r\n\r\nThe user must be an admin or have `workspace-manage-config:read` permissions.", + "operationId": "GetWebhookLogs", "parameters": [ { - "name": "workspaceId", + "name": "webhookId", "in": "path", - "description": "The id of the workspace.", "required": true, "schema": { "type": "string", @@ -47709,14 +46208,87 @@ } }, { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WebhookLog" + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "workspace-manage-config": "read" + } + } + }, + "/workflows": { + "get": { + "tags": [ + "Workflows" + ], + "summary": "Retrieves all workflows.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetWorkflows", + "parameters": [ + { + "name": "showArchived", + "in": "query", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" } ], "responses": { @@ -47725,7 +46297,10 @@ "content": { "application/json": { "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/components/schemas/Workflow" + } } } } @@ -47744,319 +46319,11429 @@ "x-access": { "any": "true" } + }, + "post": { + "tags": [ + "Workflows" + ], + "summary": "Creates a new workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflow", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Workflow" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } } }, - "/workspaces/{workspaceId}/files/{fileId}/versions": { + "/workflows/automations/copy": { + "post": { + "tags": [ + "Workflow Automations" + ], + "summary": "Copies automations from one workflow to another.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostCopyWorkflowAutomations", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyWorkflowAutomationsForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Automation" + } + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}": { "get": { "tags": [ - "WorkspaceFiles" + "Workflows" ], - "summary": "Returns all file versions of the specified workspace file.", - "description": "Returns all file versions of the specified workspace file.\r\n\r\nAny authenticated user.", - "operationId": "GetWorkspaceFileVersions", + "summary": "Retrieves a specified workflow.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetWorkflowById", "parameters": [ { - "name": "workspaceId", + "name": "workflowId", "in": "path", - "description": "The id of the workspace.", "required": true, "schema": { "type": "string", "format": "uuid" } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Workflow" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "put": { + "tags": [ + "Workflows" + ], + "summary": "Updates a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutWorkflowById", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Workflow" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/automations": { + "get": { + "tags": [ + "Workflow Automations" + ], + "summary": "Retrieves automations of the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetWorkflowAutomations", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Automation" + } + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "read" + } + }, + "post": { + "tags": [ + "Workflow Automations" + ], + "summary": "Creates a new automation for a workflow.", + "description": "\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowAutomation", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationTriggerForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Automation" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + }, + "x-subscriptionlevel": { + "minimumPlan": "standard" + } + } + }, + "/workflows/{workflowId}/automations/{automationId}": { + "delete": { + "tags": [ + "Workflow Automations" + ], + "summary": "Deletes a workflow automation by id.", + "description": "Requires specifying whether to delete or unlink synced automations on linked projects/templates.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteWorkflowAutomation", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deleteSyncedAutomations", + "in": "query", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + }, + "get": { + "tags": [ + "Workflow Automations" + ], + "summary": "Retrieves a specific automation of the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetWorkflowAutomation", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Automation" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "read" + } + }, + "put": { + "tags": [ + "Workflow Automations" + ], + "summary": "Updates an automation of the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutWorkflowAutomation", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationPutForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Automation" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/automations/{automationId}/actions": { + "get": { + "tags": [ + "Workflow Automations" + ], + "summary": "Gets all actions of an automation of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetWorkflowActions", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Action" + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "read" + } + }, + "post": { + "tags": [ + "Workflow Automations" + ], + "summary": "Creates a new action for an automation of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowAction", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActionForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Action" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/automations/{automationId}/actions/{actionId}": { + "delete": { + "tags": [ + "Workflow Automations" + ], + "summary": "Deletes an action from an automation of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "DeleteWorkflowAction", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "actionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + }, + "get": { + "tags": [ + "Workflow Automations" + ], + "summary": "Gets a specific action of an automation of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:read` permissions.", + "operationId": "GetWorkflowAction", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "actionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Action" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "read" + } + }, + "put": { + "tags": [ + "Workflow Automations" + ], + "summary": "Updates an action of an automation of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutWorkflowAction", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "actionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActionForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Action" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/automations/{automationId}/actions/{actionId}/updateorder": { + "post": { + "tags": [ + "Workflow Automations" + ], + "summary": "Updates the order of an action within an automation of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostUpdateWorkflowActionOrder", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "automationId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "actionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrderForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/copy": { + "post": { + "tags": [ + "Workflows" + ], + "summary": "Creates a copy of an existing workflow.", + "description": "Creates a new workflow with the same properties as the original.\r\n The new workflow will have a unique name with \" (Copy)\" appended.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowCopyByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Workflow" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/customfielddefinitions": { + "get": { + "tags": [ + "CustomFields" + ], + "summary": "Returns all custom field definitions linked to a workflow.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetWorkflowCustomFieldDefinitionsByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "description": "The id of the workflow.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinitionWithSelectionOptions" + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workflows/{workflowId}/customfielddefinitions/{customFieldDefinitionId}": { + "put": { + "tags": [ + "CustomFields" + ], + "summary": "Updates the order of a custom field definition linked to a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutWorkflowCustomFieldDefinitionByWorkflowIdAndCustomFieldDefinitionId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "description": "The workflow Id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "customFieldDefinitionId", + "in": "path", + "description": "The custom field definition Id.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The order update form.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldOrderPutForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldOrderForm" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/delete": { + "post": { + "tags": [ + "Workflows" + ], + "summary": "Deletes a workflow.", + "description": "If the workflow is linked to projects or project templates they can either be unlinked\r\n or migrated to another workflow before the workflow is deleted.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowDeleteByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteWorkflowForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/linkcustomfielddefinition": { + "post": { + "tags": [ + "CustomFields" + ], + "summary": "Links a custom field definition to a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowLinkCustomFieldDefinitionByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkCustomFieldDefinitionForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/projectstatuses": { + "get": { + "tags": [ + "Workflows" + ], + "summary": "Returns all project statuses of the workflow with the specified id.", + "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", + "operationId": "GetWorkflowProjectStatusesByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectStatus" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "Workflows" + ], + "summary": "Creates a new project status for the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowProjectStatusesByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectStatusForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/projectstatuses/{projectStatusId}": { + "get": { + "tags": [ + "Workflows" + ], + "summary": "Returns the project status of the workflow with the specified id.", + "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", + "operationId": "GetWorkflowProjectStatusByWorkflowIdAndProjectStatusId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "projectStatusId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectStatus" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "put": { + "tags": [ + "Workflows" + ], + "summary": "Updates a project status for the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutWorkflowProjectStatusByWorkflowIdAndProjectStatusId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "projectStatusId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectStatusForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/projectstatuses/{projectStatusId}/delete": { + "post": { + "tags": [ + "Workflows" + ], + "summary": "Deletes a project status from the workflow.", + "description": "A workflow must always have at least one project status to ensure projects\r\n using this workflow have a valid status. If you attempt to delete the last\r\n remaining project status, this endpoint will return a BadRequest error.\r\n \r\n If any projects are currently using this status, you must provide a\r\n NewProjectStatusId in the request body to migrate those projects to a\r\n different status within the same workflow.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowProjectStatusDeleteByWorkflowIdAndProjectStatusId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "description": "The Id of the workflow.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "projectStatusId", + "in": "path", + "description": "The Id of the project status to delete.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "Optional form containing the new status Id for migration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteWorkflowProjectStatusForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/setarchived": { + "post": { + "tags": [ + "Workflows" + ], + "summary": "Sets the archived status of a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowSetArchivedByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArchivedForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Workflow" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/taskstatuses": { + "get": { + "tags": [ + "Workflows" + ], + "summary": "Returns all task statuses of the workflow with the specified id.", + "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", + "operationId": "GetWorkflowTaskStatusesByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskStatus" + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "Workflows" + ], + "summary": "Creates a new task status for the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowTaskStatusesByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatusForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/taskstatuses/{taskStatusId}": { + "get": { + "tags": [ + "Workflows" + ], + "summary": "Returns the task status of the workflow with the specified id.", + "description": "The user must either have `project-master-data:read` permissions for a linked project, be assigned to a non-deleted task in a linked project, be allowed to see the external workflow, or have admin / `project-manage-config:read` permissions.", + "operationId": "GetWorkflowTaskStatusByWorkflowIdAndTaskStatusId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskStatusId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatus" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "put": { + "tags": [ + "Workflows" + ], + "summary": "Updates a task status for the specified workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PutWorkflowTaskStatusByWorkflowIdAndTaskStatusId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskStatusId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatusForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskStatus" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/taskstatuses/{taskStatusId}/delete": { + "post": { + "tags": [ + "Workflows" + ], + "summary": "Deletes the task status of the workflow with the specified id.", + "description": "A workflow must always have at least one task status of type 'todo' and one\r\n of type 'done'. If you attempt to delete the last status of either type,\r\n this endpoint will return a BadRequest error.\r\n \r\n If any tasks are currently using this status, you must provide a\r\n NewTaskStatusId in the request body to migrate those tasks to a\r\n different status within the same workflow.\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowTaskStatusDeleteByWorkflowIdAndTaskStatusId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "description": "The Id of the workflow.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "taskStatusId", + "in": "path", + "description": "The Id of the task status to delete.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "Optional form containing the new status Id for migration.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteWorkflowTaskStatusForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/unlinkcustomfielddefinition": { + "post": { + "tags": [ + "CustomFields" + ], + "summary": "Unlinks a custom field definition from a workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowUnlinkCustomFieldDefinitionByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnlinkWorkflowCustomFieldDefinitionForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workflows/{workflowId}/updateprojectstatusorder": { + "post": { + "tags": [ + "Workflows" + ], + "summary": "Updates the order of a project status in the workflow.", + "description": "\r\n\r\nThe user must be an admin or have `project-manage-config:write` permissions.", + "operationId": "PostWorkflowUpdateProjectStatusOrderByWorkflowId", + "parameters": [ + { + "name": "workflowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProjectStatusOrderForm" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "project-manage-config": "write" + } + } + }, + "/workspaceabsences": { + "get": { + "tags": [ + "WorkspaceAbsences" + ], + "summary": "Gets all workspace absences.", + "description": "Gets all workspace absences. The result can be filtered, sorted, and paged.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", + "operationId": "GetWorkspaceAbsences", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkspaceAbsenceModel" + } + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "user-planning-data": "write" + } + }, + "post": { + "tags": [ + "WorkspaceAbsences" + ], + "summary": "Creates a new workspace absence.", + "description": "Creates a new workspace absence.\r\n A workspace absence is a kind of absence that is applied to all users in a workspace.\r\n It can be used to define special holidays (e.g: company offsite) that apply to all users in a workspace.\r\n It can be limited to a specific absence region, in which case only users in that region will be affected.\r\n\r\nThis endpoint requires the `Standard` plan or higher.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", + "operationId": "PostWorkspaceAbsence", + "requestBody": { + "description": "Workspace absence details including start date, end date, description, and optional region.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceAbsenceForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceAbsenceModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "user-planning-data": "write" + }, + "x-subscriptionlevel": { + "minimumPlan": "standard" + } + } + }, + "/workspaceabsences/{workspaceAbsenceId}": { + "delete": { + "tags": [ + "WorkspaceAbsences" + ], + "summary": "Deletes a workspace absence.", + "description": "Deletes a workspace absence.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", + "operationId": "DeleteWorkspaceAbsenceById", + "parameters": [ + { + "name": "workspaceAbsenceId", + "in": "path", + "description": "The workspace absence to delete.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "user-planning-data": "write" + } + }, + "put": { + "tags": [ + "WorkspaceAbsences" + ], + "summary": "Updates a workspace absence.", + "description": "Updates a workspace absence.\r\n\r\nThe user must be an admin or have `user-planning-data:write` permissions.", + "operationId": "PutWorkspaceAbsenceById", + "parameters": [ + { + "name": "workspaceAbsenceId", + "in": "path", + "description": "The workspace absence to update.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "Updated workspace absence details including start date, end date, description, and optional region.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceAbsenceForm" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceAbsenceModel" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "admin": "true", + "user-planning-data": "write" + } + } + }, + "/workspaces/types": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Returns all available workspace types.", + "description": "\r\n\r\nAllows unauthenticated access.", + "operationId": "GetWorkspacesTypes", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "anonymous": "true" + } + } + }, + "/workspaces/{workspaceId}": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Returns the workspace with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetWorkspacesByWorkspaceId", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Workspace" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/externalfiles": { + "post": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Endpoint to batch create external files without uploading.", + "description": "Endpoint to create file infos with batch operation.\nCreated file infos don't have a version.\r\n\r\nAny authenticated user.", + "operationId": "CreateExternalFiles", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "List of file forms.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + }, + "application/*+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalFileForm" + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files": { + "delete": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Deletes the files of the specified workspace.", + "description": "Deletes the metadata and the different versions of the files.\r\n\r\nAny authenticated user.", + "operationId": "DeleteWorkspaceFiles", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Returns all files of the workspace with the specified id.", + "description": "Returns all file metadata of the workspace with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetWorkspaceFiles", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Creates a new workspace file for the workspace with the specified id..", + "description": "Uploads a new workspace file for the workspace with the specified id.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateWorkspaceFile", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + }, + "400": { + "description": "Bad Request" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/byurl": { + "post": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Uploads a new file by providing an url.", + "description": "The file needs to be a public available url.\nThe file size must not exceed 100MB.\r\n\r\nAny authenticated user.", + "operationId": "CreateWorkspaceFileByUrl", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace the file is linked to.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The url, name and description of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FilePostForm" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}": { + "delete": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Deletes the workspace file with the specified id.", + "description": "Deletes the metadata and the different versions of the file.\r\n\r\nAny authenticated user.", + "operationId": "DeleteWorkspaceFile", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "get": { + "tags": [ + "Workspace Files" + ], + "summary": "Returns the file with the specified id of the workspace with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesByWorkspaceNameAndWorkspaceIdAndFileId", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "put": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Updates the metadata of the workspace file with the specified id.", + "description": "Updates the metadata of the workspace file with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "UpdateWorkspaceFile", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to update the file with the specified id.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileInfoUpdateForm" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/changeentity": { + "post": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Changes the workspace this file belongs to.", + "description": "Changes the workspace this file belongs to.\nSwitch to the specified workspace or to a global file\nif the 'EntityId' of the model is set to null.\r\n\r\nAny authenticated user.", + "operationId": "ChangeWorkspace", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileEntityForm" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/copy": { + "post": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Copies the file to a new workspace.", + "description": "Copies the file to a new workspace (meta and content).\r\n\r\nAny authenticated user.", + "operationId": "CopyToWorkspace", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The model to change the entity information of the file.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/FileCopyForm" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/download": { + "get": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Returns the content of the workspace file with the specified id.", + "description": "Returns the content of the workspace file. Uses the latest file version.\nIf the workspace file is an image and the width and height are set,\nthe image will be resized before it is returned.\r\n\r\nAny authenticated user.", + "operationId": "GetWorkspaceFileContent", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "width", + "in": "query", + "description": "Set width to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "height", + "in": "query", + "description": "Set height to resize.", + "schema": { + "type": "number", + "format": "double" + } + }, + { + "name": "crop", + "in": "query", + "description": "Whether to crop the image when resizing it.", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/pdf": { + "get": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Returns the content of the file with the specified id as pdf.\ntype or conversion not possible.", + "description": "Returns the content of the workspace file. Uses the latest file version.\r\n\r\nAny authenticated user.", + "operationId": "GetWorkspaceFileContent", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "inline", + "in": "query", + "description": "If inline is false, content-disposition header is attachment.", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/shareurl": { + "get": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Returns an url to share the file.", + "description": "Returns a url to share the file.\r\n\r\nAny authenticated user.", + "operationId": "GetPublicToken", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/versions": { + "get": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Returns all file versions of the specified workspace file.", + "description": "Returns all file versions of the specified workspace file.\r\n\r\nAny authenticated user.", + "operationId": "GetWorkspaceFileVersions", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "$ref": "#/components/parameters/orderby" + }, + { + "$ref": "#/components/parameters/filterby" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileVersion" + } + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + }, + "post": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Uploads a new version of the workspace file with the specified id.", + "description": "Uploads a new version of an workspace file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", + "operationId": "CreateWorkspaceFileVersion", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "required": [ + "File" + ], + "type": "object", + "properties": { + "File": { + "type": "string", + "format": "binary" + } + } + }, + "encoding": { + "File": { + "style": "form" + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileVersion" + } + } + } + }, + "400": { + "description": "Bad Request" + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/versions/{versionId}": { + "get": { + "tags": [ + "Workspace Files" + ], + "summary": "Returns the workspace file version with the specified id.", + "description": "\r\n\r\nAny authenticated user.", + "operationId": "GetFilesVersionsByWorkspaceNameAndWorkspaceIdAndFileIdAndVersionId", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileVersion" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + }, + "/workspaces/{workspaceId}/files/{fileId}/versions/{versionId}/download": { + "get": { + "tags": [ + "WorkspaceFiles" + ], + "summary": "Returns the content of the workspace file version with the specified id.", + "description": "Returns the content of the workspace file version with the specified id.\r\n\r\nAny authenticated user.", + "operationId": "GetWorkspaceFileVersionContent", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "description": "The id of the workspace.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "fileId", + "in": "path", + "description": "The id of the file.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "versionId", + "in": "path", + "description": "The id of the file version.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "security": [ + { + "oauth2": [ + "full_access" + ] + } + ], + "x-api-versions": [ + "v1" + ], + "x-access": { + "any": "true" + } + } + } + }, + "components": { + "schemas": { + "AgentAccessLevelRequestModel": { + "type": "object", + "properties": { + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The access level to grant." + } + }, + "additionalProperties": false, + "description": "Changes a contributor's access level for an agent." + }, + "AgentConnectorConfigurationRequestModel": { + "required": [ + "connectionMode" + ], + "type": "object", + "properties": { + "connectionMode": { + "maxLength": 25, + "minLength": 1, + "enum": [ + "actingUser", + "specificConnection" + ], + "type": "string", + "description": "How the agent selects a connection for the connector." + }, + "connectionId": { + "type": "string", + "description": "The connection id to use.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Configures an agent's connector connection." + }, + "AgentConnectorUserConnectionRequestModel": { + "required": [ + "connectionId" + ], + "type": "object", + "properties": { + "connectionId": { + "type": "string", + "description": "The connection selected by the current user.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Selects the current user's connection for a connector." + }, + "AgentContributorRequestModel": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The user who receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The access level to grant." + } + }, + "additionalProperties": false, + "description": "Shares an agent with a user." + }, + "AgentContributorResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The access grant id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "userId": { + "type": "string", + "description": "The user who receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The access level granted to the user." + } + }, + "additionalProperties": false, + "description": "Represents a user the agent is shared with." + }, + "AgentDefaultsResponseModel": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The matching agent thread type.", + "nullable": true, + "example": "custom-agent" + }, + "modelProvider": { + "type": "string", + "description": "The default model provider.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The default model name.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "presetKey": { + "type": "string", + "description": "The stored preset identity for preset-based agents.", + "nullable": true, + "example": "balanced" + }, + "reasoningLevel": { + "type": "string", + "description": "The default reasoning level.", + "nullable": true, + "example": "medium" + }, + "toolAccess": { + "$ref": "#/components/schemas/AgentToolAccessDefaultsModel" + }, + "connectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The default connector ids.", + "nullable": true + }, + "skillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The default skill ids.", + "nullable": true + }, + "availableModels": { + "$ref": "#/components/schemas/AgentRuntimeModelsResponseModel" + } + }, + "additionalProperties": false, + "description": "Provides agent thread defaults." + }, + "AgentDelegationResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The delegation id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The parent agent that owns the delegation.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "delegatedAgentId": { + "type": "string", + "description": "The agent that receives the delegated work.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "description": "The delegation name shown in workflow settings.", + "nullable": true + }, + "description": { + "type": "string", + "description": "A short explanation of the delegated work.", + "nullable": true + }, + "executionMode": { + "enum": [ + "orchestracted" + ], + "type": "string", + "description": "How the parent agent invokes the delegated agent." + }, + "promptOverride": { + "type": "string", + "description": "Additional instructions supplied to the delegated agent.", + "nullable": true + }, + "sortOrder": { + "type": "integer", + "description": "The delegation's display order.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Describes a delegation from one agent to another." + }, + "AgentMemoryResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The memory id assigned by Mem0.", + "nullable": true + }, + "memory": { + "type": "string", + "description": "The memory text inferred and stored by Mem0.", + "nullable": true + }, + "scope": { + "type": "string", + "description": "The memory scope.", + "nullable": true + }, + "projectId": { + "type": "string", + "description": "The project id when the memory is project-scoped.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "clientId": { + "type": "string", + "description": "The client id when the memory is client-scoped.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "score": { + "type": "number", + "description": "The relevance score returned by Mem0 search.", + "format": "double", + "nullable": true + }, + "createdAt": { + "type": "string", + "description": "The creation timestamp returned by Mem0.", + "format": "date-time", + "nullable": true + }, + "updatedAt": { + "type": "string", + "description": "The update timestamp returned by Mem0.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a stored agent memory returned by the agent runtime API." + }, + "AgentMessageConnectorConnectionRequestModel": { + "type": "object", + "properties": { + "connectorId": { + "type": "string", + "description": "The connector identifier.", + "format": "uuid", + "example": "7e376777-7834-4af6-9eb8-da065f568d30" + }, + "connectionId": { + "type": "string", + "description": "The connection identifier.", + "format": "uuid", + "example": "af18602d-c8aa-4f63-a21e-5a7f59b2412c" + } + }, + "additionalProperties": false, + "description": "Selects a connection for a Custom agent connector." + }, + "AgentParticipationResponseModel": { + "type": "object", + "properties": { + "participationId": { + "type": "string", + "description": "The participation identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The participating agent.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentName": { + "type": "string", + "description": "The agent name captured for the audit record.", + "nullable": true + }, + "threadId": { + "type": "string", + "description": "The latest thread available for the agent in this context.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "responsibleUserId": { + "type": "string", + "description": "The responsible user of the latest run.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "firstThreadRunId": { + "type": "string", + "description": "The first run in the participation.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "lastThreadRunId": { + "type": "string", + "description": "The latest run in the participation.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "createdOn": { + "type": "string", + "description": "When participation was first recorded.", + "format": "date-time" + }, + "updatedOn": { + "type": "string", + "description": "When participation was last updated.", + "format": "date-time" + }, + "threadAvailable": { + "type": "boolean", + "description": "Whether the thread is still available." + }, + "canReadThread": { + "type": "boolean", + "description": "Whether the requester can open the thread." + }, + "canReadRunHistory": { + "type": "boolean", + "description": "Whether the requester can inspect the participation's run history." + }, + "canInvokeAgent": { + "type": "boolean", + "description": "Whether the requester can run the agent in this context." + }, + "canCancelAgent": { + "type": "boolean", + "description": "Whether the requester can cancel the current agent run." + }, + "triggeredByUserId": { + "type": "string", + "description": "The user who triggered the latest recorded run.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Represents one agent's latest participation in a task or project." + }, + "AgentParticipationRunResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The run identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "executingUserId": { + "type": "string", + "description": "The user whose permissions applied to the run.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "triggeredByUserId": { + "type": "string", + "description": "The user who triggered the run.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "triggerType": { + "type": "string", + "description": "How the run was triggered.", + "nullable": true + }, + "status": { + "type": "string", + "description": "The terminal or active run status.", + "nullable": true + }, + "startedOn": { + "type": "string", + "description": "When execution started.", + "format": "date-time", + "nullable": true + }, + "completedOn": { + "type": "string", + "description": "When execution completed.", + "format": "date-time", + "nullable": true + }, + "failureReason": { + "type": "string", + "description": "The terminal failure reason.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents one immutable run shown beneath an agent participation entry." + }, + "AgentPresetCatalogResponseModel": { + "type": "object", + "properties": { + "sourceAgentId": { + "type": "string", + "description": "The source agent used to import the selected preset.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "versionNumber": { + "type": "integer", + "description": "The preset version number.", + "format": "int32" + }, + "name": { + "type": "string", + "description": "The localized display name.", + "nullable": true + }, + "description": { + "type": "string", + "description": "The localized short description.", + "nullable": true + }, + "detailedDescription": { + "type": "string", + "description": "The localized detailed catalog description.", + "nullable": true + }, + "systemPrompt": { + "type": "string", + "description": "The published system instructions.", + "nullable": true + }, + "modelPresetKey": { + "type": "string", + "description": "The target workspace model preset key used when importing.", + "nullable": true + }, + "modelProvider": { + "type": "string", + "description": "The model provider from the workspace Balanced preset.", + "nullable": true + }, + "modelName": { + "type": "string", + "description": "The model from the workspace Balanced preset.", + "nullable": true + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level from the workspace Balanced preset.", + "nullable": true + }, + "importBlocker": { + "type": "string", + "description": "The code that explains why the preset cannot be imported.", + "nullable": true + }, + "importWarnings": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Codes for capabilities that will be disabled on import.", + "nullable": true + }, + "webSearchEnabled": { + "type": "boolean", + "description": "Whether web search is enabled in the preset." + }, + "aworkAccessEnabled": { + "type": "boolean", + "description": "Whether awork access is enabled in the preset." + }, + "googleGenAiAccessEnabled": { + "type": "boolean", + "description": "Whether Google image generation is enabled in the preset." + }, + "openAiImageGenerationAccessEnabled": { + "type": "boolean", + "description": "Whether OpenAI image generation is enabled in the preset." + }, + "hasAvatar": { + "type": "boolean", + "description": "Whether the preset has an avatar." + }, + "skillNames": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The skill names included in the preset.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes an agent preset available to import." + }, + "AgentPresetDefinitionResponseModel": { + "type": "object", + "properties": { + "sourceAgentId": { + "type": "string", + "description": "The source agent, which also identifies the preset.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "sourceAgentName": { + "type": "string", + "description": "The source agent name when the preset was published.", + "nullable": true + }, + "language": { + "type": "string", + "description": "The published language.", + "nullable": true + }, + "detailedDescription": { + "type": "string", + "description": "The detailed catalog description.", + "nullable": true + }, + "isPublished": { + "type": "boolean", + "description": "Whether the preset is currently visible to customers." + }, + "latestPublishedVersionNumber": { + "type": "integer", + "description": "The active preset version number.", + "format": "int32" + }, + "nextVersionNumber": { + "type": "integer", + "description": "The version number assigned by the next publication.", + "format": "int32" + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentPresetVersionSummaryResponseModel" + }, + "description": "The saved preset version history.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes an agent preset and its publication status." + }, + "AgentPresetSourceAgentResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The source agent id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "description": "The agent name.", + "nullable": true + }, + "description": { + "type": "string", + "description": "The short agent description.", + "nullable": true + }, + "presetKey": { + "type": "string", + "description": "The model preset key.", + "nullable": true + }, + "modelProvider": { + "type": "string", + "description": "The model provider.", + "nullable": true + }, + "modelName": { + "type": "string", + "description": "The model name.", + "nullable": true + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level.", + "nullable": true + }, + "systemPrompt": { + "type": "string", + "description": "The current system prompt.", + "nullable": true + }, + "webSearchEnabled": { + "type": "boolean", + "description": "Whether web search is enabled." + }, + "aworkAccessEnabled": { + "type": "boolean", + "description": "Whether awork access is enabled." + }, + "googleGenAiAccessEnabled": { + "type": "boolean", + "description": "Whether Google image generation is enabled." + }, + "openAiImageGenerationAccessEnabled": { + "type": "boolean", + "description": "Whether OpenAI image generation is enabled." + }, + "publicationBlockers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The source features that prevent preset publication.", + "nullable": true + }, + "includedSkillNames": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The names of skills copied when the preset is imported.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes a custom agent used as a source for a preset." + }, + "AgentPresetVersionSummaryResponseModel": { + "type": "object", + "properties": { + "versionNumber": { + "type": "integer", + "description": "The preset version number.", + "format": "int32" + }, + "publishedOn": { + "type": "string", + "description": "When this version was published.", + "format": "date-time" + }, + "isPublished": { + "type": "boolean", + "description": "Whether this version remains published." + }, + "isActive": { + "type": "boolean", + "description": "Whether this version is currently available to import." + } + }, + "additionalProperties": false, + "description": "Describes an agent preset version." + }, + "AgentRuntimeModelResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The model id used by the provider API.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "key": { + "type": "string", + "description": "The stable catalog key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "kind": { + "type": "string", + "description": "The model kind.", + "nullable": true, + "example": "text" + }, + "vendorKey": { + "type": "string", + "description": "The stable vendor key.", + "nullable": true, + "example": "openai" + }, + "vendorCountry": { + "type": "string", + "description": "The vendor country shown in the model picker.", + "nullable": true, + "example": "EU" + }, + "regionKey": { + "type": "string", + "description": "The stable serving-region key.", + "nullable": true, + "example": "europe" + }, + "displayName": { + "type": "string", + "description": "The display label.", + "nullable": true, + "example": "GPT-5.6 Terra" + }, + "status": { + "type": "string", + "description": "The lifecycle status of the model.", + "nullable": true, + "example": "active" + }, + "isNew": { + "type": "boolean", + "description": "Whether the model is newly published.", + "example": false + }, + "isWorkspaceEnabled": { + "type": "boolean", + "description": "Whether workspace policy enables the model.", + "example": true + }, + "isInUse": { + "type": "boolean", + "description": "Whether a current workspace configuration or thread uses the model.", + "example": true + }, + "isAvailable": { + "type": "boolean", + "description": "Whether provider readiness makes the model available.", + "example": true + }, + "disabledReason": { + "type": "string", + "description": "The reason the model is unavailable.", + "nullable": true, + "example": "Its vendor or region is disabled." + }, + "canToggle": { + "type": "boolean", + "description": "Whether the workspace can change this model's switch.", + "example": true + }, + "creditFactor": { + "type": "number", + "description": "The Terra-relative cost factor for the representative cached-input workload.", + "format": "double", + "nullable": true, + "example": 1 + }, + "servedFrom": { + "type": "string", + "description": "The serving region label.", + "nullable": true, + "example": "Europe" + }, + "servingFlag": { + "type": "string", + "description": "The serving region flag.", + "nullable": true, + "example": "🇪🇺" + }, + "supportsImageInput": { + "type": "boolean", + "description": "Whether the model accepts native image input.", + "example": true + }, + "supportedReasoningLevels": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The reasoning levels supported by this model.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents one agent runtime model exposed by the catalog." + }, + "AgentRuntimeModelsResponseModel": { + "type": "object", + "properties": { + "defaultProvider": { + "type": "string", + "description": "The default provider.", + "nullable": true, + "example": "openai" + }, + "defaultModel": { + "type": "string", + "description": "The default model.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "providers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimeProviderModelsResponseModel" + }, + "description": "The available providers and their models.", + "nullable": true + }, + "performanceLevels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimePerformanceLevelResponseModel" + }, + "description": "The predefined performance levels that resolve to available models.", + "nullable": true + }, + "workspaceSettings": { + "$ref": "#/components/schemas/AgentRuntimeWorkspaceModelSettingsResponseModel" + }, + "availableImageCapabilities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Image capability keys available in this workspace.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes the models available to the workspace." + }, + "AgentRuntimePerformanceLevelResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The stable identifier used by clients to present the performance level.", + "nullable": true, + "example": "balanced" + }, + "provider": { + "type": "string", + "description": "The selected model provider.", + "nullable": true, + "example": "openai" + }, + "model": { + "type": "string", + "description": "The selected model name.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "reasoningLevel": { + "type": "string", + "description": "The selected reasoning level.", + "nullable": true, + "example": "medium" + }, + "isDefault": { + "type": "boolean", + "description": "Whether this is the default performance level for new personal agent chats.", + "example": true + } + }, + "additionalProperties": false, + "description": "Represents a predefined performance level for the agent model selector." + }, + "AgentRuntimeProviderModelsResponseModel": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "description": "The stable provider key.", + "nullable": true, + "example": "openai" + }, + "displayName": { + "type": "string", + "description": "The provider name shown to users.", + "nullable": true, + "example": "OpenAI" + }, + "defaultModel": { + "type": "string", + "description": "The provider model selected by default.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "models": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The available provider model keys.", + "nullable": true + }, + "modelDetails": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimeModelResponseModel" + }, + "description": "Rich model metadata for model pickers.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes the models available from one provider." + }, + "AgentRuntimeWorkspaceModelPresetResponseModel": { + "type": "object", + "properties": { + "presetKey": { + "type": "string", + "description": "The preset key.", + "nullable": true, + "example": "balanced" + }, + "isAuto": { + "type": "boolean", + "description": "Whether the preset uses central Auto resolution.", + "example": false + }, + "modelKey": { + "type": "string", + "description": "The explicit model key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "reasoningLevel": { + "type": "string", + "description": "The effective reasoning level.", + "nullable": true, + "example": "medium" + }, + "modelStatus": { + "type": "string", + "description": "The stored model lifecycle status.", + "nullable": true, + "example": "active" + }, + "warning": { + "type": "string", + "description": "The warning shown for a deprecated stored reference.", + "nullable": true, + "example": "This preset uses a deprecated model and remains visible for existing agents." + }, + "error": { + "type": "string", + "description": "The error shown for a removed or unavailable stored reference.", + "nullable": true, + "example": "This preset model is disabled by workspace settings." + } + }, + "additionalProperties": false, + "description": "Represents one effective workspace preset assignment." + }, + "AgentRuntimeWorkspaceModelSettingsResponseModel": { + "type": "object", + "properties": { + "autoEnableNewModels": { + "type": "boolean", + "description": "Whether new models in enabled parents are enabled automatically.", + "example": true + }, + "vendors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimeWorkspaceModelSwitchResponseModel" + }, + "description": "The effective vendor states.", + "nullable": true + }, + "regions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimeWorkspaceModelSwitchResponseModel" + }, + "description": "The effective region states.", + "nullable": true + }, + "presets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimeWorkspaceModelPresetResponseModel" + }, + "description": "Effective Fast, Balanced, and Deep preset assignments.", + "nullable": true + }, + "models": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentRuntimeModelResponseModel" + }, + "description": "The full effective catalog used by workspace model settings.", + "nullable": true + }, + "availableImageCapabilities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Image capability keys available in this workspace.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents effective workspace AI model policy." + }, + "AgentRuntimeWorkspaceModelSwitchResponseModel": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The stable switch key.", + "nullable": true, + "example": "openai" + }, + "displayName": { + "type": "string", + "description": "The display name.", + "nullable": true, + "example": "OpenAI" + }, + "country": { + "type": "string", + "description": "The vendor country, when this switch represents a vendor.", + "nullable": true, + "example": "US" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether the switch is enabled.", + "example": true + }, + "isNew": { + "type": "boolean", + "description": "Whether this switch is newly published.", + "example": false + }, + "canToggle": { + "type": "boolean", + "description": "Whether this parent switch can be changed.", + "example": true + }, + "disabledReason": { + "type": "string", + "description": "The authoritative reason the switch or its children are unavailable.", + "nullable": true, + "example": "Its vendor or region is disabled." + } + }, + "additionalProperties": false, + "description": "Represents one effective workspace model switch." + }, + "AgentScheduleNextOccurrenceRequestModel": { + "required": [ + "cronRule", + "recurrenceInterval", + "timezone" + ], + "type": "object", + "properties": { + "cronRule": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "The cron rule used for recurring execution." + }, + "recurrenceInterval": { + "maximum": 99, + "minimum": 1, + "type": "integer", + "description": "The number of matching cron occurrences between scheduled runs.", + "format": "int32" + }, + "timezone": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "The IANA timezone used to evaluate the cron rule." + }, + "scheduleId": { + "type": "string", + "description": "The optional existing schedule whose current cadence phase is used.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Represents the cadence used to preview the next scheduled agent run." + }, + "AgentScheduleNextOccurrenceResponseModel": { + "type": "object", + "properties": { + "nextRunOn": { + "type": "string", + "description": "The next selected occurrence in UTC.", + "format": "date-time" + }, + "isFirstRun": { + "type": "boolean", + "description": "Whether the occurrence starts a new cadence phase." + } + }, + "additionalProperties": false, + "description": "Represents the next scheduled agent run preview." + }, + "AgentScheduleResponseModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The schedule display name.", + "nullable": true + }, + "id": { + "type": "string", + "description": "The schedule id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "createdOn": { + "type": "string", + "description": "When the schedule was created.", + "format": "date-time" + }, + "agentId": { + "type": "string", + "description": "The agent id that is executed by this schedule.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "ownerUserId": { + "type": "string", + "description": "The user id whose context is used to execute the scheduled run.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "prompt": { + "type": "string", + "description": "Optional custom instructions. An omitted or null prompt means no custom instructions.", + "nullable": true + }, + "cronRule": { + "type": "string", + "description": "The normalized cron rule used for recurring execution.", + "nullable": true + }, + "recurrenceInterval": { + "type": "integer", + "description": "The number of matching cron occurrences between scheduled runs.", + "format": "int32" + }, + "timezone": { + "type": "string", + "description": "The timezone used to evaluate the cron rule.", + "nullable": true + }, + "projectId": { + "type": "string", + "description": "The optional project context id.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "taskId": { + "type": "string", + "description": "The optional task context id.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether this schedule is active." + }, + "needsAttention": { + "type": "boolean", + "description": "Whether the schedule needs user attention." + }, + "lastFailureReason": { + "type": "string", + "description": "The latest rejection reason.", + "nullable": true + }, + "consecutiveFailureCount": { + "type": "integer", + "description": "The number of consecutive failed scheduled executions.", + "format": "int32" + }, + "lastAttemptOn": { + "type": "string", + "description": "The latest occurrence time.", + "format": "date-time", + "nullable": true + }, + "lastSuccessfulRunOn": { + "type": "string", + "description": "The latest accepted occurrence time.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a scheduled agent run configuration." + }, + "AgentSessionSourceType": { + "enum": [ + "manual", + "project", + "task", + "client", + "workflow", + "automation" + ], + "type": "string", + "description": "Identifies the product source that created a custom-agent thread." + }, + "AgentSkillLinkResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The agent-skill link id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The agent that uses the skill.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "skillId": { + "type": "string", + "description": "The linked skill id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "skillKey": { + "type": "string", + "description": "The linked skill's stable key.", + "nullable": true + }, + "skillName": { + "type": "string", + "description": "The linked skill's display name.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes a skill linked to an agent." + }, + "AgentSummaryResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the entity.", + "format": "uuid", + "example": "23e68187-91d6-4f7e-8d31-e3f2c60d7427" + }, + "createdOn": { + "type": "string", + "description": "The date this entity was created.", + "format": "date-time", + "example": "2022-03-11T15:33:47.100Z" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created this entity.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "updatedOn": { + "type": "string", + "description": "The date this entity was last modified.", + "format": "date-time", + "example": "2022-03-11T21:15:00.100Z" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who last modified this entity.", + "format": "uuid", + "example": "3d844c62-7410-4df9-a5b2-78805c0ee260" + }, + "type": { + "type": "string", + "description": "The public agent type.", + "nullable": true, + "example": "custom-agent" + }, + "connectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectorResponseModel" + }, + "description": "The linked connectors.", + "nullable": true + }, + "name": { + "type": "string", + "description": "The name shown to users.", + "nullable": true, + "example": "Client Status Reporter" + }, + "description": { + "type": "string", + "description": "A short explanation of what the agent does.", + "nullable": true, + "example": "Prepares client-ready project status reports." + }, + "currentSystemPromptVersionId": { + "type": "string", + "description": "The current system prompt version.", + "format": "uuid", + "nullable": true, + "example": "fd077515-d4a8-4f79-9fbf-19271bd0123d" + }, + "modelProvider": { + "type": "string", + "description": "The configured model provider when no preset is selected.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The configured model name when no preset is selected.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "presetKey": { + "type": "string", + "description": "The configured workspace model preset key.", + "nullable": true, + "example": "balanced" + }, + "reasoningLevel": { + "type": "string", + "description": "The configured reasoning level.", + "nullable": true, + "example": "medium" + }, + "systemPrompt": { + "type": "string", + "description": "The current system prompt.", + "nullable": true, + "example": "Prepare concise client-ready project updates from awork data." + }, + "webSearchEnabled": { + "type": "boolean", + "description": "Whether web search is enabled.", + "example": true + }, + "aworkAccessEnabled": { + "type": "boolean", + "description": "Whether awork access is enabled.", + "example": true + }, + "googleGenAiAccessEnabled": { + "type": "boolean", + "description": "Whether Google image generation is enabled.", + "example": false + }, + "openAiImageGenerationAccessEnabled": { + "type": "boolean", + "description": "Whether OpenAI image generation is enabled.", + "example": false + }, + "skillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skills linked to the agent.", + "nullable": true + }, + "hasImage": { + "type": "boolean", + "description": "Whether the agent has a profile image.", + "example": true + }, + "isArchived": { + "type": "boolean", + "description": "Whether the agent is archived.", + "example": false + }, + "workspaceAccessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The workspace-wide access level.", + "nullable": true, + "example": "manage" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The requesting user's access level.", + "example": "manage" + } + }, + "additionalProperties": false, + "description": "Describes a custom agent and its current configuration." + }, + "AgentThreadArtifactResponseModel": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "The file path relative to the thread workspace.", + "nullable": true + }, + "fileName": { + "type": "string", + "description": "The final segment of the file path.", + "nullable": true + }, + "mimeType": { + "type": "string", + "description": "The file's MIME type.", + "nullable": true + }, + "sizeBytes": { + "type": "integer", + "description": "The file size in bytes.", + "format": "int64" + }, + "sha256": { + "type": "string", + "description": "The lowercase SHA-256 digest of the file content.", + "nullable": true + }, + "modifiedOn": { + "type": "string", + "description": "When the file was last modified.", + "format": "date-time", + "nullable": true + }, + "createdOn": { + "type": "string", + "description": "When the file was created.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes a file produced by an agent thread." + }, + "AgentThreadAttachmentRequestModel": { + "type": "object", + "properties": { + "temporaryFileId": { + "type": "string", + "description": "The identifier returned when uploading a temporary file. Do not also supply aworkFileId.", + "format": "uuid", + "nullable": true, + "example": "af6ac9db-479a-49b8-8e1b-994ba79e940f" + }, + "aworkFileId": { + "type": "string", + "description": "The identifier of an existing awork file the caller can read. Do not also supply temporaryFileId.", + "format": "uuid", + "nullable": true, + "example": "7a5c994a-320a-4850-a7a8-dad86809d3ef" + } + }, + "additionalProperties": false, + "description": "References an attached file. Supply exactly one of temporaryFileId or aworkFileId." + }, + "AgentThreadEventResponseModel": { + "type": "object", + "properties": { + "sequence": { + "type": "integer", + "description": "The event's durable order within the thread.", + "format": "int64" + }, + "eventName": { + "type": "string", + "description": "The runtime event type.", + "nullable": true + }, + "dataJson": { + "type": "string", + "description": "The event payload as JSON.", + "nullable": true + }, + "traceId": { + "type": "string", + "description": "The distributed trace that produced the event.", + "nullable": true + }, + "createdOn": { + "type": "string", + "description": "When the event was created.", + "format": "date-time", + "nullable": true + }, + "createdBy": { + "type": "string", + "description": "The user or service that created the event.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "updatedOn": { + "type": "string", + "description": "When the event was last updated.", + "format": "date-time", + "nullable": true + }, + "updatedBy": { + "type": "string", + "description": "The user or service that last updated the event.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Describes a persisted agent thread event." + }, + "AgentThreadInvocationType": { + "enum": [ + "chat", + "task-assignment", + "project-assignment" + ], + "type": "string", + "description": "Identifies how an agent thread starts." + }, + "AgentThreadMessageRequestModel": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "The message text. Required when no attachments are supplied.", + "nullable": true, + "example": "Summarize this project's progress, risks, and next steps." + }, + "attachments": { + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentThreadAttachmentRequestModel" + }, + "description": "Up to 20 distinct files attached to this message. Upload new files before submitting their identifiers.", + "nullable": true + }, + "modelProvider": { + "type": "string", + "description": "The provider for a model override. Supply it together with modelName.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The model to use for this message. It must be available in the workspace.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level for this message. Supported values depend on the selected model.", + "nullable": true, + "example": "medium" + }, + "toolAccess": { + "$ref": "#/components/schemas/AgentToolAccessOptionsModel" + }, + "connectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The connector selection for this message.", + "nullable": true + }, + "connectorConnections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentMessageConnectorConnectionRequestModel" + }, + "description": "Connection choices for custom-agent connectors. These do not change agent settings.", + "nullable": true + }, + "skillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skill selection for this message.", + "nullable": true + }, + "answerToInterruptId": { + "type": "string", + "description": "The interrupt identifier returned with the question being answered.", + "nullable": true, + "example": "interrupt_01K4CLIENTSTATUS" + } + }, + "additionalProperties": false, + "description": "Submits a follow-up message or answers a pending question in an agent conversation." + }, + "AgentThreadMessageResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the entity.", + "format": "uuid", + "example": "23e68187-91d6-4f7e-8d31-e3f2c60d7427" + }, + "createdOn": { + "type": "string", + "description": "The date this entity was created.", + "format": "date-time", + "example": "2022-03-11T15:33:47.100Z" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created this entity.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "updatedOn": { + "type": "string", + "description": "The date this entity was last modified.", + "format": "date-time", + "example": "2022-03-11T21:15:00.100Z" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who last modified this entity.", + "format": "uuid", + "example": "3d844c62-7410-4df9-a5b2-78805c0ee260" + }, + "threadId": { + "type": "string", + "description": "The thread that owns the message.", + "format": "uuid", + "example": "6cbb219e-839d-4d23-b273-3a78bbd842ae" + }, + "parentThreadId": { + "type": "string", + "description": "The parent thread for a delegated message.", + "format": "uuid", + "nullable": true, + "example": "b5a57e4d-0eec-45b6-b55e-4b70bf0f2a18" + }, + "role": { + "type": "string", + "description": "The message author's role.", + "nullable": true, + "example": "agent" + }, + "content": { + "type": "string", + "description": "The user-visible message text.", + "nullable": true, + "example": "The Acme website project is on track for Friday, with budget approval still pending." + }, + "clientMessageId": { + "type": "string", + "description": "The client-generated idempotency key for a user message.", + "nullable": true, + "example": "client-status-2026-08-29" + }, + "runtimeMessageId": { + "type": "string", + "description": "The stable message reference used by the runtime provider.", + "nullable": true, + "example": "msg_01K4CLIENTSTATUS" + }, + "model": { + "type": "string", + "description": "The model that produced the message.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "toolCallId": { + "type": "string", + "description": "The provider tool-call identifier associated with the message.", + "nullable": true, + "example": "call_01K4CLIENTSTATUS" + }, + "temporaryFiles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemporaryFileReference" + }, + "description": "The temporary files attached to the message.", + "nullable": true + }, + "toolCalls": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiToolCall" + }, + "description": "The tool calls stored with this message.", + "nullable": true + }, + "reasoning": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentThreadReasoningResponseModel" + }, + "description": "The user-visible reasoning text stored with this message.", + "nullable": true + }, + "agentId": { + "type": "string", + "description": "The custom agent that produced the message, if applicable.", + "format": "uuid", + "nullable": true, + "example": "4d22e163-2b4a-4d47-b51c-5b2217f84f57" + }, + "messageOrder": { + "type": "integer", + "description": "The message order.", + "format": "int32", + "example": 2 + }, + "isStreaming": { + "type": "boolean", + "description": "Whether the message is still streaming.", + "example": false + }, + "streamCompleted": { + "type": "boolean", + "description": "The stream completed.", + "example": true + }, + "traceId": { + "type": "string", + "description": "The distributed trace that produced the message.", + "nullable": true, + "example": "0af7651916cd43dd8448eb211c80319c" + }, + "modelProvider": { + "type": "string", + "description": "The model provider selected for this message.", + "nullable": true, + "example": "openai" + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level selected for this message.", + "nullable": true, + "example": "medium" + }, + "toolAccess": { + "$ref": "#/components/schemas/AgentToolAccessPolicy" + }, + "connectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The connector identifiers selected for this message.", + "nullable": true + }, + "skillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skill identifiers selected for this message.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes a message in an agent thread." + }, + "AgentThreadReasoningResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The provider reasoning item id.", + "nullable": true, + "example": "reasoning_01J8M7Q2A3B4C5D6E7F8G9H0JK" + }, + "text": { + "type": "string", + "description": "The safe reasoning summary text.", + "nullable": true, + "example": "Checked the project context before preparing the answer." + } + }, + "additionalProperties": false, + "description": "Represents user-visible reasoning text restored from a canonical chat payload." + }, + "AgentThreadResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the entity.", + "format": "uuid", + "example": "23e68187-91d6-4f7e-8d31-e3f2c60d7427" + }, + "createdOn": { + "type": "string", + "description": "The date this entity was created.", + "format": "date-time", + "example": "2022-03-11T15:33:47.100Z" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created this entity.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "updatedOn": { + "type": "string", + "description": "The date this entity was last modified.", + "format": "date-time", + "example": "2022-03-11T21:15:00.100Z" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who last modified this entity.", + "format": "uuid", + "example": "3d844c62-7410-4df9-a5b2-78805c0ee260" + }, + "type": { + "type": "string", + "description": "The thread type.", + "nullable": true, + "example": "custom-agent" + }, + "title": { + "type": "string", + "description": "The thread title.", + "nullable": true, + "example": "Weekly client status report" + }, + "status": { + "type": "string", + "description": "The thread status.", + "nullable": true, + "example": "completed" + }, + "isReadOnly": { + "type": "boolean", + "description": "Whether the requester may only read this thread.", + "example": false + }, + "contributors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiThreadContributorResponseModel" + }, + "description": "The users who explicitly joined this thread.", + "nullable": true + }, + "queue": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiThreadQueuedMessageResponseModel" + }, + "description": "The queued thread messages in dispatch order.", + "nullable": true + }, + "agentId": { + "type": "string", + "description": "The agent used for the initial execution.", + "format": "uuid", + "nullable": true, + "example": "4d22e163-2b4a-4d47-b51c-5b2217f84f57" + }, + "agentNameSnapshot": { + "type": "string", + "description": "The immutable initial agent name.", + "nullable": true, + "example": "Client Status Reporter" + }, + "executionOwnerUserId": { + "type": "string", + "description": "The user whose permissions applied to the initial execution.", + "format": "uuid", + "nullable": true, + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "executionTriggeredByUserId": { + "type": "string", + "description": "The user who triggered the initial execution.", + "format": "uuid", + "nullable": true, + "example": "52c28884-c751-4e0b-820c-9abe8a524a29" + }, + "executionType": { + "type": "string", + "description": "The initial execution type.", + "nullable": true, + "example": "chat" + }, + "executionSourceId": { + "type": "string", + "description": "The entity that caused the initial execution.", + "format": "uuid", + "nullable": true, + "example": "c907b29e-f640-4639-910d-722623fd5b4a" + }, + "modelProvider": { + "type": "string", + "description": "The model provider.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The provider model name.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "parentThreadId": { + "type": "string", + "description": "The parent thread id.", + "format": "uuid", + "nullable": true, + "example": "b5a57e4d-0eec-45b6-b55e-4b70bf0f2a18" + }, + "projectId": { + "type": "string", + "description": "The associated project id.", + "format": "uuid", + "nullable": true, + "example": "c907b29e-f640-4639-910d-722623fd5b4a" + }, + "taskId": { + "type": "string", + "description": "The associated task id.", + "format": "uuid", + "nullable": true, + "example": "d88ef8fa-e549-4ca6-96d8-83f5be9d37a2" + }, + "clientId": { + "type": "string", + "description": "The associated client id.", + "format": "uuid", + "nullable": true, + "example": "61341e18-3e3f-4efb-b471-b781e64f69f7" + }, + "documentId": { + "type": "string", + "description": "The associated document id.", + "format": "uuid", + "nullable": true, + "example": "5a442338-8da3-49e9-a702-b45d6f829d43" + }, + "startedOn": { + "type": "string", + "description": "When execution started.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:00:05Z" + }, + "completedOn": { + "type": "string", + "description": "When execution completed.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:01:42Z" + }, + "lastActivityOn": { + "type": "string", + "description": "The latest activity timestamp.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:01:42Z" + }, + "lastActivityBy": { + "type": "string", + "description": "The user responsible for the latest user-message activity.", + "format": "uuid", + "nullable": true, + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "failureReason": { + "type": "string", + "description": "The failure reason.", + "nullable": true, + "example": "The model provider could not complete the run." + }, + "lastSequence": { + "type": "integer", + "description": "The latest persisted event sequence.", + "format": "int64", + "example": 42 + }, + "latestThreadUpdateSequence": { + "type": "integer", + "description": "The latest event sequence that creates a thread update.", + "format": "int64", + "example": 42 + }, + "hasUpdate": { + "type": "boolean", + "description": "Whether the requester has an unseen update.", + "example": false + }, + "isArchived": { + "type": "boolean", + "description": "Whether the requester archived the thread.", + "example": false + }, + "archivedOn": { + "type": "string", + "description": "When the requester archived the thread.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T09:30:00Z" + }, + "isPinned": { + "type": "boolean", + "description": "Whether the requester pinned the thread.", + "example": false + }, + "pinnedOrder": { + "type": "number", + "description": "The requester's pinned order.", + "format": "double", + "nullable": true, + "example": 1 + }, + "isAwaitingAction": { + "type": "boolean", + "description": "Whether the thread awaits user action.", + "example": false + }, + "pendingBatchConfirmation": { + "$ref": "#/components/schemas/PendingBatchConfirmationResponseModel" + }, + "pendingUserQuestion": { + "$ref": "#/components/schemas/PendingUserQuestionResponseModel" + }, + "usedConnectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UsedConnectorResponseModel" + }, + "description": "Connectors used successfully in this thread on detail responses.", + "nullable": true + }, + "contextWindowUsageRatio": { + "type": "number", + "description": "The context-window usage ratio on detail responses.", + "format": "double", + "nullable": true, + "example": 0.42 + }, + "rating": { + "type": "string", + "description": "The personal-thread rating on detail responses.", + "nullable": true, + "example": "positive" + } + }, + "additionalProperties": false, + "description": "Describes an agent thread." + }, + "AgentThreadSeenRequestModel": { + "type": "object", + "properties": { + "updateSequence": { + "maximum": 9223372036854776000, + "minimum": 1, + "type": "integer", + "description": "The rendered thread update sequence to mark as seen.", + "format": "int64" + } + }, + "additionalProperties": false + }, + "AgentThreadSeenResponseModel": { + "type": "object", + "properties": { + "wasUpdated": { + "type": "boolean", + "description": "Whether the seen cursor advanced." + } + }, + "additionalProperties": false + }, + "AgentThreadUpdateCountResponseModel": { + "type": "object", + "properties": { + "updatedCount": { + "type": "integer", + "description": "The updated thread count.", + "format": "int32" + } + }, + "additionalProperties": false + }, + "AgentThreadWorkspaceIdModel": { + "type": "object", + "properties": { + "workspaceId": { + "type": "string", + "description": "The owning workspace id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false + }, + "AgentToTeamRequestModel": { + "type": "object", + "properties": { + "teamId": { + "type": "string", + "description": "The team that receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The access level to grant." + } + }, + "additionalProperties": false, + "description": "Shares an agent with a team." + }, + "AgentToTeamResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The access grant id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "teamId": { + "type": "string", + "description": "The team that receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The access level granted to the team." + } + }, + "additionalProperties": false, + "description": "Represents a team the agent is shared with." + }, + "AgentToolAccessDefaultsModel": { + "type": "object", + "properties": { + "awork": { + "type": "boolean", + "description": "A value indicating whether awork tools are enabled by default.", + "example": true + }, + "webSearch": { + "type": "boolean", + "description": "A value indicating whether web search is enabled by default.", + "example": true + }, + "googleGenAi": { + "type": "boolean", + "description": "A value indicating whether Google GenAI tools are enabled by default.", + "example": false + }, + "openAiImageGeneration": { + "type": "boolean", + "description": "A value indicating whether OpenAI image generation is enabled by default.", + "example": false + }, + "availableImageCapabilities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Image capability keys available in the workspace.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents default agent tool access settings." + }, + "AgentToolAccessOptionsModel": { + "type": "object", + "properties": { + "awork": { + "type": "boolean", + "description": "Whether awork tools are enabled for this run.", + "example": true + }, + "webSearch": { + "type": "boolean", + "description": "Whether web search is enabled for this run.", + "example": true + }, + "googleGenAi": { + "type": "boolean", + "description": "Whether Google GenAI tools are enabled for this run.", + "example": false + }, + "openAiImageGeneration": { + "type": "boolean", + "description": "Whether OpenAI image generation is enabled for this run.", + "example": false + } + }, + "additionalProperties": false, + "description": "Per-message agent tool access options." + }, + "AgentToolAccessPolicy": { + "type": "object", + "properties": { + "webSearchEnabled": { + "type": "boolean", + "description": "Whether web search was enabled.", + "example": true + }, + "aworkAccessEnabled": { + "type": "boolean", + "description": "Whether awork access was enabled.", + "example": true + }, + "googleGenAiAccessEnabled": { + "type": "boolean", + "description": "Whether Google image generation was enabled.", + "example": false + }, + "openAiImageGenerationAccessEnabled": { + "type": "boolean", + "description": "Whether OpenAI image generation was enabled.", + "example": false + } + }, + "additionalProperties": false, + "description": "Describes the tool access used for an agent message." + }, + "AgentUsageActiveUserResponseModel": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "ID of the user attributed with the credit usage.", + "format": "uuid", + "example": "84d132c8-9499-4e55-9e8f-fb79b1d4a610" + }, + "creditsUsed": { + "type": "integer", + "description": "Credit usage for the user, rounded to an integer.", + "format": "int64", + "example": 1840 + } + }, + "additionalProperties": false, + "description": "Represents one active user and their converted credit usage." + }, + "AgentUsageActivityDayResponseModel": { + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "UTC calendar date in yyyy-MM-dd format.", + "nullable": true, + "example": "2026-08-31" + }, + "activityCount": { + "type": "integer", + "description": "Number of distinct threads with cost usage on the date.", + "format": "int32", + "example": 3 + } + }, + "additionalProperties": false, + "description": "Represents agent activity for one UTC calendar day." + }, + "AgentUsageActivitySummaryResponseModel": { + "type": "object", + "properties": { + "activeUsers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentUsageActiveUserResponseModel" + }, + "description": "Users with positive credit usage, ordered by credit usage in descending order.", + "nullable": true, + "example": [ + { + "userId": "84d132c8-9499-4e55-9e8f-fb79b1d4a610", + "creditsUsed": 1840 + } + ] + }, + "days": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentUsageActivityDayResponseModel" + }, + "description": "Daily agent activity for the current and previous two UTC calendar months.", + "nullable": true, + "example": [ + { + "date": "2026-08-31", + "activityCount": 3 + } + ] + } + }, + "additionalProperties": false, + "description": "Contains workspace agent activity for the current and two previous calendar months." + }, + "AgentUsageCreditsDayResponseModel": { + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "UTC calendar date in yyyy-MM-dd format.", + "nullable": true, + "example": "2026-08-31" + }, + "creditsUsed": { + "type": "integer", + "description": "Credits allocated to the date as an integer.", + "format": "int64", + "example": 130 + } + }, + "additionalProperties": false, + "description": "Represents converted agent credit usage for one UTC calendar day." + }, + "AgentUsageCreditsSummaryResponseModel": { + "type": "object", + "properties": { + "totalThreads": { + "type": "integer", + "description": "Number of distinct threads with cost usage in the selected date range.", + "format": "int32", + "example": 42 + }, + "totalCreditsUsed": { + "type": "integer", + "description": "Credit usage in the selected date range, rounded up to an integer.", + "format": "int64", + "example": 2760 + }, + "days": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentUsageCreditsDayResponseModel" + }, + "description": "Daily credit usage for the selected date range, including dates with zero usage.", + "nullable": true, + "example": [ + { + "date": "2026-08-31", + "creditsUsed": 130 + } + ] + } + }, + "additionalProperties": false, + "description": "Contains workspace thread and credit usage for a date range." + }, + "AgentUsageOverviewResponseModel": { + "type": "object", + "properties": { + "activity": { + "$ref": "#/components/schemas/AgentUsageActivitySummaryResponseModel" + }, + "credits": { + "$ref": "#/components/schemas/AgentUsageCreditsSummaryResponseModel" + }, + "topConsumers": { + "$ref": "#/components/schemas/AgentUsageTopConsumersResponseModel" + } + }, + "additionalProperties": false, + "description": "Contains all data for the workspace agent usage overview widgets." + }, + "AgentUsageTopConsumerResponseModel": { + "type": "object", + "properties": { + "entityId": { + "type": "string", + "description": "ID of the Agent, user, project, or client represented by this entry. The entity type is defined by the requested grouping.", + "format": "uuid", + "example": "c17b45e8-14e2-48d1-8c4f-5b443331c2d8" + }, + "agentNameSnapshot": { + "type": "string", + "description": "Agent display name captured for the initial run. This is set for agent grouping and null for other groupings.", + "nullable": true + }, + "creditsUsed": { + "type": "integer", + "description": "Credit usage for the entity, rounded to an integer.", + "format": "int64", + "example": 920 + } + }, + "additionalProperties": false, + "description": "Represents one entity with high agent credit usage." + }, + "AgentUsageTopConsumersResponseModel": { + "type": "object", + "properties": { + "groupBy": { + "type": "string", + "description": "Entity type used to group the entries.", + "nullable": true, + "example": "agent" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentUsageTopConsumerResponseModel" + }, + "description": "Up to five entities with positive credit usage, ordered by credit usage in descending order.", + "nullable": true, + "example": [ + { + "entityId": "c17b45e8-14e2-48d1-8c4f-5b443331c2d8", + "creditsUsed": 920 + } + ] + } + }, + "additionalProperties": false, + "description": "Contains the five entities with the highest agent credit usage." + }, + "AgentWorkflowStepResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The workflow step id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The agent that owns the workflow step.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "description": "The workflow step name.", + "nullable": true + }, + "stepKind": { + "enum": [ + "task", + "verifier" + ], + "type": "string", + "description": "The behavior of the workflow step.", + "nullable": true + }, + "delegationId": { + "type": "string", + "description": "The delegation executed by this step, if any.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "nextStepId": { + "type": "string", + "description": "The step to run after this step succeeds.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "rejectStepId": { + "type": "string", + "description": "The step to run when a verifier rejects the result.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "promptOverride": { + "type": "string", + "description": "Additional instructions supplied to this step.", + "nullable": true + }, + "outputName": { + "type": "string", + "description": "The name used to store this step's output.", + "nullable": true + }, + "failureMode": { + "enum": [ + "stop", + "continue" + ], + "type": "string", + "description": "How the workflow handles a failed step.", + "nullable": true + }, + "sortOrder": { + "type": "integer", + "description": "The step's display order.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Describes an agent workflow step." + }, + "AiExhaustedQuotaFallbackOptions": { + "type": "object", + "properties": { + "modelProvider": { + "type": "string", + "description": "The provider used for restricted execution.", + "nullable": true + }, + "modelName": { + "type": "string", + "description": "The model used for restricted execution.", + "nullable": true + }, + "reasoningEffort": { + "type": "string", + "description": "The reasoning effort used for restricted execution.", + "nullable": true + }, + "maxOutputTokens": { + "type": "integer", + "description": "The maximum output tokens generated by one restricted response.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Defines the restricted personal-agent runtime used after the primary quota binds." + }, + "AiPlanCreditAllowanceResponseModel": { + "type": "object", + "properties": { + "plan": { + "type": "string", + "description": "The configured paid plan or sponsored profile name.", + "nullable": true, + "example": "Pro" + }, + "planType": { + "$ref": "#/components/schemas/AiQuotaPlanType" + }, + "creditsIncluded": { + "type": "integer", + "description": "The whole credits included in the primary monthly quota, or null for an unlimited profile.", + "format": "int64", + "nullable": true, + "example": 7500 + }, + "isUnlimited": { + "type": "boolean", + "description": "Whether this item represents the unmetered sponsored profile." + } + }, + "additionalProperties": false, + "description": "Describes the customer-visible primary credit allowance for one AI plan or sponsored profile." + }, + "AiPlanStatusResponseModel": { + "type": "object", + "properties": { + "isAiPlanActive": { + "type": "boolean", + "description": "Whether the workspace AI plan is active." + } + }, + "additionalProperties": false, + "description": "Reports whether the current workspace has an active AI plan." + }, + "AiQuotaActivationOptions": { + "type": "object", + "properties": { + "quotaPlanOverride": { + "type": "string", + "description": "The minimum quota plan applied during the activation period. A user's higher paid plan still wins, and null disables the activation boost.", + "nullable": true, + "example": "Pro" + }, + "overrideDurationInPeriods": { + "type": "integer", + "description": "Number of monthly quota periods for which the activation boost remains effective. It must be one when a boost is configured and zero when disabled.", + "format": "int32", + "example": 1 + } + }, + "additionalProperties": false, + "description": "Defines the temporary minimum quota plan granted after a workspace activates awork AI for the first time." + }, + "AiQuotaAvailabilityResponseModel": { + "type": "object", + "properties": { + "accessSource": { + "type": "string", + "description": "Whether the entitlement is paid, sponsored, or included with the base plan.", + "nullable": true + }, + "quotaMode": { + "type": "string", + "description": "Whether the quota is blocked, metered, or unlimited.", + "nullable": true + }, + "isUnlimited": { + "type": "boolean", + "description": "True when the user has unlimited AI access." + }, + "isAvailable": { + "type": "boolean", + "description": "True when awork AI is active and the user is below every configured hard limit; otherwise false.", + "example": false + }, + "executionMode": { + "type": "string", + "description": "Whether execution is full, limited by exhausted-quota fallback, or blocked.", + "nullable": true + }, + "fallbackModelProvider": { + "type": "string", + "description": "The model provider used for exhausted-quota fallback execution. Null outside fallback mode.", + "nullable": true + }, + "fallbackModelName": { + "type": "string", + "description": "The model used for exhausted-quota fallback execution. Null outside fallback mode.", + "nullable": true + }, + "fallbackReasoningEffort": { + "type": "string", + "description": "The reasoning effort used for exhausted-quota fallback execution. Null outside fallback mode.", + "nullable": true + }, + "unavailableReason": { + "type": "string", + "description": "Machine-readable reason for an unavailable result: `quota_exhausted` or `awork_ai_inactive`. Null when AI is available.", + "nullable": true, + "example": "quota_exhausted" + }, + "availableAgainOn": { + "type": "string", + "description": "Earliest known UTC time at which the exhausted limit releases or resets. Null when no reliable time is known.", + "format": "date-time", + "nullable": true, + "example": "2026-09-01T00:00:00Z" + }, + "plan": { + "type": "string", + "description": "The user's assigned entitlement plan.", + "nullable": true, + "example": "Starter" + }, + "quotaPlan": { + "type": "string", + "description": "The effective quota plan used for the current period.", + "nullable": true, + "example": "Pro" + }, + "activationBoostEndsOn": { + "type": "string", + "description": "The exclusive end of the first-activation boost. Null when no boost applies.", + "format": "date-time", + "nullable": true + }, + "creditsIncluded": { + "type": "integer", + "description": "The effective primary credit allowance.", + "format": "int64", + "nullable": true, + "example": 7500 + }, + "creditsUsed": { + "type": "integer", + "description": "The whole credits consumed in the current primary period.", + "format": "int64", + "nullable": true, + "example": 1824 + }, + "creditsAvailable": { + "type": "integer", + "description": "The non-negative whole credits remaining in the current primary period.", + "format": "int64", + "nullable": true, + "example": 5676 + }, + "creditsUsedPercentage": { + "type": "number", + "description": "The percentage of primary credits consumed, capped at 100.", + "format": "double", + "nullable": true, + "example": 24.3 + }, + "primaryPeriodEndOn": { + "type": "string", + "description": "The exclusive end of the current primary credit period.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Reports whether the authenticated user may start AI execution and exposes customer-safe credit usage." + }, + "AiQuotaConfigurationResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Identifier of this immutable configuration version. Clients use it for optimistic concurrency when saving a replacement.", + "format": "uuid", + "example": "7f46eb64-ae32-4ac7-af03-118c5599c684" + }, + "options": { + "$ref": "#/components/schemas/AiQuotaOptions" + }, + "createdOn": { + "type": "string", + "description": "UTC time at which this version was created.", + "format": "date-time", + "example": "2026-08-03T09:30:00Z" + }, + "createdBy": { + "type": "string", + "description": "Identifier of the authenticated internal operator who created this version.", + "format": "uuid", + "example": "b35d6f6d-fcc2-4e41-9380-1c14c2948847" + } + }, + "additionalProperties": false, + "description": "Returns one immutable AI quota configuration version together with its audit metadata." + }, + "AiQuotaLimitOptions": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Stable identifier for this limit within its plan, used to match configuration, stored snapshots, and temporary overrides.", + "nullable": true, + "example": "monthly" + }, + "role": { + "type": "string", + "description": "Purpose of the limit shown in administrator status: `Primary` is the plan's monthly allowance, `Secondary` paces usage over a shorter period, and `ShortTerm` limits bursts.", + "nullable": true, + "example": "Primary" + }, + "amountType": { + "type": "string", + "description": "Determines how AiService.Feature.Quota.Models.AiQuotaLimitOptions.AmountValue is calculated: `AbsoluteCredits` is a fixed customer-credit amount and `PercentOfPrimary` derives an amount from the plan's primary limit.", + "nullable": true, + "example": "AbsoluteCredits" + }, + "amountValue": { + "type": "number", + "description": "Limit amount expressed either as customer credits or as a whole-number percentage of the primary limit, according to AiService.Feature.Quota.Models.AiQuotaLimitOptions.AmountType.", + "format": "double", + "example": 1750 + }, + "windowType": { + "type": "string", + "description": "Determines the evaluated time range: `Aligned` uses fixed boundaries from AiService.Feature.Quota.Models.AiQuotaLimitOptions.WindowAnchor, while `Rolling` looks back from the current check time.", + "nullable": true, + "example": "Aligned" + }, + "windowUnit": { + "type": "string", + "description": "Time unit combined with AiService.Feature.Quota.Models.AiQuotaLimitOptions.WindowLength to define the limit's evaluation period: `Month`, `Day`, or `Hour`.", + "nullable": true, + "example": "Month" + }, + "windowLength": { + "type": "integer", + "description": "Number of AiService.Feature.Quota.Models.AiQuotaLimitOptions.WindowUnit units included in one evaluation period.", + "format": "int32", + "example": 1 + }, + "windowAnchor": { + "type": "string", + "description": "Boundary from which aligned windows are calculated. `QuotaPeriodStart` ties them to the workspace's shared monthly quota period.", + "nullable": true, + "example": "QuotaPeriodStart" + }, + "enforcement": { + "type": "string", + "description": "Action taken once consumed credits reach the limit. `HardBlock` prevents new model and tool execution while allowing already-started runs to finish.", + "nullable": true, + "example": "HardBlock" + }, + "priority": { + "type": "integer", + "description": "Ordering value used to choose which exhausted limit is reported when multiple limits block the same user.", + "format": "int32", + "example": 1 + } + }, + "additionalProperties": false, + "description": "Defines one credit limit that is evaluated before AI model or tool execution begins." + }, + "AiQuotaOptions": { + "type": "object", + "properties": { + "plans": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/AiQuotaPlanOptions" + }, + "description": "Quota definitions keyed by logical paid plan name. `Starter` is required; additional plan names are allowed.", + "nullable": true, + "example": { + "Starter": { + "creditsPerUsd": 100, + "limits": [ + { + "key": "monthly", + "role": "Primary", + "amountType": "AbsoluteCredits", + "amountValue": 1750, + "windowType": "Aligned", + "windowUnit": "Month", + "windowLength": 1, + "windowAnchor": "QuotaPeriodStart", + "enforcement": "HardBlock", + "priority": 1 + } + ] + }, + "Plus": { + "creditsPerUsd": 100, + "limits": [ + { + "key": "monthly", + "role": "Primary", + "amountType": "AbsoluteCredits", + "amountValue": 3500, + "windowType": "Aligned", + "windowUnit": "Month", + "windowLength": 1, + "windowAnchor": "QuotaPeriodStart", + "enforcement": "HardBlock", + "priority": 1 + } + ] + }, + "Pro": { + "creditsPerUsd": 100, + "limits": [ + { + "key": "monthly", + "role": "Primary", + "amountType": "AbsoluteCredits", + "amountValue": 7500, + "windowType": "Aligned", + "windowUnit": "Month", + "windowLength": 1, + "windowAnchor": "QuotaPeriodStart", + "enforcement": "HardBlock", + "priority": 1 + } + ] + }, + "Max": { + "creditsPerUsd": 105, + "limits": [ + { + "key": "monthly", + "role": "Primary", + "amountType": "AbsoluteCredits", + "amountValue": 16000, + "windowType": "Aligned", + "windowUnit": "Month", + "windowLength": 1, + "windowAnchor": "QuotaPeriodStart", + "enforcement": "HardBlock", + "priority": 1 + } + ] + }, + "Ultra": { + "creditsPerUsd": 100, + "limits": [ + { + "key": "monthly", + "role": "Primary", + "amountType": "AbsoluteCredits", + "amountValue": 64000, + "windowType": "Aligned", + "windowUnit": "Month", + "windowLength": 1, + "windowAnchor": "QuotaPeriodStart", + "enforcement": "HardBlock", + "priority": 1 + } + ] + } + } + }, + "internalProfiles": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/AiQuotaPlanOptions" + }, + "description": "Profile definitions for sponsored users, including the special `NoCredits` and `Unlimited` modes.", + "nullable": true + }, + "allowUnlimitedInternalProfile": { + "type": "boolean", + "description": "Whether sponsored users can use the unmetered `Unlimited` profile." + }, + "includedPlans": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/AiQuotaPlanOptions" + }, + "description": "Included limited-access profiles keyed by normalized base-subscription plan.", + "nullable": true + }, + "exhaustedQuotaFallback": { + "$ref": "#/components/schemas/AiExhaustedQuotaFallbackOptions" + }, + "activation": { + "$ref": "#/components/schemas/AiQuotaActivationOptions" + } + }, + "additionalProperties": false, + "description": "Defines the complete global AI quota policy stored as one immutable configuration version." + }, + "AiQuotaPlanOptions": { + "type": "object", + "properties": { + "creditsPerUsd": { + "type": "number", + "description": "How many customer credits one USD of attributed provider cost consumes.", + "format": "double", + "example": 100 + }, + "limits": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiQuotaLimitOptions" + }, + "description": "Limits evaluated together for the plan. The user must remain below every hard limit to begin AI execution, and exactly one limit must have the `Primary` role.", + "nullable": true, + "example": [ + { + "key": "monthly", + "role": "Primary", + "amountType": "AbsoluteCredits", + "amountValue": 1750, + "windowType": "Aligned", + "windowUnit": "Month", + "windowLength": 1, + "windowAnchor": "QuotaPeriodStart", + "enforcement": "HardBlock", + "priority": 1 + } + ] + } + }, + "additionalProperties": false, + "description": "Defines every credit limit and the internal conversion factor for one logical awork AI plan." + }, + "AiQuotaPlanType": { + "enum": [ + "Paid", + "Sponsored" + ], + "type": "string", + "description": "Identifies the entitlement family for a customer-visible AI quota plan." + }, + "AiQuotaUsageResetResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The reset identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "scope": { + "type": "string", + "description": "The reset scope.", + "nullable": true + }, + "workspaceId": { + "type": "string", + "description": "The affected workspace, when applicable.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "userId": { + "type": "string", + "description": "The affected user, when applicable.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "resetOn": { + "type": "string", + "description": "The inclusive time from which usage counts again.", + "format": "date-time" + }, + "reason": { + "type": "string", + "description": "The reset explanation.", + "nullable": true + }, + "reference": { + "type": "string", + "description": "The optional incident or support reference.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Reports a stored AI quota usage reset." + }, + "AiSpeechTokenResponseModel": { + "type": "object", + "properties": { + "token": { + "type": "string", + "description": "The short-lived Azure Speech authorization token.", + "nullable": true + }, + "region": { + "type": "string", + "description": "The Azure Speech region the token belongs to.", + "nullable": true + }, + "expiresInSeconds": { + "type": "integer", + "description": "The number of seconds until the token expires.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Response model containing the authorization details required to initialize Azure Speech recognition." + }, + "AiThreadAdminMetadataResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The thread identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "type": { + "type": "string", + "description": "The thread type.", + "nullable": true + }, + "title": { + "type": "string", + "description": "The contextual thread title. A private thread title is available only to its creator.\nContributors do not widen this: they exist only on project- or task-backed threads, whose titles are never masked.", + "nullable": true + }, + "createdBy": { + "type": "string", + "description": "The human creator identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The associated Agent identifier.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentNameSnapshot": { + "type": "string", + "description": "The Agent display name captured for the initial run.", + "nullable": true + }, + "executionType": { + "type": "string", + "description": "The initial execution trigger type: direct, task-assignment, project-assignment, mention, schedule, automation, queue, delegation, or workflow.", + "nullable": true + }, + "projectId": { + "type": "string", + "description": "The project context identifier.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "taskId": { + "type": "string", + "description": "The task context identifier.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "clientId": { + "type": "string", + "description": "The client context identifier.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "status": { + "type": "string", + "description": "The current thread status.", + "nullable": true + }, + "creditsUsed": { + "type": "integer", + "description": "The whole credits attributed to this thread for workspace administration.\nThis display value is independent from aggregate quota accounting.", + "format": "int64" + }, + "createdOn": { + "type": "string", + "description": "When the thread was created.", + "format": "date-time", + "nullable": true + }, + "lastActivityOn": { + "type": "string", + "description": "When the thread last had user-visible activity.", + "format": "date-time", + "nullable": true + }, + "updatedOn": { + "type": "string", + "description": "When the thread was last updated.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Contains safe thread metadata for workspace AI administration." + }, + "AiThreadContributorResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The contributor identifier.", + "format": "uuid", + "example": "70c0f52e-d9af-45e7-b260-a75592a64e43" + }, + "userId": { + "type": "string", + "description": "The user identifier.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "accessLevel": { + "type": "string", + "description": "The contributor access level.", + "nullable": true, + "example": "manage" + } + }, + "additionalProperties": false, + "description": "Represents a user who explicitly joined an agent thread." + }, + "AiThreadCreateRequestModel": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "The message text. Required when no attachments are supplied.", + "nullable": true, + "example": "Summarize this project's progress, risks, and next steps." + }, + "attachments": { + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentThreadAttachmentRequestModel" + }, + "description": "Up to 20 distinct files attached to this message. Upload new files before submitting their identifiers.", + "nullable": true + }, + "modelProvider": { + "type": "string", + "description": "The provider for a model override. Supply it together with modelName.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The model to use for this message. It must be available in the workspace.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level for this message. Supported values depend on the selected model.", + "nullable": true, + "example": "medium" + }, + "toolAccess": { + "$ref": "#/components/schemas/AgentToolAccessOptionsModel" + }, + "connectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The connector selection for this message.", + "nullable": true + }, + "connectorConnections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentMessageConnectorConnectionRequestModel" + }, + "description": "Connection choices for custom-agent connectors. These do not change agent settings.", + "nullable": true + }, + "skillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skill selection for this message.", + "nullable": true + }, + "type": { + "minLength": 1, + "enum": [ + "personal-agent", + "custom-agent" + ], + "type": "string", + "description": "Select personal-agent for the awork Agent, or custom-agent for a configured workspace agent.", + "example": "custom-agent" + }, + "agentId": { + "type": "string", + "description": "The configured agent to run. Required for custom-agent threads; omit for ordinary personal-agent threads.", + "format": "uuid", + "example": "4d22e163-2b4a-4d47-b51c-5b2217f84f57" + }, + "title": { + "type": "string", + "description": "The thread title.", + "nullable": true, + "example": "Weekly client status report" + }, + "projectId": { + "type": "string", + "description": "The project context id.", + "format": "uuid", + "nullable": true, + "example": "c907b29e-f640-4639-910d-722623fd5b4a" + }, + "taskId": { + "type": "string", + "description": "The task context id.", + "format": "uuid", + "nullable": true, + "example": "d88ef8fa-e549-4ca6-96d8-83f5be9d37a2" + }, + "clientId": { + "type": "string", + "description": "The client context id.", + "format": "uuid", + "nullable": true, + "example": "61341e18-3e3f-4efb-b471-b781e64f69f7" + }, + "documentId": { + "type": "string", + "description": "The document context id.", + "format": "uuid", + "nullable": true, + "example": "5a442338-8da3-49e9-a702-b45d6f829d43" + } + }, + "additionalProperties": false, + "description": "Configures a new agent thread." + }, + "AiThreadCreatedResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The thread id.", + "format": "uuid", + "example": "6cbb219e-839d-4d23-b273-3a78bbd842ae" + }, + "threadRunId": { + "type": "string", + "description": "The current run id.", + "format": "uuid", + "nullable": true, + "example": "8f934a03-8f8b-44ea-9137-3ca563bb75e8" + }, + "acceptedMessageId": { + "type": "string", + "description": "The accepted first-message id, or null when the thread was created without a message.", + "format": "uuid", + "nullable": true, + "example": "66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a" + }, + "type": { + "type": "string", + "description": "The thread type.", + "nullable": true, + "example": "custom-agent" + }, + "title": { + "type": "string", + "description": "The thread title.", + "nullable": true, + "example": "Weekly client status report" + }, + "status": { + "enum": [ + "ready", + "accepted", + "queued", + "failed" + ], + "type": "string", + "description": "The creation result: ready without a first message, accepted with a first message, queued when the first message waits for a run, or failed to start.", + "example": "accepted" + }, + "createdOn": { + "type": "string", + "description": "The creation timestamp.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:00:00Z" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created the thread.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "updatedOn": { + "type": "string", + "description": "The last update timestamp.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:05:00Z" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who last updated the thread.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "agentId": { + "type": "string", + "description": "The custom agent assigned to the thread.", + "format": "uuid", + "nullable": true, + "example": "4d22e163-2b4a-4d47-b51c-5b2217f84f57" + }, + "projectId": { + "type": "string", + "description": "The associated project id.", + "format": "uuid", + "nullable": true, + "example": "c907b29e-f640-4639-910d-722623fd5b4a" + }, + "taskId": { + "type": "string", + "description": "The associated task id.", + "format": "uuid", + "nullable": true, + "example": "d88ef8fa-e549-4ca6-96d8-83f5be9d37a2" + }, + "clientId": { + "type": "string", + "description": "The associated client id.", + "format": "uuid", + "nullable": true, + "example": "61341e18-3e3f-4efb-b471-b781e64f69f7" + }, + "documentId": { + "type": "string", + "description": "The associated document id.", + "format": "uuid", + "nullable": true, + "example": "5a442338-8da3-49e9-a702-b45d6f829d43" + } + }, + "additionalProperties": false, + "description": "Describes a created agent thread." + }, + "AiThreadMessageAcceptedResponseModel": { + "type": "object", + "properties": { + "threadId": { + "type": "string", + "description": "The thread id.", + "format": "uuid", + "example": "6cbb219e-839d-4d23-b273-3a78bbd842ae" + }, + "threadRunId": { + "type": "string", + "description": "The run id when the message started immediately.", + "format": "uuid", + "nullable": true, + "example": "8f934a03-8f8b-44ea-9137-3ca563bb75e8" + }, + "acceptedMessageId": { + "type": "string", + "description": "The server-assigned message id. This identity is retained while queued and when execution starts.", + "format": "uuid", + "nullable": true, + "example": "66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a" + }, + "queuedMessageId": { + "type": "string", + "description": "The persisted queue entry id when the message must wait.", + "format": "uuid", + "nullable": true, + "example": "1d7279ac-342c-431c-bba5-16c65f2342c3" + }, + "queueOrder": { + "type": "integer", + "description": "The message's current queue position when it must wait.", + "format": "int32", + "nullable": true, + "example": 1 + }, + "isQueued": { + "type": "boolean", + "description": "Whether the backend stored the message in the queue.", + "example": false + }, + "status": { + "enum": [ + "accepted", + "queued", + "failed" + ], + "type": "string", + "description": "Whether the message was accepted for execution, queued behind another message, or failed to start.", + "example": "accepted" + } + }, + "additionalProperties": false, + "description": "Represents the backend's final acceptance decision for one submitted thread message." + }, + "AiThreadMessageProcessingStatusResponseModel": { + "type": "object", + "properties": { + "messageId": { + "type": "string", + "description": "The server-generated identifier of the accepted user message.", + "format": "uuid", + "example": "66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a" + }, + "status": { + "type": "string", + "description": "The processing status.", + "nullable": true, + "example": "completed" + }, + "hasAgentResponse": { + "type": "boolean", + "description": "Whether an agent response was persisted.", + "example": true + }, + "responseId": { + "type": "string", + "description": "The persisted agent response id.", + "nullable": true, + "example": "msg_01K4CLIENTSTATUS" + }, + "lastSequenceNumber": { + "type": "integer", + "description": "The last streamed sequence number observed for the response.", + "format": "int32", + "nullable": true, + "example": 42 + }, + "error": { + "type": "string", + "description": "The processing error, if any.", + "nullable": true, + "example": "The model provider could not complete the run." + } + }, + "additionalProperties": false, + "description": "Represents the processing status for a thread message." + }, + "AiThreadQueueResponseModel": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiThreadQueuedMessageResponseModel" + }, + "description": "The ordered queued messages.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the shared queued-message state for one thread." + }, + "AiThreadQueuedMessageOrderRequestModel": { + "required": [ + "order" + ], + "type": "object", + "properties": { + "order": { + "maximum": 10, + "minimum": 1, + "type": "integer", + "description": "The requested one-based queue position.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Represents a request to move one queued message." + }, + "AiThreadQueuedMessageResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the entity.", + "format": "uuid", + "example": "23e68187-91d6-4f7e-8d31-e3f2c60d7427" + }, + "createdOn": { + "type": "string", + "description": "The date this entity was created.", + "format": "date-time", + "example": "2022-03-11T15:33:47.100Z" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created this entity.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "updatedOn": { + "type": "string", + "description": "The date this entity was last modified.", + "format": "date-time", + "example": "2022-03-11T21:15:00.100Z" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who last modified this entity.", + "format": "uuid", + "example": "3d844c62-7410-4df9-a5b2-78805c0ee260" + }, + "threadId": { + "type": "string", + "description": "The owning thread id.", + "format": "uuid", + "example": "6cbb219e-839d-4d23-b273-3a78bbd842ae" + }, + "queueOrder": { + "type": "integer", + "description": "The position in the queue.", + "format": "int32", + "example": 1 + }, + "displayText": { + "type": "string", + "description": "The text shown in the queue.", + "nullable": true, + "example": "Add client-ready risks and next steps to the status report." + }, + "payload": { + "$ref": "#/components/schemas/AgentThreadMessageRequestModel" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemporaryFileReference" + }, + "description": "Attachment display metadata resolved by the server. This metadata is not part of the editable request.", + "nullable": true + }, + "responsibleUserId": { + "type": "string", + "description": "The user whose permissions apply at dispatch time.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "blockedReason": { + "type": "string", + "description": "The stable reason that prevents automatic dispatch.", + "nullable": true, + "example": "interrupted" + } + }, + "additionalProperties": false, + "description": "Represents one message request waiting in a thread queue." + }, + "AiThreadQueuedMessageUpdateRequestModel": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "The message text. Required when no attachments are supplied.", + "nullable": true, + "example": "Summarize this project's progress, risks, and next steps." + }, + "attachments": { + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentThreadAttachmentRequestModel" + }, + "description": "Up to 20 distinct files attached to this message. Upload new files before submitting their identifiers.", + "nullable": true + }, + "modelProvider": { + "type": "string", + "description": "The provider for a model override. Supply it together with modelName.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The model to use for this message. It must be available in the workspace.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level for this message. Supported values depend on the selected model.", + "nullable": true, + "example": "medium" + }, + "toolAccess": { + "$ref": "#/components/schemas/AgentToolAccessOptionsModel" + }, + "connectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The connector selection for this message.", + "nullable": true + }, + "connectorConnections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentMessageConnectorConnectionRequestModel" + }, + "description": "Connection choices for custom-agent connectors. These do not change agent settings.", + "nullable": true + }, + "skillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skill selection for this message.", + "nullable": true + }, + "answerToInterruptId": { + "type": "string", + "description": "The interrupt identifier returned with the question being answered.", + "nullable": true, + "example": "interrupt_01K4CLIENTSTATUS" + } + }, + "additionalProperties": false, + "description": "Represents the complete replacement payload for a queued message." + }, + "AiThreadUpdateRequestModel": { + "type": "object", + "properties": { + "projectId": { + "type": "string", + "description": "The project to attach.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "title": { + "type": "string", + "description": "The thread title.", + "nullable": true + }, + "rating": { + "enum": [ + "positive", + "negative" + ], + "type": "string", + "description": "The user rating for the thread.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Updates agent thread details." + }, + "AiToolCall": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The provider tool call identifier.", + "nullable": true, + "example": "call_01K4CLIENTSTATUS" + }, + "toolName": { + "type": "string", + "description": "The runtime tool that was called.", + "nullable": true, + "example": "code_mode_execute" + }, + "connectorId": { + "type": "string", + "description": "The connector that supplied the tool, if applicable.", + "format": "uuid", + "nullable": true, + "example": "7e376777-7834-4af6-9eb8-da065f568d30" + }, + "connectionId": { + "type": "string", + "description": "The connector connection used by the tool, if applicable.", + "format": "uuid", + "nullable": true, + "example": "af18602d-c8aa-4f63-a21e-5a7f59b2412c" + }, + "arguments": { + "type": "object", + "additionalProperties": {}, + "description": "The structured arguments supplied to the tool.", + "nullable": true + }, + "response": { + "type": "string", + "description": "The serialized tool result.", + "nullable": true, + "example": "{\"status\":\"completed\"}" + } + }, + "additionalProperties": false, + "description": "Describes a tool call stored with an agent message." + }, + "AiUserPlanStateInternalModel": { + "type": "object", + "properties": { + "accessSource": { + "type": "string", + "description": "Whether the assignment is paid through Chargebee, sponsored by awork, a trial, or included with the base plan.", + "nullable": true + }, + "workspaceId": { + "type": "string", + "description": "Workspace whose AI entitlement owns the assignment and shared quota period.", + "format": "uuid", + "example": "0aa6f9a2-c11d-4ecf-a789-701b7c9c01aa" + }, + "userId": { + "type": "string", + "description": "Active awork user whose quota snapshot must be synchronized.", + "format": "uuid", + "example": "84d132c8-9499-4e55-9e8f-fb79b1d4a610" + }, + "plan": { + "type": "string", + "description": "Paid plan, sponsored profile, normalized included plan, or the NoAi marker of a seatless user\nin a paid workspace, confirmed by subscriptions-service.", + "nullable": true, + "example": "Plus" + }, + "fallbackQuotaPlan": { + "type": "string", + "description": "Normalized base-subscription plan that funds exhausted-quota fallback access.", + "nullable": true, + "example": "Professional" + }, + "quotaPlanOverride": { + "type": "string", + "description": "Temporary workspace minimum quota plan copied at first activation. The higher of this value and AiService.Feature.Quota.Models.AiUserPlanStateInternalModel.Plan determines the user's quota plan.", + "nullable": true, + "example": "Pro" + }, + "quotaPlanOverrideEndsOn": { + "type": "string", + "description": "Exclusive UTC end of the temporary minimum quota plan. Null when no activation boost applies.", + "format": "date-time", + "nullable": true, + "example": "2026-09-01T00:00:00Z" + }, + "primaryPeriodStartOn": { + "type": "string", + "description": "Inclusive UTC start of the workspace's current shared monthly quota period.", + "format": "date-time", + "example": "2026-08-01T00:00:00Z" + }, + "primaryPeriodEndOn": { + "type": "string", + "description": "Exclusive UTC end of the workspace's current shared monthly quota period.", + "format": "date-time", + "example": "2026-09-01T00:00:00Z" + }, + "workspaceCreditLimit": { + "type": "integer", + "description": "Shared monthly workspace credit maximum. Present only for sponsored access.", + "format": "int64", + "nullable": true + }, + "sourceVersion": { + "type": "integer", + "description": "Monotonically increasing subscriptions-service version used by ai-service to ignore stale or replayed synchronization messages.", + "format": "int64", + "example": 42 + } + }, + "additionalProperties": false, + "description": "Transfers one user's confirmed commercial AI plan and shared quota-period state from subscriptions-service to ai-service." + }, + "AiUserQuotaOverrideResponseModel": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "User whose quota adjustment was stored.", + "format": "uuid", + "example": "84d132c8-9499-4e55-9e8f-fb79b1d4a610" + }, + "effectiveOn": { + "type": "string", + "description": "UTC time at which the adjustment starts applying.", + "format": "date-time", + "example": "2026-08-03T10:00:00Z" + }, + "endsOn": { + "type": "string", + "description": "Exclusive UTC time at which the adjustment stops applying.", + "format": "date-time", + "example": "2026-09-01T00:00:00Z" + } + }, + "additionalProperties": false, + "description": "Confirms the stored temporary support adjustment and when it is effective." + }, + "AiUserQuotaStatusResponseModel": { + "type": "object", + "properties": { + "accessSource": { + "type": "string", + "description": "Whether the entitlement is paid, sponsored, or included with the base plan.", + "nullable": true + }, + "quotaMode": { + "type": "string", + "description": "Whether the quota is blocked, metered, or unlimited.", + "nullable": true + }, + "isUnlimited": { + "type": "boolean", + "description": "True when the user has unlimited AI access." + }, + "userId": { + "type": "string", + "description": "Identifier of the active awork user whose quota was evaluated.", + "format": "uuid", + "example": "84d132c8-9499-4e55-9e8f-fb79b1d4a610" + }, + "isBlocked": { + "type": "boolean", + "description": "True when at least one configured hard limit currently prevents the user from starting AI execution.", + "example": true + }, + "executionMode": { + "type": "string", + "description": "Whether execution is full, limited by exhausted-quota fallback, or blocked.", + "nullable": true + }, + "blockingLimitRole": { + "type": "string", + "description": "Administrator-facing category of the reported exhausted limit: `Primary` for monthly allowance, `Secondary` for pacing, or `ShortTerm` for burst protection. Null when the user is not blocked.", + "nullable": true, + "example": "Primary" + }, + "availableAgainOn": { + "type": "string", + "description": "Earliest known UTC time at which the reported limit releases or resets. Null when the user is not blocked or no reliable time is known.", + "format": "date-time", + "nullable": true, + "example": "2026-09-01T00:00:00Z" + }, + "canUpgrade": { + "type": "boolean", + "description": "True when the current catalog contains a self-service AI plan above the user's confirmed paid plan.", + "example": true + }, + "plan": { + "type": "string", + "description": "The user's assigned entitlement plan.", + "nullable": true + }, + "quotaPlan": { + "type": "string", + "description": "The effective quota plan used for the current period.", + "nullable": true + }, + "activationBoostEndsOn": { + "type": "string", + "description": "The exclusive end of the first-activation boost. Null when no boost applies.", + "format": "date-time", + "nullable": true + }, + "creditsIncluded": { + "type": "integer", + "description": "The effective primary credit allowance.", + "format": "int64", + "nullable": true + }, + "creditsUsed": { + "type": "integer", + "description": "The whole credits consumed in the current primary period.", + "format": "int64", + "nullable": true + }, + "creditsAvailable": { + "type": "integer", + "description": "The non-negative whole credits remaining in the current primary period.", + "format": "int64", + "nullable": true + }, + "creditsUsedPercentage": { + "type": "number", + "description": "The percentage of primary credits consumed, capped at 100.", + "format": "double", + "nullable": true + }, + "primaryPeriodEndOn": { + "type": "string", + "description": "The exclusive end of the current primary credit period.", + "format": "date-time", + "nullable": true + }, + "lastManualResetOn": { + "type": "string", + "description": "The latest manual quota usage reset that applies to this user.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Reports an eligible user's current customer-safe credit state to workspace administrators." + }, + "CompanySearchAvailabilityModel": { + "type": "object", + "properties": { + "available": { + "type": "boolean" + }, + "sources": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanySearchSourceModel" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "CompanySearchSourceModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "type": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "ConfirmationAction": { + "type": "object", + "properties": { + "actionDescriptionEn": { + "type": "string", + "description": "The English action description.", + "nullable": true, + "example": "Delete draft tasks" + }, + "actionDescriptionDe": { + "type": "string", + "description": "The German action description.", + "nullable": true, + "example": "Entwurfsaufgaben löschen" + }, + "itemNames": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The displayed affected item names.", + "nullable": true + }, + "itemCount": { + "type": "integer", + "description": "The item count.", + "format": "int32", + "example": 3 + }, + "hasMoreItems": { + "type": "boolean", + "description": "Whether more affected items exist.", + "example": false + } + }, + "additionalProperties": false, + "description": "A single action that requires confirmation with both English and German translations." + }, + "ConfirmationDetails": { + "type": "object", + "properties": { + "headerMessageEn": { + "type": "string", + "description": "The English confirmation heading.", + "nullable": true, + "example": "Delete draft tasks" + }, + "headerMessageDe": { + "type": "string", + "description": "The German confirmation heading.", + "nullable": true, + "example": "Entwurfsaufgaben löschen" + }, + "confirmationQuestionEn": { + "type": "string", + "description": "The English confirmation question.", + "nullable": true, + "example": "Delete 3 draft tasks from the Acme website project?" + }, + "confirmationQuestionDe": { + "type": "string", + "description": "The German confirmation question.", + "nullable": true, + "example": "3 Entwurfsaufgaben aus dem Acme-Website-Projekt löschen?" + }, + "confirmButtonTextEn": { + "type": "string", + "description": "The English confirm button label.", + "nullable": true, + "example": "Delete" + }, + "confirmButtonTextDe": { + "type": "string", + "description": "The German confirm button label.", + "nullable": true, + "example": "Löschen" + }, + "cancelButtonTextEn": { + "type": "string", + "description": "The English cancel button label.", + "nullable": true, + "example": "Cancel" + }, + "cancelButtonTextDe": { + "type": "string", + "description": "The German cancel button label.", + "nullable": true, + "example": "Abbrechen" + }, + "isDestructive": { + "type": "boolean", + "description": "Whether the action is destructive.", + "example": true + }, + "totalItemCount": { + "type": "integer", + "description": "The total item count.", + "format": "int32", + "example": 3 + }, + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfirmationAction" + }, + "description": "The actions that require confirmation.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Detailed confirmation information for the UI with both English and German translations." + }, + "ConnectionAdminMetadataResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The connection identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "description": "The safe connection display name.", + "nullable": true + }, + "connectorId": { + "type": "string", + "description": "The connector identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "connectorName": { + "type": "string", + "description": "The connector display name.", + "nullable": true + }, + "ownerUserId": { + "type": "string", + "description": "The connection owner.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "status": { + "type": "string", + "description": "The authorization state.", + "nullable": true + }, + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connection is shared with the workspace." + }, + "sharedUserCount": { + "type": "integer", + "description": "The number of direct user shares.", + "format": "int32" + }, + "sharedTeamCount": { + "type": "integer", + "description": "The number of team shares.", + "format": "int32" + }, + "createdOn": { + "type": "string", + "description": "When the connection was created.", + "format": "date-time", + "nullable": true + }, + "updatedOn": { + "type": "string", + "description": "When the connection was last updated.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Contains safe connection metadata for workspace AI administration." + }, + "ConnectionAuthorizationInitiationRequestModel": { + "type": "object", + "properties": { + "desktopCallbackScheme": { + "pattern": "^awork(?:-(?:develop|local))?$", + "type": "string", + "description": "The registered desktop protocol that receives the completed OAuth flow.", + "nullable": true, + "example": "awork" + } + }, + "additionalProperties": false, + "description": "Describes the client that starts a connector authorization flow." + }, + "ConnectionAuthorizationInitiationResponseModel": { + "type": "object", + "properties": { + "authUrl": { + "type": "string", + "description": "The URL where the user completes authorization.", + "nullable": true + }, + "error": { + "type": "string", + "description": "The machine-readable authorization error code.", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "The human-readable authorization error message.", + "nullable": true + }, + "connection": { + "$ref": "#/components/schemas/ConnectionResponseModel" + } + }, + "additionalProperties": false + }, + "ConnectionResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The connection identifier.", + "format": "uuid", + "example": "af18602d-c8aa-4f63-a21e-5a7f59b2412c" + }, + "connectorId": { + "type": "string", + "description": "The connector identifier.", + "format": "uuid", + "example": "7e376777-7834-4af6-9eb8-da065f568d30" + }, + "ownerUserId": { + "type": "string", + "description": "User identifier of the connection owner.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "name": { + "type": "string", + "description": "The connection display name.", + "nullable": true, + "example": "Client CRM connection" + }, + "externalIdentity": { + "type": "string", + "description": "The external identity associated with the connection.", + "nullable": true, + "example": "account.manager@northstar.agency" + }, + "status": { + "type": "string", + "description": "The human-readable connection status.", + "nullable": true, + "example": "connected" + }, + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connection is shared with the complete workspace.", + "example": true + }, + "isOwner": { + "type": "boolean", + "description": "Whether the current user owns the connection.", + "example": true + }, + "lastAuthenticatedOn": { + "type": "string", + "description": "When the connection was last authorized.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:00:00Z" + }, + "lastRefreshedOn": { + "type": "string", + "description": "When the connection's tools were last refreshed.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:05:00Z" + } + }, + "additionalProperties": false, + "description": "Represents an authenticated identity for an MCP connector." + }, + "ConnectionSharingModel": { + "type": "object", + "properties": { + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connection is shared with the complete workspace." + }, + "userIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The identifiers of users with access to the connection.", + "nullable": true + }, + "teamIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The identifiers of teams with access to the connection.", + "nullable": true + } + }, + "additionalProperties": false + }, + "ConnectionSharingRequestModel": { + "required": [ + "isSharedWithWorkspace" + ], + "type": "object", + "properties": { + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connection is shared with the complete workspace." + }, + "userIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The identifiers of users that should have access to the connection.", + "nullable": true + }, + "teamIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The identifiers of teams that should have access to the connection.", + "nullable": true + } + }, + "additionalProperties": false + }, + "ConnectionUpdateRequestModel": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string", + "description": "The connection display name." + } + }, + "additionalProperties": false + }, + "ConnectorEndpointFieldResponseModel": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The stable field key submitted when creating the connector.", + "nullable": true, + "example": "subdomain" + }, + "controlType": { + "type": "string", + "description": "The control type used to render the field.", + "nullable": true, + "example": "text" + }, + "labelKey": { + "type": "string", + "description": "The frontend translation key used to label the field.", + "nullable": true, + "example": "subdomain" + }, + "placeholderKey": { + "type": "string", + "description": "The optional frontend translation key used for the field placeholder.", + "nullable": true, + "example": "subdomain" + }, + "validationKind": { + "type": "string", + "description": "The optional validation kind applied to text values.", + "nullable": true, + "example": "hostLabel" + }, + "isRequired": { + "type": "boolean", + "description": "Whether the field must have a value.", + "example": true + }, + "defaultValue": { + "type": "string", + "description": "The optional default field value.", + "nullable": true, + "example": "northstar-agency" + }, + "maxLength": { + "type": "integer", + "description": "The optional maximum text length.", + "format": "int32", + "nullable": true, + "example": 63 + }, + "options": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectorEndpointOptionResponseModel" + }, + "description": "The available options for select fields.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes one user-facing field used to configure a predefined connector endpoint." + }, + "ConnectorEndpointOptionResponseModel": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "The stable option value submitted when creating the connector.", + "nullable": true, + "example": "eu" + }, + "labelKey": { + "type": "string", + "description": "The frontend translation key used to label the option.", + "nullable": true, + "example": "eu" + } + }, + "additionalProperties": false, + "description": "Represents one selectable connector endpoint option." + }, + "ConnectorEndpointValueResponseModel": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The stable endpoint field key.", + "nullable": true, + "example": "region" + }, + "labelKey": { + "type": "string", + "description": "The frontend translation key used to label the field.", + "nullable": true, + "example": "dataRegion" + }, + "value": { + "type": "string", + "description": "The configured non-secret field value.", + "nullable": true, + "example": "eu" + }, + "displayLabelKey": { + "type": "string", + "description": "The optional frontend translation key used instead of the raw value.", + "nullable": true, + "example": "eu" + } + }, + "additionalProperties": false, + "description": "Represents one safely displayable configured connector endpoint value." + }, + "ConnectorPresetCompanySearchModel": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the connector preset supports company search.", + "example": true + }, + "toolName": { + "type": "string", + "description": "The connector tool used for company search.", + "nullable": true, + "example": "search_companies" + }, + "queryParameterName": { + "type": "string", + "description": "The tool parameter that receives the search query.", + "nullable": true, + "example": "query" + } + }, + "additionalProperties": false + }, + "ConnectorPresetResponseModel": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The stable connector preset key.", + "nullable": true, + "example": "hubspot" + }, + "name": { + "type": "string", + "description": "The connector preset display name.", + "nullable": true, + "example": "HubSpot" + }, + "logoPath": { + "type": "string", + "description": "The connector preset logo path.", + "nullable": true, + "example": "images/integrations/hubspot_icon.svg" + }, + "supportsDynamicClientRegistration": { + "type": "boolean", + "description": "Whether the connector supports dynamic client registration.", + "example": false + }, + "requiresOAuthClientSecret": { + "type": "boolean", + "description": "Whether static OAuth configuration requires a client secret.", + "example": false + }, + "documentationUrl": { + "type": "string", + "description": "The connector documentation URL.", + "nullable": true, + "example": "https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server" + }, + "isDisabled": { + "type": "boolean", + "description": "Whether the connector preset is disabled.", + "example": false + }, + "managedOAuthProviderKey": { + "type": "string", + "description": "The key of the managed OAuth provider.", + "nullable": true, + "example": "hubspot" + }, + "showOAuthCredentials": { + "type": "boolean", + "description": "Whether OAuth credential inputs should be displayed.", + "nullable": true, + "example": false + }, + "companySearch": { + "$ref": "#/components/schemas/ConnectorPresetCompanySearchModel" + }, + "endpointFields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectorEndpointFieldResponseModel" + }, + "description": "The user-facing fields used to configure the connector endpoint.", + "nullable": true + } + }, + "additionalProperties": false + }, + "ConnectorPresetsResponseModel": { + "type": "object", + "properties": { + "presets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectorPresetResponseModel" + }, + "description": "The predefined connector presets.", + "nullable": true + }, + "oauthCallbackUri": { + "type": "string", + "description": "The OAuth callback URI to register with OAuth providers.", + "nullable": true, + "example": "https://app.awork.com/api/v1/agents/connectors/auth/callback" + } + }, + "additionalProperties": false, + "description": "Represents the connector setup configuration available to the frontend." + }, + "ConnectorResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the entity.", + "format": "uuid", + "example": "23e68187-91d6-4f7e-8d31-e3f2c60d7427" + }, + "createdOn": { + "type": "string", + "description": "The date this entity was created.", + "format": "date-time", + "example": "2022-03-11T15:33:47.100Z" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created this entity.", + "format": "uuid", + "example": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" + }, + "updatedOn": { + "type": "string", + "description": "The date this entity was last modified.", + "format": "date-time", + "example": "2022-03-11T21:15:00.100Z" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who last modified this entity.", + "format": "uuid", + "example": "3d844c62-7410-4df9-a5b2-78805c0ee260" + }, + "name": { + "type": "string", + "description": "The connector display name.", + "nullable": true, + "example": "Client CRM" + }, + "description": { + "type": "string", + "description": "The connector description.", + "nullable": true, + "example": "HubSpot CRM for lead and client account research." + }, + "url": { + "type": "string", + "description": "The custom connector URL.", + "nullable": true, + "example": null + }, + "presetKey": { + "type": "string", + "description": "The predefined connector key.", + "nullable": true, + "example": "hubspot" + }, + "endpointValues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectorEndpointValueResponseModel" + }, + "description": "The safely displayable configured endpoint values.", + "nullable": true + }, + "logoPath": { + "type": "string", + "description": "The preset logo path when this server matches a catalog preset.", + "nullable": true, + "example": "images/integrations/hubspot_icon.svg" + }, + "status": { + "type": "string", + "description": "The aggregate connection status.", + "nullable": true, + "example": "connected" + }, + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connector is shared with the workspace.", + "example": true + }, + "isOwner": { + "type": "boolean", + "description": "Whether the current user owns the connector.", + "example": true + }, + "currentUserConnectionStatus": { + "type": "string", + "description": "The current user's connection status.", + "nullable": true, + "example": "connected" + }, + "lastRefreshedOn": { + "type": "string", + "description": "When the server tools were last refreshed.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:05:00Z" + }, + "currentUserLastAuthenticatedOn": { + "type": "string", + "description": "When the current user last authenticated this server.", + "format": "date-time", + "nullable": true, + "example": "2026-08-29T08:00:00Z" + }, + "hasOAuthClientConfiguration": { + "type": "boolean", + "description": "Whether static OAuth client credentials are configured.", + "example": true + }, + "connectionMode": { + "type": "string", + "description": "The selected connection resolution mode for an agent-linked response.", + "nullable": true, + "example": "actingUser" + }, + "connectionId": { + "type": "string", + "description": "The selected specific connection, when applicable.", + "format": "uuid", + "nullable": true, + "example": "af18602d-c8aa-4f63-a21e-5a7f59b2412c" + }, + "currentUserConnectionId": { + "type": "string", + "description": "The connection selected by the current user for acting-user resolution.", + "format": "uuid", + "nullable": true, + "example": "af18602d-c8aa-4f63-a21e-5a7f59b2412c" + }, + "connections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectionResponseModel" + }, + "description": "The connections visible to the current user.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a connector returned by the agent runtime API." + }, + "ConnectorSharingModel": { + "type": "object", + "properties": { + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connector is visible to the complete workspace.", + "example": true + } + }, + "additionalProperties": false + }, + "ConnectorSharingRequestModel": { + "required": [ + "isSharedWithWorkspace" + ], + "type": "object", + "properties": { + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connector should be visible to the complete workspace.", + "example": true + } + }, + "additionalProperties": false + }, + "ConnectorToolResponseModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The tool name.", + "nullable": true + }, + "description": { + "type": "string", + "description": "The tool description.", + "nullable": true + }, + "inputSchema": { + "description": "The JSON schema describing the tool input.", + "nullable": true + } + }, + "additionalProperties": false + }, + "CopyAgentRequestModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name shown to users.", + "nullable": true, + "example": "Client Status Reporter" + }, + "description": { + "type": "string", + "description": "A short explanation of what the agent does.", + "nullable": true, + "example": "Prepares client-ready project status reports." + } + }, + "additionalProperties": false, + "description": "Configures a copied agent." + }, + "CreateAgentDelegationRequestModel": { + "type": "object", + "properties": { + "delegatedAgentId": { + "type": "string", + "description": "The agent that receives the delegated work.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "description": "The delegation name shown in workflow settings.", + "nullable": true + }, + "description": { + "type": "string", + "description": "A short explanation of the delegated work.", + "nullable": true + }, + "executionMode": { + "enum": [ + "auto", + "handoff", + "orchestrated", + "orchestracted", + "parallel", + "sequential", + "tool" + ], + "type": "string", + "description": "How the parent agent invokes the delegated agent.", + "nullable": true + }, + "promptOverride": { + "type": "string", + "description": "Additional instructions supplied to the delegated agent.", + "nullable": true + }, + "sortOrder": { + "type": "integer", + "description": "The delegation's display order.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Configures a new delegation to another agent." + }, + "CreateAgentMemoryRequestModel": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "The content Mem0 should infer memory from.", + "nullable": true + }, + "scope": { + "type": "string", + "description": "The memory scope. Defaults to agent.", + "nullable": true + }, + "projectId": { + "type": "string", + "description": "The project id for project-scoped memory.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "clientId": { + "type": "string", + "description": "The client id for client-scoped memory.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Represents a request to store a new agent memory." + }, + "CreateAgentRequestModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name shown to users.", + "nullable": true, + "example": "Client Status Reporter" + }, + "description": { + "type": "string", + "description": "A short explanation of what the agent does.", + "nullable": true, + "example": "Prepares client-ready project status reports." + }, + "modelProvider": { + "type": "string", + "description": "The provider that hosts the model.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The model to run.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "presetKey": { + "type": "string", + "description": "The workspace model preset to use.", + "nullable": true, + "example": "balanced" + }, + "reasoningLevel": { + "type": "string", + "description": "The amount of reasoning the model uses.", + "nullable": true, + "example": "medium" + }, + "systemPrompt": { + "type": "string", + "description": "The instructions that control the agent's behavior.", + "nullable": true, + "example": "Prepare concise client-ready project updates from awork data." + }, + "webSearchEnabled": { + "type": "boolean", + "description": "Whether web search is enabled.", + "nullable": true, + "example": true + }, + "aworkAccessEnabled": { + "type": "boolean", + "description": "Whether the agent can use awork tools.", + "nullable": true, + "example": true + }, + "googleGenAiAccessEnabled": { + "type": "boolean", + "description": "Whether the agent can generate images with Google models.", + "nullable": true, + "example": false + }, + "openAiImageGenerationAccessEnabled": { + "type": "boolean", + "description": "Whether the agent can generate images with OpenAI models.", + "nullable": true, + "example": false + } + }, + "additionalProperties": false, + "description": "Configures a new custom agent." + }, + "CreateAgentScheduleRequestModel": { + "required": [ + "cronRule", + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string", + "description": "The schedule display name.", + "example": "Weekly client status report" + }, + "prompt": { + "maxLength": 25000, + "type": "string", + "description": "Optional custom instructions for the initial message. Omitted, null, or blank input clears custom instructions.", + "nullable": true, + "example": "Summarize progress, risks, and next steps for the Acme website project." + }, + "cronRule": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "The cron rule used for recurring execution.", + "example": "0 9 * * 1" + }, + "recurrenceInterval": { + "maximum": 99, + "minimum": 1, + "type": "integer", + "description": "The number of matching cron occurrences between scheduled runs.", + "format": "int32", + "nullable": true, + "example": 2 + }, + "timezone": { + "maxLength": 100, + "type": "string", + "description": "The timezone for the cron rule.", + "nullable": true, + "example": "Europe/Berlin" + }, + "projectId": { + "type": "string", + "description": "The optional project context id.", + "format": "uuid", + "nullable": true, + "example": "c907b29e-f640-4639-910d-722623fd5b4a" + }, + "taskId": { + "type": "string", + "description": "The optional task context id.", + "format": "uuid", + "nullable": true, + "example": "d88ef8fa-e549-4ca6-96d8-83f5be9d37a2" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether the schedule is enabled.", + "nullable": true, + "example": true + } + }, + "additionalProperties": false, + "description": "Represents the request payload for creating a scheduled agent run." + }, + "CreateAgentWorkflowStepRequestModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The workflow step name.", + "nullable": true + }, + "stepKind": { + "enum": [ + "task", + "verifier" + ], + "type": "string", + "description": "The behavior of the workflow step.", + "nullable": true + }, + "delegationId": { + "type": "string", + "description": "The delegation executed by this step, if any.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "nextStepId": { + "type": "string", + "description": "The step to run after this step succeeds.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "rejectStepId": { + "type": "string", + "description": "The step to run when a verifier rejects the result.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "promptOverride": { + "type": "string", + "description": "Additional instructions supplied to this step.", + "nullable": true + }, + "outputName": { + "type": "string", + "description": "The name used to store this step's output.", + "nullable": true + }, + "failureMode": { + "enum": [ + "stop", + "continue" + ], + "type": "string", + "description": "How the workflow handles a failed step.", + "nullable": true + }, + "sortOrder": { + "type": "integer", + "description": "The step's display order.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Configures a new agent workflow step." + }, + "CreateAiQuotaUsageResetRequestModel": { + "required": [ + "reason", + "scope" + ], + "type": "object", + "properties": { + "scope": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "Whether the reset targets a user, workspace, or all users." + }, + "userId": { + "type": "string", + "description": "The target user for a user reset.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "reason": { + "maxLength": 1000, + "minLength": 1, + "type": "string", + "description": "The required explanation for the reset." + }, + "reference": { + "maxLength": 255, + "type": "string", + "description": "An optional incident or support reference.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Requests an auditable reset of the usage counted against an AI quota." + }, + "CreateConnectorRequestModel": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "presetKey": { + "maxLength": 100, + "type": "string", + "description": "The optional backend-defined connector preset key.", + "nullable": true, + "example": "hubspot" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string", + "description": "The connector display name.", + "example": "Client CRM" + }, + "description": { + "maxLength": 25000, + "type": "string", + "description": "The optional connector description.", + "nullable": true, + "example": "HubSpot CRM for lead and client account research." + }, + "url": { + "maxLength": 2048, + "type": "string", + "description": "The URL for a custom connector.", + "nullable": true, + "example": null + }, + "endpointValues": { + "type": "object", + "additionalProperties": { + "type": "string", + "nullable": true + }, + "description": "The structured endpoint values for a predefined connector preset.", + "nullable": true + }, + "oAuthClientId": { + "maxLength": 750, + "type": "string", + "description": "The optional OAuth client id.", + "nullable": true, + "example": null + }, + "oAuthClientSecret": { + "maxLength": 1000, + "type": "string", + "description": "The optional OAuth client secret.", + "nullable": true, + "example": null + }, + "isSharedWithWorkspace": { + "type": "boolean", + "description": "Whether the connector is shared with the workspace.", + "example": true + } + }, + "additionalProperties": false, + "description": "Represents a request to create a connector." + }, + "CreateSkillRequestModel": { + "required": [ + "instructions" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The stable key used to reference the skill.", + "nullable": true + }, + "name": { + "type": "string", + "description": "The name shown in the skill library.", + "nullable": true + }, + "description": { + "type": "string", + "description": "A short explanation of what the skill does.", + "nullable": true + }, + "instructions": { + "minLength": 1, + "type": "string", + "description": "The Markdown instruction body from `SKILL.md`." + }, + "instructionsSource": { + "type": "string", + "description": "The source from which the instructions were created.", + "nullable": true + }, + "metadata": { + "type": "string", + "description": "The skill frontmatter as a JSON object.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Configures a new reusable skill." + }, + "DisableModelsRequestModel": { + "type": "object", + "properties": { + "resourceType": { + "type": "string", + "description": "The resource type: model, vendor, or region.", + "nullable": true, + "example": "model" + }, + "resourceKey": { + "type": "string", + "description": "The resource key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "replacements": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelReplacementRequestModel" + }, + "description": "One replacement mapping for every affected source model.", + "nullable": true + }, + "presetReplacements": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelPresetReplacementRequestModel" + }, + "description": "One explicit replacement mapping for every affected preset.", + "nullable": true + }, + "confirmNoImageReplacement": { + "type": "boolean", + "description": "Whether disabling affected image models without a replacement was confirmed.", + "example": false + } + }, + "additionalProperties": false, + "description": "Represents one atomic workspace model disable and migration command." + }, + "ErrorResponse": { + "required": [ + "code", + "description", + "link" + ], + "type": "object", + "properties": { + "code": { + "minLength": 1, + "type": "string", + "description": "The error code.", + "example": "not-found" + }, + "description": { + "minLength": 1, + "type": "string", + "description": "The description of the error.", + "example": "There is no matching path for this URL." + }, + "link": { + "minLength": 1, + "type": "string", + "description": "The link to the API documentation page.", + "example": "https://developers.awork.com" + }, + "details": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of details describing the error.", + "nullable": true, + "example": [ + "No project with the id '123' exists." + ] + }, + "validationErrors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ValidationErrorResponse" + }, + "description": "If a validation error occurred, this contains the validation errors for each property.", + "nullable": true + }, + "traceId": { + "type": "string", + "description": "The request trace id for tracking the request.", + "nullable": true, + "example": "a65ce5745df02af216715ff06661fb3a" + } + }, + "additionalProperties": false, + "description": "The API error response." + }, + "EvaluationIngestionResponseModel": { + "type": "object", + "properties": { + "created": { + "type": "boolean", + "description": "Whether the request created a new record." + } + }, + "additionalProperties": false, + "description": "Describes whether an idempotent evaluation write created a record." + }, + "EvaluationRunPutForm": { + "required": [ + "environment", + "expectedCaseManifestJson", + "manifestFingerprint", + "sourceRevision", + "targetBranch", + "targetServiceVersion", + "triggerType" + ], + "type": "object", + "properties": { + "environment": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "The evaluated environment." + }, + "triggerType": { + "maxLength": 32, + "minLength": 0, + "type": "string", + "description": "Whether the run was scheduled or manually triggered." + }, + "sourceRevision": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "The evaluation-suite source revision." + }, + "targetBranch": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "The branch reported by the target AI service." + }, + "targetServiceVersion": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "The version reported by the target AI service." + }, + "targetRevision": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "The git revision reported by the target AI service, when the deployment exposes it.", + "nullable": true + }, + "workflowUrl": { + "maxLength": 1000, + "minLength": 0, + "type": "string", + "description": "The source workflow URL.", + "nullable": true + }, + "schemaVersion": { + "maximum": 2147483647, + "minimum": 1, + "type": "integer", + "description": "The result schema version.", + "format": "int32" + }, + "suiteVersion": { + "maximum": 2147483647, + "minimum": 1, + "type": "integer", + "description": "The expected suite version.", + "format": "int32" + }, + "manifestFingerprint": { + "maxLength": 128, + "minLength": 64, + "type": "string", + "description": "The SHA-256 fingerprint of the expected case manifest." + }, + "expectedCaseManifestJson": { + "maxLength": 25000, + "minLength": 0, + "type": "string", + "description": "The bounded expected case manifest JSON." + }, + "expectedTrialCount": { + "maximum": 1000, + "minimum": 1, + "type": "integer", + "description": "The number of expected trials.", + "format": "int32" + }, + "startedAt": { + "type": "string", + "description": "When the external run started.", + "format": "date-time" + } + }, + "additionalProperties": false, + "description": "Registers the expected scope of one external agent evaluation run." + }, + "EvaluationThreadRunUsageResponseModel": { + "type": "object", + "properties": { + "runId": { + "type": "string", + "description": "The run identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "clientMessageId": { + "type": "string", + "description": "The client message identifier of the run's trigger message, when present.", + "nullable": true + }, + "status": { + "type": "string", + "description": "The run status.", + "nullable": true + }, + "executionMode": { + "type": "string", + "description": "The quota execution mode used by the run.", + "nullable": true + }, + "modelProvider": { + "type": "string", + "description": "The model provider used by the run.", + "nullable": true + }, + "modelName": { + "type": "string", + "description": "The model name used by the run.", + "nullable": true + }, + "reasoningLevel": { + "type": "string", + "description": "The reasoning level snapshot of the run's trigger message, when present.", + "nullable": true + }, + "agentId": { + "type": "string", + "description": "The agent that performed the run, when present.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "systemPromptVersionId": { + "type": "string", + "description": "The immutable system-prompt version selected for the run, when one exists.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "inputTokens": { + "type": "integer", + "description": "The summed input tokens, or null when the run has no usage records.", + "format": "int64", + "nullable": true + }, + "outputTokens": { + "type": "integer", + "description": "The summed output tokens, or null when the run has no usage records.", + "format": "int64", + "nullable": true + }, + "cachedInputTokens": { + "type": "integer", + "description": "The summed cached input tokens, or null when the run has no usage records.", + "format": "int64", + "nullable": true + }, + "reasoningTokens": { + "type": "integer", + "description": "The summed reasoning tokens, or null when the run has no usage records.", + "format": "int64", + "nullable": true + }, + "costUsd": { + "type": "number", + "description": "The summed cost in US dollars, or null when any usage record has no cost.", + "format": "double", + "nullable": true + }, + "startedAt": { + "type": "string", + "description": "The time the run started.", + "format": "date-time", + "nullable": true + }, + "completedAt": { + "type": "string", + "description": "The time the run completed, failed, or was cancelled.", + "format": "date-time", + "nullable": true + }, + "toolCallCount": { + "type": "integer", + "description": "The number of tool calls recorded for the run.", + "format": "int32" + }, + "failedToolCallCount": { + "type": "integer", + "description": "The number of failed tool calls recorded for the run.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Describes one persisted run of an evaluation thread with its usage and tool-call totals." + }, + "EvaluationThreadUsageResponseModel": { + "type": "object", + "properties": { + "threadId": { + "type": "string", + "description": "The thread identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The thread's custom agent, when present.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "sourceType": { + "type": "string", + "description": "The thread's persisted source type, when present.", + "nullable": true + }, + "runs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EvaluationThreadRunUsageResponseModel" + }, + "description": "The thread's non-deleted runs ordered by start time.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes the persisted runs, usage, and tool-call totals of one evaluation thread." + }, + "EvaluationTrialPutForm": { + "required": [ + "result" + ], + "type": "object", + "properties": { + "result": { + "description": "The normalized structured result." + } + }, + "additionalProperties": false, + "description": "Contains one normalized agent evaluation trial result." + }, + "FilterQueryGenerationResult": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether the filter query was successfully generated." + }, + "filter": { + "type": "string", + "description": "The generated OData filter query (e.g., \"assignees/any(a: a/id eq me.id) and dueOn lt today\").\nNull if generation failed or no filter is needed.", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "Error message if generation failed.", + "nullable": true + }, + "errorCode": { + "type": "string", + "description": "Stable error code for programmatic handling.", + "nullable": true + }, + "reasoning": { + "type": "string", + "description": "AI's reasoning for how the prompt was converted to the filter query.\nUseful for debugging and understanding the AI's decision-making.", + "nullable": true + }, + "suggestion": { + "type": "string", + "description": "Helpful suggestion for the user if generation failed.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Result of generating an OData filter query from a natural language prompt for the Filter Feature." + }, + "FilterSuggestionGenerationItem": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Short label shown to the user.", + "nullable": true + }, + "prompt": { + "type": "string", + "description": "Natural-language prompt represented by the suggestion.", + "nullable": true + }, + "filter": { + "type": "string", + "description": "Additive Filter Feature query fragment represented by the suggestion.", + "nullable": true + }, + "reasoning": { + "type": "string", + "description": "Brief explanation of why this suggestion fits the existing filter.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "A single AI-generated contextual filter suggestion." + }, + "FilterSuggestionGenerationResult": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether suggestions were generated successfully." + }, + "suggestions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterSuggestionGenerationItem" + }, + "description": "Generated contextual suggestions.", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "Error message if generation failed.", + "nullable": true + }, + "errorCode": { + "type": "string", + "description": "Stable error code for programmatic handling.", + "nullable": true + }, + "reasoning": { + "type": "string", + "description": "AI's reasoning for the suggestion set.\nUseful for debugging and prompt evaluation.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Result of generating contextual Filter Feature suggestions." + }, + "GenerateFilterQueryModel": { + "required": [ + "entityType", + "prompt" + ], + "type": "object", + "properties": { + "prompt": { + "minLength": 1, + "type": "string", + "description": "The natural language prompt describing the desired filter.", + "example": "Show all my tasks that are overdue" + }, + "entityType": { + "minLength": 1, + "enum": [ + "tasks", + "projects", + "companies", + "users" + ], + "type": "string", + "description": "The entity type to generate the filter for.", + "example": "tasks" + }, + "languageCode": { + "type": "string", + "description": "Optional language code for localized suggestions (e.g., \"en-GB\", \"de-DE\").\nDefaults to \"en\" if not provided.", + "nullable": true, + "example": "en-GB" + }, + "existingFilterQuery": { + "type": "string", + "description": "Optional existing Filter Feature query that should be rewritten by the prompt.\nWhen supplied, the generated query must be the complete replacement query.", + "nullable": true, + "example": "assignees/any(a: a/id eq me.id)" + } + }, + "additionalProperties": false, + "description": "Model for generating a filter query from a natural language prompt." + }, + "GenerateFilterSuggestionsModel": { + "required": [ + "entityType", + "existingFilterQuery" + ], + "type": "object", + "properties": { + "entityType": { + "minLength": 1, + "enum": [ + "tasks", + "projects", + "companies", + "users" + ], + "type": "string", + "description": "The entity type to generate filter suggestions for.", + "example": "tasks" + }, + "existingFilterQuery": { + "minLength": 1, + "type": "string", + "description": "The existing Filter Feature query that should be extended by the suggestions.", + "example": "assignees/any(a: a/id eq me.id)" + }, + "languageCode": { + "type": "string", + "description": "Optional language code for localized suggestion titles and prompts.\nDefaults to \"en\" if not provided.", + "nullable": true, + "example": "en-GB" + } + }, + "additionalProperties": false, + "description": "Model for generating contextual filter suggestions from an existing filter query." + }, + "GrantAiUserQuotaCreditsRequestModel": { + "required": [ + "credits", + "reason" + ], + "type": "object", + "properties": { + "credits": { + "type": "number", + "description": "The positive number of credits to add to the current period.", + "format": "double", + "example": 1000 + }, + "reason": { + "maxLength": 1000, + "minLength": 1, + "type": "string", + "description": "The operator explanation retained with the current override.", + "example": "Temporary allowance while investigating repeated tool retries" + } + }, + "additionalProperties": false, + "description": "Grants additional primary credits until the end of a user's current quota period." + }, + "ImportAgentPresetRequestModel": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string", + "description": "The name of the new custom agent." + } + }, + "additionalProperties": false, + "description": "Sets the name of a custom agent created from a preset." + }, + "ModelDisablePreflightResponseModel": { + "type": "object", + "properties": { + "resourceType": { + "type": "string", + "description": "The normalized resource type.", + "nullable": true, + "example": "model" + }, + "resourceKey": { + "type": "string", + "description": "The normalized resource key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "canDisable": { + "type": "boolean", + "description": "Whether the disable has no dependency or last-model block.", + "example": false + }, + "blockedReason": { + "type": "string", + "description": "The blocked reason, or an empty string when unblocked.", + "nullable": true, + "example": "At least one text model must remain enabled." + }, + "imageCapabilityDisableRequired": { + "type": "boolean", + "description": "Whether an affected image capability must be migrated or disabled.", + "example": false + }, + "affectedModels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelDisableSourceResponseModel" + }, + "description": "The distinct affected source models.", + "nullable": true + }, + "affectedPresets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelDisablePresetResponseModel" + }, + "description": "The affected presets.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the server-computed dependency preflight for a workspace model disable." + }, + "ModelDisablePresetResponseModel": { + "type": "object", + "properties": { + "presetKey": { + "type": "string", + "description": "The affected preset key.", + "nullable": true, + "example": "balanced" + }, + "isAuto": { + "type": "boolean", + "description": "Whether the preset currently uses central Auto resolution.", + "example": true + }, + "sourceModelKey": { + "type": "string", + "description": "The current source model key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "sourceModelDisplayName": { + "type": "string", + "description": "The current source model display name.", + "nullable": true, + "example": "GPT-5.6 Terra" + }, + "eligibleReplacements": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelDisableReplacementResponseModel" + }, + "description": "Active text replacement models that remain enabled after the change.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes one affected performance preset and its explicit replacement choices." + }, + "ModelDisableReplacementResponseModel": { + "type": "object", + "properties": { + "modelKey": { + "type": "string", + "description": "The stable replacement model key.", + "nullable": true, + "example": "openai:gpt-5.6-luna" + }, + "kind": { + "type": "string", + "description": "The model capability kind.", + "nullable": true, + "example": "text" + }, + "displayName": { + "type": "string", + "description": "The model display name.", + "nullable": true, + "example": "GPT-5.6 Luna" + }, + "vendorKey": { + "type": "string", + "description": "The stable vendor key.", + "nullable": true, + "example": "openai" + }, + "regionKey": { + "type": "string", + "description": "The stable region key.", + "nullable": true, + "example": "europe" + } + }, + "additionalProperties": false, + "description": "Describes one active replacement model that remains enabled after a disable." + }, + "ModelDisableSourceResponseModel": { + "type": "object", + "properties": { + "modelKey": { + "type": "string", + "description": "The stable source model key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "kind": { + "type": "string", + "description": "The model capability kind.", + "nullable": true, + "example": "text" + }, + "displayName": { + "type": "string", + "description": "The source model display name.", + "nullable": true, + "example": "GPT-5.6 Terra" + }, + "usageCount": { + "type": "integer", + "description": "The number of persisted agent and thread configurations using the source.", + "format": "int32", + "example": 4 + }, + "isReferencedByCustomAgents": { + "type": "boolean", + "description": "Whether a Custom agent uses the source.", + "example": true + }, + "requiresModelMapping": { + "type": "boolean", + "description": "Whether the disable command requires a source replacement mapping.", + "example": true + }, + "hasImageCapability": { + "type": "boolean", + "description": "Whether an image capability is enabled on a dependent version.", + "example": false + }, + "imageCapabilityNames": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The enabled image capability names.", + "nullable": true + }, + "eligibleReplacements": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelDisableReplacementResponseModel" + }, + "description": "Active replacement models that remain enabled after the change.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes one affected source model and its dependent references." + }, + "ModelPresetReplacementRequestModel": { + "type": "object", + "properties": { + "presetKey": { + "type": "string", + "description": "The affected preset key.", + "nullable": true, + "example": "balanced" + }, + "replacementModelKey": { + "type": "string", + "description": "The replacement model key.", + "nullable": true, + "example": "openai:gpt-5.6-luna" + } + }, + "additionalProperties": false, + "description": "Maps one affected performance preset to an explicit replacement model." + }, + "ModelReplacementRequestModel": { + "type": "object", + "properties": { + "sourceModelKey": { + "type": "string", + "description": "The affected source model key.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "replacementModelKey": { + "type": "string", + "description": "The replacement model key, or null for a confirmed image capability removal.", + "nullable": true, + "example": "openai:gpt-5.6-luna" + } + }, + "additionalProperties": false, + "description": "Maps one source catalog model to one replacement catalog model." + }, + "PendingBatchConfirmationResponseModel": { + "type": "object", + "properties": { + "confirmationId": { + "type": "string", + "description": "The confirmation id.", + "nullable": true, + "example": "confirm_01K4CLIENTSTATUS" + }, + "confirmationMessage": { + "type": "string", + "description": "The confirmation message.", + "nullable": true, + "example": "Delete 3 draft tasks from the Acme website project?" + }, + "affectedItemCount": { + "type": "integer", + "description": "The affected item count.", + "format": "int32", + "example": 3 + }, + "isDestructive": { + "type": "boolean", + "description": "Whether the action is destructive.", + "example": true + }, + "confirmationDetails": { + "$ref": "#/components/schemas/ConfirmationDetails" + }, + "pendingToolCalls": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiToolCall" + }, + "description": "The tool calls awaiting confirmation.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a pending batch confirmation for an agent thread." + }, + "PendingUserQuestionResponseModel": { + "type": "object", + "properties": { + "toolCallId": { + "type": "string", + "description": "The tool call id.", + "nullable": true, + "example": "call_01K4CLIENTSTATUS" + }, + "userQuestion": { + "$ref": "#/components/schemas/UserQuestionDetails" + } + }, + "additionalProperties": false, + "description": "Represents a pending user question for an agent thread." + }, + "PersonalAgentConfigurationRequestModel": { + "type": "object", + "properties": { + "enabledConnectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The connector ids enabled for the current user's personal agent.", + "nullable": true + }, + "connectorConnections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonalAgentConnectorConfigurationModel" + }, + "description": "The connectors with their explicit default connections.", + "nullable": true + }, + "enabledSkillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skill ids enabled for the current user's personal agent.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the request payload for the current user's personal-agent configuration." + }, + "PersonalAgentConfigurationResponseModel": { + "type": "object", + "properties": { + "enabledConnectorIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The connector ids enabled for the current user's personal agent.", + "nullable": true + }, + "connectorConnections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonalAgentConnectorConfigurationModel" + }, + "description": "The connectors with their explicit default connections.", + "nullable": true + }, + "enabledSkillIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The skill ids enabled for the current user's personal agent.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the current user's personal-agent configuration." + }, + "PersonalAgentConnectorConfigurationModel": { + "required": [ + "connectorId", + "defaultConnectionId" + ], + "type": "object", + "properties": { + "connectorId": { + "type": "string", + "description": "The configured connector identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "defaultConnectionId": { + "type": "string", + "description": "The default connection identifier for the connector.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Represents a connector and its explicit default connection for the personal agent." + }, + "PublishAgentPresetDefinitionRequestModel": { + "required": [ + "detailedDescription", + "language" + ], + "type": "object", + "properties": { + "language": { + "minLength": 1, + "enum": [ + "en", + "de" + ], + "type": "string", + "description": "The published language." + }, + "detailedDescription": { + "maxLength": 25000, + "minLength": 1, + "type": "string", + "description": "The detailed catalog description." + } + }, + "additionalProperties": false, + "description": "Sets the language and description for an agent preset." + }, + "RememberAgentSessionMessageRequestModel": { + "type": "object", + "properties": { + "scope": { + "type": "string", + "description": "The memory scope. Defaults to agent.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a request to remember an existing session message." + }, + "SetAgentArchivedRequestModel": { + "type": "object", + "properties": { + "isArchived": { + "type": "boolean", + "description": "Whether the agent should be archived.", + "example": true + } + }, + "additionalProperties": false, + "description": "Sets whether an agent is archived." + }, + "SetAgentScheduleEnabledRequestModel": { + "required": [ + "isEnabled" + ], + "type": "object", + "properties": { + "isEnabled": { + "type": "boolean", + "description": "Whether the schedule is enabled." + } + }, + "additionalProperties": false, + "description": "Represents a request to enable or disable an agent schedule." + }, + "SetModelAutoEnableRequestModel": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether new models in enabled vendors and regions are enabled automatically.", + "example": true + } + }, + "additionalProperties": false, + "description": "Represents a workspace automatic-enablement change." + }, + "SetModelPresetRequestModel": { + "type": "object", + "properties": { + "isAuto": { + "type": "boolean", + "description": "Whether the preset uses the central Auto mapping.", + "example": false + }, + "modelKey": { + "type": "string", + "description": "The explicit model key when Auto is false.", + "nullable": true, + "example": "openai:gpt-5.6-terra" + }, + "reasoningLevel": { + "type": "string", + "description": "The explicit reasoning level when Auto is false.", + "nullable": true, + "example": "medium" + } + }, + "additionalProperties": false, + "description": "Represents a workspace preset assignment." + }, + "SetSkillSecretRequirementsRequestModel": { + "required": [ + "requirements" + ], + "type": "object", + "properties": { + "requirements": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SkillSecretRequirementRequestModel" + }, + "description": "The full set of secret requirements for the skill." + } + }, + "additionalProperties": false, + "description": "Represents the request payload that replaces the secret declarations of a skill." + }, + "SetSkillSecretValueRequestModel": { + "required": [ + "envVarName", + "scope", + "value" + ], + "type": "object", + "properties": { + "envVarName": { + "minLength": 1, + "type": "string", + "description": "The environment variable name the value belongs to." + }, + "scope": { + "minLength": 1, + "type": "string", + "description": "The scope of the value (\"workspace\" or \"user\")." + }, + "value": { + "minLength": 1, + "type": "string", + "description": "The secret value. It is stored encrypted and never returned by the API." + } + }, + "additionalProperties": false, + "description": "Represents the request payload that sets a skill secret value." + }, + "SetThreadArchivedRequestModel": { + "required": [ + "isArchived" + ], + "type": "object", + "properties": { + "isArchived": { + "type": "boolean", + "description": "Whether the thread should be archived." + } + }, + "additionalProperties": false, + "description": "Represents a request to change one thread's archived state for the current user." + }, + "SetThreadPinnedRequestModel": { + "required": [ + "isPinned" + ], + "type": "object", + "properties": { + "isPinned": { + "type": "boolean", + "description": "Whether the thread should be pinned." + } + }, + "additionalProperties": false, + "description": "Represents a request to change one thread's pinned state for the current user." + }, + "SkillContributorRequestModel": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The user who receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The granted access level." + } + }, + "additionalProperties": false, + "description": "A requested direct user access grant for a skill." + }, + "SkillContributorResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The access grant identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "skillId": { + "type": "string", + "description": "The shared skill identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "userId": { + "type": "string", + "description": "The user who receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The granted access level." + } + }, + "additionalProperties": false, + "description": "A direct user access grant for a skill." + }, + "SkillFileResponseModel": { + "type": "object", + "properties": { + "relativePath": { + "type": "string", + "description": "The path of the file relative to the skill root (for example \"scripts/sync.py\").", + "nullable": true + }, + "sizeBytes": { + "type": "integer", + "description": "The file size in bytes.", + "format": "int64" + } + }, + "additionalProperties": false, + "description": "Represents a bundled skill file in API responses." + }, + "SkillResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The skill identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "createdBy": { + "type": "string", + "description": "The user who created the skill.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "createdOn": { + "type": "string", + "description": "When the skill was created.", + "format": "date-time" + }, + "updatedOn": { + "type": "string", + "description": "When the skill was last updated.", + "format": "date-time", + "nullable": true + }, + "key": { + "type": "string", + "description": "The stable key used to reference the skill.", + "nullable": true + }, + "name": { + "type": "string", + "description": "The name shown in the skill library.", + "nullable": true + }, + "description": { + "type": "string", + "description": "A short explanation of what the skill does.", + "nullable": true + }, + "instructions": { + "type": "string", + "description": "The Markdown instruction body from `SKILL.md`.", + "nullable": true + }, + "instructionsSource": { + "type": "string", + "description": "The source from which the instructions were created.", + "nullable": true + }, + "type": { + "enum": [ + "user", + "agent" + ], + "type": "string", + "description": "The ownership type." + }, + "userId": { + "type": "string", + "description": "The owning user for a user-owned skill.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The owning agent for an agent-owned skill.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The requesting user's resolved access level." + }, + "isOwner": { + "type": "boolean", + "description": "Whether the requesting user owns the skill." + }, + "workspaceAccessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The workspace-wide access level.", + "nullable": true + }, + "linkedAgentCount": { + "type": "integer", + "description": "The number of linked agents.", + "format": "int32" + }, + "metadata": { + "type": "string", + "description": "The skill frontmatter as a JSON object.", + "nullable": true + }, + "hasFiles": { + "type": "boolean", + "description": "Whether the skill includes bundled files." + }, + "secretRequirements": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SkillSecretRequirementResponseModel" + }, + "description": "The secrets that the skill declares.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Describes a reusable skill." + }, + "SkillSecretRequirementRequestModel": { + "required": [ + "envVarName", + "scope" + ], + "type": "object", + "properties": { + "envVarName": { + "minLength": 1, + "type": "string", + "description": "The environment variable name the secret is injected as." + }, + "description": { + "type": "string", + "description": "The description shown to users when providing the secret.", + "nullable": true + }, + "scope": { + "minLength": 1, + "enum": [ + "workspace", + "user" + ], + "type": "string", + "description": "Who must provide the secret value." + }, + "isRequired": { + "type": "boolean", + "description": "Whether the secret is required for the skill to work." + } + }, + "additionalProperties": false, + "description": "Represents one secret requirement declaration in a set-requirements request." + }, + "SkillSecretRequirementResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The secret requirement identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "envVarName": { + "type": "string", + "description": "The environment variable name the secret is injected as.", + "nullable": true + }, + "description": { + "type": "string", + "description": "The description shown to users when providing the secret.", + "nullable": true + }, + "scope": { + "enum": [ + "workspace", + "user" + ], + "type": "string", + "description": "Who must provide the secret value." + }, + "isRequired": { + "type": "boolean", + "description": "Whether the secret is required for the skill to work." + }, + "hasValue": { + "type": "boolean", + "description": "Whether a value is available for the requesting user." + } + }, + "additionalProperties": false, + "description": "Represents a declared secret requirement of a skill." + }, + "SkillSecretValueStatusResponseModel": { + "type": "object", + "properties": { + "envVarName": { + "type": "string", + "description": "The environment variable name.", + "nullable": true + }, + "scope": { + "enum": [ + "workspace", + "user" + ], + "type": "string", + "description": "Who provided the stored value." + }, + "updatedOn": { + "type": "string", + "description": "When the value was last updated.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the existence metadata of a stored skill secret value. The value itself is never exposed." + }, + "SkillSharingResponseModel": { + "type": "object", + "properties": { + "workspaceAccessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The workspace-wide access level.", + "nullable": true + }, + "contributors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SkillContributorResponseModel" + }, + "description": "The direct user access grants.", + "nullable": true + }, + "teams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SkillToTeamResponseModel" + }, + "description": "The team access grants.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "The sharing configuration of a skill." + }, + "SkillToTeamRequestModel": { + "type": "object", + "properties": { + "teamId": { + "type": "string", + "description": "The team that receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The granted access level." + } + }, + "additionalProperties": false, + "description": "A requested team access grant for a skill." + }, + "SkillToTeamResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The access grant identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "skillId": { + "type": "string", + "description": "The shared skill identifier.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "teamId": { + "type": "string", + "description": "The team that receives access.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "accessLevel": { + "enum": [ + "read", + "manage" + ], + "type": "string", + "description": "The granted access level." + } + }, + "additionalProperties": false, + "description": "A team access grant for a skill." + }, + "SystemPromptVersionResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The prompt version id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "agentId": { + "type": "string", + "description": "The agent id.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "versionNumber": { + "type": "integer", + "description": "The version number, assigned in order of creation.", + "format": "int32" + }, + "isCurrent": { + "type": "boolean", + "description": "Whether this is the agent's current system prompt." + }, + "systemPrompt": { + "type": "string", + "description": "The system prompt.", + "nullable": true + }, + "createdOn": { + "type": "string", + "description": "The creation time of the system prompt version.", + "format": "date-time", + "nullable": true + }, + "createdBy": { + "type": "string", + "description": "The user who created the system prompt version.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Describes a saved system prompt version." + }, + "TableAuditEventModel": { + "type": "object", + "properties": { + "workspaceId": { + "type": "string", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "correlationId": { + "type": "string", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "userId": { + "type": "string", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "impersonatingUserId": { + "type": "string", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "traceId": { + "type": "string", + "nullable": true + }, + "websocketConnectionId": { + "type": "string", + "nullable": true + }, + "eventType": { + "type": "string", + "nullable": true + }, + "entityType": { + "type": "string", + "nullable": true + }, + "entityId": { + "type": "string", + "nullable": true + }, + "clientId": { + "type": "string", + "nullable": true + }, + "property": { + "type": "string", + "nullable": true + }, + "old": { + "type": "string", + "nullable": true + }, + "new": { + "type": "string", + "nullable": true + }, + "callStack": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "TemporaryFileReference": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The resource id.", + "nullable": true, + "example": "temp_01K4CLIENTBRIEF" + }, + "name": { + "type": "string", + "description": "The display name.", + "nullable": true, + "example": "acme-client-brief.pdf" + }, + "mimeType": { + "type": "string", + "description": "The file media type.", + "nullable": true, + "example": "application/pdf" + }, + "sandboxPath": { + "type": "string", + "description": "The canonical sandbox path assigned after file promotion.", + "nullable": true, + "example": "context/uploads/awork-9ad6397243964b0b9e7d40b852cdebf8-acme-client-brief.pdf" + }, + "downloadUrl": { + "type": "string", + "description": "The relative file download URL.", + "nullable": true, + "example": "/api/v1/agents/threads/6cbb219e-839d-4d23-b273-3a78bbd842ae/artifacts/download?path=client-status-report.pdf" + } + }, + "additionalProperties": false, + "description": "Describes a temporary file attached to an agent message." + }, + "ThreadListStateResponseModel": { + "type": "object", + "properties": { + "threadId": { + "type": "string", + "description": "The thread whose list state changed.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "isArchived": { + "type": "boolean", + "description": "Whether the thread is archived." + }, + "archivedOn": { + "type": "string", + "description": "When the thread was archived.", + "format": "date-time", + "nullable": true + }, + "isPinned": { + "type": "boolean", + "description": "Whether the thread is pinned." + }, + "pinnedOrder": { + "type": "number", + "description": "The thread's pinned order.", + "format": "double", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents one user's organization state for a thread." + }, + "ThreadReorderingResultResponseModel": { + "type": "object", + "properties": { + "threadId": { + "type": "string", + "description": "The reordered thread.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "order": { + "type": "number", + "description": "The resulting pinned order.", + "format": "double", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents an affected pinned thread after a reorder operation." + }, + "UpdateAgentDelegationRequestModel": { + "type": "object", + "properties": { + "delegatedAgentId": { + "type": "string", + "description": "The agent that receives the delegated work.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "description": "The delegation name shown in workflow settings.", + "nullable": true + }, + "description": { + "type": "string", + "description": "A short explanation of the delegated work.", + "nullable": true + }, + "executionMode": { + "enum": [ + "auto", + "handoff", + "orchestrated", + "orchestracted", + "parallel", + "sequential", + "tool" + ], + "type": "string", + "description": "How the parent agent invokes the delegated agent.", + "nullable": true + }, + "promptOverride": { + "type": "string", + "description": "Additional instructions supplied to the delegated agent.", + "nullable": true + }, + "sortOrder": { + "type": "integer", + "description": "The delegation's display order.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Configures an existing delegation to another agent." + }, + "UpdateAgentRequestModel": { + "required": [ + "aworkAccessEnabled", + "description", + "googleGenAiAccessEnabled", + "name", + "openAiImageGenerationAccessEnabled", + "reasoningLevel", + "systemPrompt", + "webSearchEnabled", + "workspaceAccessLevel" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string", + "description": "The name shown to users.", + "example": "Client Status Reporter" + }, + "description": { + "maxLength": 25000, + "type": "string", + "description": "A short explanation of what the agent does.", + "example": "Prepares client-ready project status reports." + }, + "workspaceAccessLevel": { + "maxLength": 25, + "minLength": 1, + "enum": [ + "none", + "read", + "manage" + ], + "type": "string", + "description": "The access level granted to every member of the workspace.", + "example": "manage" + }, + "modelProvider": { + "type": "string", + "description": "The model provider when no preset is selected.", + "nullable": true, + "example": "openai" + }, + "modelName": { + "type": "string", + "description": "The model name when no preset is selected.", + "nullable": true, + "example": "gpt-5.6-terra" + }, + "presetKey": { + "type": "string", + "description": "The workspace model preset to use.", + "nullable": true, + "example": "balanced" + }, + "reasoningLevel": { + "minLength": 1, + "type": "string", + "description": "The amount of reasoning the model uses.", + "example": "medium" + }, + "systemPrompt": { + "maxLength": 25000, + "type": "string", + "description": "The instructions that control the agent's behavior.", + "example": "Prepare concise client-ready project updates from awork data." + }, + "webSearchEnabled": { + "type": "boolean", + "description": "Whether web search is enabled.", + "example": true + }, + "aworkAccessEnabled": { + "type": "boolean", + "description": "Whether awork access is enabled.", + "example": true + }, + "googleGenAiAccessEnabled": { + "type": "boolean", + "description": "Whether Google image generation is enabled.", + "example": false + }, + "openAiImageGenerationAccessEnabled": { + "type": "boolean", + "description": "Whether OpenAI image generation is enabled.", + "example": false + } + }, + "additionalProperties": false, + "description": "Configures an existing custom agent." + }, + "UpdateAgentScheduleRequestModel": { + "required": [ + "cronRule", + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string", + "description": "The schedule display name.", + "example": "Weekly client status report" + }, + "prompt": { + "maxLength": 25000, + "type": "string", + "description": "Optional custom instructions for the initial message. Omitted, null, or blank input clears custom instructions.", + "nullable": true, + "example": "Summarize progress, risks, and next steps for the Acme website project." + }, + "cronRule": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "The cron rule used for recurring execution.", + "example": "0 9 * * 1" + }, + "recurrenceInterval": { + "maximum": 99, + "minimum": 1, + "type": "integer", + "description": "The number of matching cron occurrences between scheduled runs.", + "format": "int32", + "nullable": true, + "example": 2 + }, + "timezone": { + "maxLength": 100, + "type": "string", + "description": "The timezone for the cron rule.", + "nullable": true, + "example": "Europe/Berlin" + }, + "projectId": { + "type": "string", + "description": "The optional project context id.", + "format": "uuid", + "nullable": true, + "example": "c907b29e-f640-4639-910d-722623fd5b4a" + }, + "taskId": { + "type": "string", + "description": "The optional task context id.", + "format": "uuid", + "nullable": true, + "example": "d88ef8fa-e549-4ca6-96d8-83f5be9d37a2" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether the schedule is enabled.", + "nullable": true, + "example": true + }, + "agentId": { + "type": "string", + "description": "The optional target agent id.\nWhen omitted, the agent from the update route is kept.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + } + }, + "additionalProperties": false, + "description": "Represents the request payload for updating a scheduled agent run." + }, + "UpdateAgentWorkflowStepRequestModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The workflow step name.", + "nullable": true + }, + "stepKind": { + "enum": [ + "task", + "verifier" + ], + "type": "string", + "description": "The behavior of the workflow step.", + "nullable": true + }, + "delegationId": { + "type": "string", + "description": "The delegation executed by this step, if any.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "nextStepId": { + "type": "string", + "description": "The step to run after this step succeeds.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "rejectStepId": { + "type": "string", + "description": "The step to run when a verifier rejects the result.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "promptOverride": { + "type": "string", + "description": "Additional instructions supplied to this step.", + "nullable": true + }, + "outputName": { + "type": "string", + "description": "The name used to store this step's output.", + "nullable": true + }, + "failureMode": { + "enum": [ + "stop", + "continue" + ], + "type": "string", + "description": "How the workflow handles a failed step.", + "nullable": true + }, + "sortOrder": { + "type": "integer", + "description": "The step's display order.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Configures an existing agent workflow step." + }, + "UpdateAiQuotaConfigurationRequestModel": { + "type": "object", + "properties": { + "expectedCurrentVersionId": { + "type": "string", + "description": "Identifier of the version the operator edited. The save is rejected as a conflict if another version has since become current.", + "format": "uuid", + "example": "7f46eb64-ae32-4ac7-af03-118c5599c684" + }, + "options": { + "$ref": "#/components/schemas/AiQuotaOptions" + } + }, + "additionalProperties": false, + "description": "Replaces the current global AI quota policy by creating a new immutable configuration version." + }, + "UpdateSkillRequestModel": { + "required": [ + "instructions" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The stable key used to reference the skill.", + "nullable": true }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "name": { + "type": "string", + "description": "The name shown in the skill library.", + "nullable": true }, - { - "$ref": "#/components/parameters/page" + "description": { + "type": "string", + "description": "A short explanation of what the skill does.", + "nullable": true }, - { - "$ref": "#/components/parameters/pageSize" + "instructions": { + "minLength": 1, + "type": "string", + "description": "The Markdown instruction body from `SKILL.md`." }, - { - "$ref": "#/components/parameters/orderby" + "instructionsSource": { + "type": "string", + "description": "The source from which the instructions were created.", + "nullable": true }, - { - "$ref": "#/components/parameters/filterby" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileVersion" - } - } - } - } + "metadata": { + "type": "string", + "description": "The skill frontmatter as a JSON object.", + "nullable": true } }, - "security": [ - { - "oauth2": [ - "full_access" - ] + "additionalProperties": false, + "description": "Configures an existing reusable skill." + }, + "UpdateSkillSharingRequestModel": { + "type": "object", + "properties": { + "workspaceAccessLevel": { + "enum": [ + "none", + "read", + "manage" + ], + "type": "string", + "description": "The workspace-wide access level.", + "nullable": true + }, + "contributors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SkillContributorRequestModel" + }, + "description": "The direct user access grants.", + "nullable": true + }, + "teams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SkillToTeamRequestModel" + }, + "description": "The team access grants.", + "nullable": true } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } + }, + "additionalProperties": false, + "description": "A replacement sharing configuration for a skill." }, - "post": { - "tags": [ - "WorkspaceFiles" + "UpdateThreadPinnedOrderRequestModel": { + "required": [ + "order" ], - "summary": "Uploads a new version of the workspace file with the specified id.", - "description": "Uploads a new version of an workspace file.\nUse this to upload a file as a form value along with the basic file meta data.\nThe file size must not exceed 1GB.\r\n\r\nAny authenticated user.", - "operationId": "CreateWorkspaceFileVersion", - "parameters": [ - { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "type": "object", + "properties": { + "order": { + "type": "number", + "description": "The target pinned order.", + "format": "double" } + }, + "additionalProperties": false, + "description": "Represents a request to change one pinned thread's order." + }, + "UpdateWorkspaceContextRequestModel": { + "required": [ + "rawContentHtml" ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "required": [ - "File" - ], - "type": "object", - "properties": { - "File": { - "type": "string", - "format": "binary" - } - } - }, - "encoding": { - "File": { - "style": "form" - } - } - } + "type": "object", + "properties": { + "rawContentHtml": { + "maxLength": 25000, + "type": "string", + "description": "The complete workspace context as rich-text HTML." } }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } + "additionalProperties": false, + "description": "Contains the workspace-authored rich text to save." + }, + "UsedConnectorResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The connector identifier.", + "format": "uuid", + "example": "7e376777-7834-4af6-9eb8-da065f568d30" }, - "400": { - "description": "Bad Request" + "name": { + "type": "string", + "description": "The connector name captured at its latest successful use.", + "nullable": true, + "example": "Client CRM" + }, + "logoPath": { + "type": "string", + "description": "The predefined connector logo path, when available.", + "nullable": true, + "example": "images/integrations/hubspot_icon.svg" } }, - "security": [ - { - "oauth2": [ - "full_access" - ] - } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/workspaces/{workspaceId}/files/{fileId}/versions/{versionId}": { - "get": { - "tags": [ - "Workspace Files" - ], - "summary": "Returns the workspace file version with the specified id.", - "description": "\r\n\r\nAny authenticated user.", - "operationId": "GetFilesVersionsByWorkspaceNameAndWorkspaceIdAndFileIdAndVersionId", - "parameters": [ - { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "additionalProperties": false, + "description": "Identifies a used thread connector." + }, + "UserMemoryResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The memory id assigned by Mem0.", + "nullable": true }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "fact": { + "type": "string", + "description": "The validated governed memory fact.", + "nullable": true }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "category": { + "type": "string", + "description": "The governed memory category.", + "nullable": true + }, + "status": { + "type": "string", + "description": "The governed lifecycle status.", + "nullable": true + }, + "candidateSource": { + "type": "string", + "description": "Where the memory candidate originated.", + "nullable": true + }, + "createdAt": { + "type": "string", + "description": "The creation timestamp returned by Mem0.", + "format": "date-time", + "nullable": true + }, + "updatedAt": { + "type": "string", + "description": "The update timestamp returned by Mem0.", + "format": "date-time", + "nullable": true } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileVersion" - } - } - } + }, + "additionalProperties": false, + "description": "Represents a stored user memory returned by the assistant memory API." + }, + "UserQuestionDetails": { + "type": "object", + "properties": { + "question": { + "type": "string", + "description": "The user-facing question.", + "nullable": true, + "example": "Should I send the client status report now?" }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "options": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The bounded selectable answers.", + "nullable": true }, - "404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "allowCustomText": { + "type": "boolean", + "description": "Whether a custom text answer is accepted.", + "example": false + }, + "interactionType": { + "type": "string", + "description": "The structured interaction type.", + "nullable": true, + "example": "mcp_connection" + }, + "connectorId": { + "type": "string", + "description": "The connector that requires user action.", + "format": "uuid", + "nullable": true, + "example": "7e376777-7834-4af6-9eb8-da065f568d30" + }, + "connectionId": { + "type": "string", + "description": "The connection that requires reauthorization.", + "format": "uuid", + "nullable": true, + "example": "af18602d-c8aa-4f63-a21e-5a7f59b2412c" + }, + "connectorName": { + "type": "string", + "description": "The safe connector display name.", + "nullable": true, + "example": "Client CRM" + }, + "connectionAction": { + "type": "string", + "description": "The enable or reconnect action.", + "nullable": true, + "example": "reconnect" } }, - "security": [ - { - "oauth2": [ - "full_access" - ] + "additionalProperties": false, + "description": "Describes a user action that must complete before an agent run can resume." + }, + "ValidationErrorResponse": { + "type": "object", + "properties": { + "property": { + "type": "string", + "description": "The name of the property that failed validation.", + "nullable": true, + "example": "FirstName" + }, + "message": { + "type": "string", + "description": "The reason why this property failed validation.", + "nullable": true, + "example": "FirstName is required." } + }, + "additionalProperties": false, + "description": "The validation error response." + }, + "WorkspaceContextCatalogStatus": { + "enum": [ + "Pending", + "Ready", + "Failed" ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - }, - "/workspaces/{workspaceId}/files/{fileId}/versions/{versionId}/download": { - "get": { - "tags": [ - "WorkspaceFiles" - ], - "summary": "Returns the content of the workspace file version with the specified id.", - "description": "Returns the content of the workspace file version with the specified id.\r\n\r\nAny authenticated user.", - "operationId": "GetWorkspaceFileVersionContent", - "parameters": [ - { - "name": "workspaceId", - "in": "path", - "description": "The id of the workspace.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "type": "string", + "description": "Describes the state of the derived workspace-context catalog." + }, + "WorkspaceContextResponseModel": { + "type": "object", + "properties": { + "rawContentHtml": { + "type": "string", + "description": "The complete workspace context as rich-text HTML.", + "nullable": true }, - { - "name": "fileId", - "in": "path", - "description": "The id of the file.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } + "catalogStatus": { + "$ref": "#/components/schemas/WorkspaceContextCatalogStatus" }, - { - "name": "versionId", - "in": "path", - "description": "The id of the file version.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "string", - "format": "binary" - } - } - } + "updatedBy": { + "type": "string", + "description": "The id of the user who last updated the context.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "updatedOn": { + "type": "string", + "description": "When the context was last updated.", + "format": "date-time" + }, + "sections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkspaceContextSectionResponseModel" + }, + "description": "The available catalog section summaries.", + "nullable": true } }, - "security": [ - { - "oauth2": [ - "full_access" - ] + "additionalProperties": false, + "description": "Represents saved workspace context and its derived catalog state." + }, + "WorkspaceContextSectionResponseModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The section id used for on-demand loading.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "heading": { + "type": "string", + "description": "The section heading.", + "nullable": true + }, + "whenToLoadHint": { + "type": "string", + "description": "The short hint that describes when to load the section.", + "nullable": true + }, + "order": { + "type": "integer", + "description": "The section order.", + "format": "int32" } - ], - "x-api-versions": [ - "v1" - ], - "x-access": { - "any": "true" - } - } - } - }, - "components": { - "schemas": { + }, + "additionalProperties": false, + "description": "Represents one derived workspace-context catalog entry." + }, "Account": { "type": "object", "properties": { @@ -49186,61 +58871,6 @@ "additionalProperties": false, "description": "The verification email form." }, - "ErrorResponse": { - "required": [ - "code", - "description", - "link" - ], - "type": "object", - "properties": { - "code": { - "minLength": 1, - "type": "string", - "description": "The error code.", - "example": "not-found" - }, - "description": { - "minLength": 1, - "type": "string", - "description": "The description of the error.", - "example": "There is no matching path for this URL." - }, - "link": { - "minLength": 1, - "type": "string", - "description": "The link to the API documentation page.", - "example": "https://developers.awork.com" - }, - "details": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of details describing the error.", - "nullable": true, - "example": [ - "No project with the id '123' exists." - ] - }, - "validationErrors": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ValidationErrorResponse" - }, - "description": "If a validation error occurred, this contains the validation errors for each property.", - "nullable": true - }, - "traceId": { - "type": "string", - "description": "The request trace id for tracking the request.", - "nullable": true, - "example": "a65ce5745df02af216715ff06661fb3a" - } - }, - "additionalProperties": false, - "description": "The API error response." - }, "ExternalAccount": { "type": "object", "properties": { @@ -49791,77 +59421,6 @@ }, "additionalProperties": false }, - "TableAuditEventModel": { - "type": "object", - "properties": { - "workspaceId": { - "type": "string", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "correlationId": { - "type": "string", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "userId": { - "type": "string", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "createdOn": { - "type": "string", - "format": "date-time" - }, - "impersonatingUserId": { - "type": "string", - "format": "uuid", - "nullable": true, - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "traceId": { - "type": "string", - "nullable": true - }, - "websocketConnectionId": { - "type": "string", - "nullable": true - }, - "eventType": { - "type": "string", - "nullable": true - }, - "entityType": { - "type": "string", - "nullable": true - }, - "entityId": { - "type": "string", - "nullable": true - }, - "clientId": { - "type": "string", - "nullable": true - }, - "property": { - "type": "string", - "nullable": true - }, - "old": { - "type": "string", - "nullable": true - }, - "new": { - "type": "string", - "nullable": true - }, - "callStack": { - "type": "string", - "nullable": true - } - }, - "additionalProperties": false - }, "TokenResponse": { "type": "object", "properties": { @@ -49961,25 +59520,6 @@ "additionalProperties": false, "description": "The model to validate a password reset request." }, - "ValidationErrorResponse": { - "type": "object", - "properties": { - "property": { - "type": "string", - "description": "The name of the property that failed validation.", - "nullable": true, - "example": "FirstName" - }, - "message": { - "type": "string", - "description": "The reason why this property failed validation.", - "nullable": true, - "example": "FirstName is required." - } - }, - "additionalProperties": false, - "description": "The validation error response." - }, "VerifyEmailForm": { "type": "object", "properties": { @@ -54876,6 +64416,14 @@ "type": "string", "description": "The response format. Supported values are `html` and `markdown`.", "nullable": true + }, + "maximumContentBytes": { + "maximum": 104857600, + "minimum": 1, + "type": "integer", + "description": "The optional maximum aggregate UTF-8 bytes returned for document content.", + "format": "int32", + "nullable": true } }, "additionalProperties": false, @@ -55302,11 +64850,6 @@ "description": "Whether the user has been deactivated.", "example": false }, - "isAgent": { - "type": "boolean", - "description": "Whether this user represents an agent.", - "example": false - }, "deactivatedOn": { "type": "string", "description": "The date the user was deactivated.", @@ -60156,78 +69699,6 @@ "additionalProperties": false, "description": "A tag model used for the timetrackings ProjectModelForTimeTrackings.\nDo not delete, we need to create copies of the tag model for each entity to avoid issues with Automapper." }, - "ProjectTaskKeyMigrationResult": { - "type": "object", - "properties": { - "workspaceId": { - "type": "string", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "succeeded": { - "type": "boolean" - }, - "wasSkipped": { - "type": "boolean" - }, - "validationExecuted": { - "type": "boolean" - }, - "message": { - "type": "string", - "nullable": true - }, - "errorMessage": { - "type": "string", - "nullable": true - }, - "projectsMissingKeysBefore": { - "type": "integer", - "format": "int32" - }, - "tasksMissingNumbersBefore": { - "type": "integer", - "format": "int32" - }, - "tasksWithInvalidIdentifiersBefore": { - "type": "integer", - "format": "int32" - }, - "projectsProcessed": { - "type": "integer", - "format": "int32" - }, - "tasksNumbered": { - "type": "integer", - "format": "int32" - }, - "taskIdentifiersFixed": { - "type": "integer", - "format": "int32" - }, - "projectKeyGenerationFailures": { - "type": "integer", - "format": "int32" - }, - "projectsMissingKeysAfter": { - "type": "integer", - "format": "int32" - }, - "tasksMissingNumbersAfter": { - "type": "integer", - "format": "int32" - }, - "tasksWithInvalidIdentifiersAfter": { - "type": "integer", - "format": "int32" - }, - "sequenceDriftCountAfter": { - "type": "integer", - "format": "int32" - } - }, - "additionalProperties": false - }, "ProjectTeamModel": { "type": "object", "properties": { @@ -66343,173 +75814,163 @@ "description": "Whether the user has been deactivated.", "example": false }, - "isAgent": { - "type": "boolean", - "description": "Whether this user represents an agent.", - "example": false - }, - "deactivatedOn": { - "type": "string", - "description": "The date the user was deactivated.", - "format": "date-time", - "nullable": true - }, - "deletedOn": { - "type": "string", - "description": "The date the user was deleted (soft delete).", - "format": "date-time", - "nullable": true - }, - "hasImage": { - "type": "boolean", - "description": "Whether the user has uploaded a profile image.", - "example": true - }, - "shouldMigrateToConnect": { - "type": "boolean", - "description": "Whether the user should be migrated to Connect." - }, - "userContactInfos": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ContactInfo" - }, - "description": "The contact information assigned to this user.", - "nullable": true - }, - "resourceVersion": { - "type": "integer", - "description": "The version of the entity, updated on every modification, to the ticks in UTC.\nNot identical to UpdatedOn.", - "format": "int64", - "readOnly": true, - "example": 637825154598057900 - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UserTagModel" - }, - "description": "The tags of this user.", - "nullable": true - }, - "teams": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TeamModel" - }, - "description": "The teams the user is associated to.", - "nullable": true - }, - "isExternal": { - "type": "boolean", - "description": "True if this entity is coming from an external workspace (awork Connect).", - "example": true - } - }, - "additionalProperties": false, - "description": "The user model." - }, - "UserAndWorkspace": { - "type": "object", - "properties": { - "firstName": { - "maxLength": 1000, - "minLength": 0, - "type": "string", - "description": "The firstname of the user.", - "nullable": true, - "example": "Carla" - }, - "lastName": { - "maxLength": 1000, - "minLength": 0, - "type": "string", - "description": "The lastname of the user.", - "nullable": true, - "example": "Creative" - }, - "birthDate": { - "type": "string", - "description": "The birthdate of the user.", - "format": "date-time", - "nullable": true, - "example": "1998-04-19T00:00:000Z" - }, - "gender": { - "maxLength": 25, - "minLength": 0, - "type": "string", - "description": "The gender of the user.", - "nullable": true, - "example": "female" - }, - "title": { - "maxLength": 100, - "minLength": 0, - "type": "string", - "description": "The title of the user.", - "nullable": true, - "example": "Miss" - }, - "position": { - "maxLength": 1000, - "minLength": 0, - "type": "string", - "description": "The position of the user.", - "nullable": true - }, - "language": { - "maxLength": 25, - "minLength": 0, - "type": "string", - "description": "The language preference of the user in ISO 639-1 format.", - "nullable": true, - "example": "en-GB" - }, - "id": { - "type": "string", - "description": "The id of the user.", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "status": { - "$ref": "#/components/schemas/UserStatus" - }, - "createdOn": { - "type": "string", - "description": "The date this user was created.", - "format": "date-time" - }, - "createdBy": { - "type": "string", - "description": "The id of the user who created this user.", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "updatedOn": { - "type": "string", - "description": "The date when this user was last updated.", - "format": "date-time" - }, - "updatedBy": { - "type": "string", - "description": "The id of the user who updated the entity.", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "isArchived": { - "type": "boolean", - "description": "Whether this user is archived.\nArchived users are automatically inactive and only exist for reference purposes.", - "example": false - }, - "isDeactivated": { - "type": "boolean", - "description": "Whether the user has been deactivated.", - "example": false - }, - "isAgent": { + "deactivatedOn": { + "type": "string", + "description": "The date the user was deactivated.", + "format": "date-time", + "nullable": true + }, + "deletedOn": { + "type": "string", + "description": "The date the user was deleted (soft delete).", + "format": "date-time", + "nullable": true + }, + "hasImage": { + "type": "boolean", + "description": "Whether the user has uploaded a profile image.", + "example": true + }, + "shouldMigrateToConnect": { + "type": "boolean", + "description": "Whether the user should be migrated to Connect." + }, + "userContactInfos": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ContactInfo" + }, + "description": "The contact information assigned to this user.", + "nullable": true + }, + "resourceVersion": { + "type": "integer", + "description": "The version of the entity, updated on every modification, to the ticks in UTC.\nNot identical to UpdatedOn.", + "format": "int64", + "readOnly": true, + "example": 637825154598057900 + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserTagModel" + }, + "description": "The tags of this user.", + "nullable": true + }, + "teams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TeamModel" + }, + "description": "The teams the user is associated to.", + "nullable": true + }, + "isExternal": { "type": "boolean", - "description": "Whether this user represents an agent.", + "description": "True if this entity is coming from an external workspace (awork Connect).", + "example": true + } + }, + "additionalProperties": false, + "description": "The user model." + }, + "UserAndWorkspace": { + "type": "object", + "properties": { + "firstName": { + "maxLength": 1000, + "minLength": 0, + "type": "string", + "description": "The firstname of the user.", + "nullable": true, + "example": "Carla" + }, + "lastName": { + "maxLength": 1000, + "minLength": 0, + "type": "string", + "description": "The lastname of the user.", + "nullable": true, + "example": "Creative" + }, + "birthDate": { + "type": "string", + "description": "The birthdate of the user.", + "format": "date-time", + "nullable": true, + "example": "1998-04-19T00:00:000Z" + }, + "gender": { + "maxLength": 25, + "minLength": 0, + "type": "string", + "description": "The gender of the user.", + "nullable": true, + "example": "female" + }, + "title": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "description": "The title of the user.", + "nullable": true, + "example": "Miss" + }, + "position": { + "maxLength": 1000, + "minLength": 0, + "type": "string", + "description": "The position of the user.", + "nullable": true + }, + "language": { + "maxLength": 25, + "minLength": 0, + "type": "string", + "description": "The language preference of the user in ISO 639-1 format.", + "nullable": true, + "example": "en-GB" + }, + "id": { + "type": "string", + "description": "The id of the user.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "status": { + "$ref": "#/components/schemas/UserStatus" + }, + "createdOn": { + "type": "string", + "description": "The date this user was created.", + "format": "date-time" + }, + "createdBy": { + "type": "string", + "description": "The id of the user who created this user.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "updatedOn": { + "type": "string", + "description": "The date when this user was last updated.", + "format": "date-time" + }, + "updatedBy": { + "type": "string", + "description": "The id of the user who updated the entity.", + "format": "uuid", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "isArchived": { + "type": "boolean", + "description": "Whether this user is archived.\nArchived users are automatically inactive and only exist for reference purposes.", + "example": false + }, + "isDeactivated": { + "type": "boolean", + "description": "Whether the user has been deactivated.", "example": false }, "deactivatedOn": { @@ -66900,10 +76361,6 @@ "type": "boolean", "description": "Whether this user is an API key user.\nAPI key users should always be archived." }, - "isAgent": { - "type": "boolean", - "description": "Whether this user represents an agent." - }, "isExternal": { "type": "boolean", "description": "True if this entity is coming from an external workspace (awork Connect)." @@ -67025,6 +76482,10 @@ "UserPermissionFullModel": { "type": "object", "properties": { + "isAiPlanActive": { + "type": "boolean", + "description": "Whether the workspace has an active AI plan." + }, "userId": { "type": "string", "description": "The id of the user.", @@ -68456,6 +77917,28 @@ "additionalProperties": false, "description": "Statistics about workspace usage for plan validation.\nUsed to determine if a workspace can downgrade to a specific plan\nbased on their current usage of limited features." }, + "AttachmentFileMetadataModel": { + "type": "object", + "properties": { + "fileName": { + "type": "string", + "description": "Gets or sets the stored file name.", + "nullable": true + }, + "mimeType": { + "type": "string", + "description": "Gets or sets the stored media type.", + "nullable": true + }, + "size": { + "type": "integer", + "description": "Gets or sets the latest file version's size in bytes.", + "format": "int64" + } + }, + "additionalProperties": false, + "description": "Contains the display metadata needed to attach an existing file to an agent message." + }, "BulkDownloadForm": { "required": [ "fileIds" @@ -68743,7 +78226,8 @@ }, "content": { "description": "Content in JSON format.", - "nullable": true + "nullable": true, + "example": "(JSON formatted response)" } }, "additionalProperties": false @@ -70474,7 +79958,8 @@ }, "value": { "description": "The event value as serialized JSON object", - "nullable": true + "nullable": true, + "example": "(JSON serialized data)" } }, "additionalProperties": false @@ -72465,7 +81950,7 @@ "plannedDuration": { "type": "integer", "description": "The total planned time of the project, in seconds.\nThe time is calculated as te sum of the planned duration by all project tasks.", - "format": "int32", + "format": "int64", "nullable": true, "example": 432000 }, @@ -74908,6 +84393,18 @@ } ], "tags": [ + { + "name": "AgentRuntime", + "description": "Sandbox-backed generic agent runtime endpoints." + }, + { + "name": "AgentThreads", + "description": "Manages agent threads." + }, + { + "name": "Custom Agents", + "description": "Create and configure custom agents, sharing, skills, connectors, delegations, workflows, and presets." + }, { "name": "Accounts", "description": "The accounts endpoints allow you to manage the basic account details of a user." @@ -74953,13 +84450,16 @@ "description": "The dashboards endpoints allow you to work with user's dashboards." }, { - "name": "Documents", - "description": "The documents endpoints allow you to create and manage documents, their versions and related entities such as contributors or connected teams." + "name": "DocumentComments" }, { "name": "DocumentSpaces", "description": "The document spaces endpoints allow you to create and manage document spaces and related entities such as contributors or connected teams." }, + { + "name": "Documents", + "description": "The documents endpoints allow you to create and manage documents, their versions and related entities such as contributors or connected teams." + }, { "name": "Filters", "description": "Provides endpoints to manage and share saved filters." @@ -74973,24 +84473,23 @@ "description": "Private tasks belong to a single user.\n Only the users themselves have access to their tasks and they can only be assigned to them.\n It is possible to create and assign private tasks to another user in which case both users have access to the task." }, { - "name": "ProjectMembers", - "description": "Project Members feature allows you to manage the members of a project, including adding users, assigning roles, and setting responsible members. Only users with the appropriate permissions can add or modify project members. Roles and responsibilities are enforced according to project type and permissions." + "name": "ProjectComments" }, { - "name": "ProjectMilestones", - "description": "The project milestone endpoints allow you to work with the basic project milestone data." + "name": "ProjectMembers", + "description": "Project Members feature allows you to manage the members of a project, including adding users, assigning roles, and setting responsible members. Only users with the appropriate permissions can add or modify project members. Roles and responsibilities are enforced according to project type and permissions." }, { "name": "ProjectMilestoneTemplates", "description": "The project milestone template endpoints allow you to work with milestone templates for project templates." }, { - "name": "ProjectRoles", - "description": "The project roles endpoints allow you to define roles for your project members.\n You can assign members to these roles on each project.\n If the roles are linked to the project types then the roles are available in every project using this type.\n When you want to delete a project role which is still in use, you are required to specify which role the currently assigned members should be assigned to instead." + "name": "ProjectMilestones", + "description": "The project milestone endpoints allow you to work with the basic project milestone data." }, { - "name": "Projects", - "description": "The projects endpoints allow you to work with the basic project data.\n If you don't assign a customer to the project, the project will be an internal project.\n In addition to the normal operation you can handle the project members and tags of the projects.\n When you assign a user to this project as a project member, you need to specify a project role for this project member. The available roles depend on the type of the project.\n You can also make one member responsible for the project, which means that we will notify this person if anything of interest happens in the project.\n The tags help you to add additional values to your projects and to find them faster.\n If you create new tags, they will be available for all other projects, too." + "name": "ProjectRoles", + "description": "The project roles endpoints allow you to define roles for your project members.\n You can assign members to these roles on each project.\n If the roles are linked to the project types then the roles are available in every project using this type.\n When you want to delete a project role which is still in use, you are required to specify which role the currently assigned members should be assigned to instead." }, { "name": "ProjectStatuses", @@ -75004,18 +84503,22 @@ "name": "ProjectTasks", "description": "The project tasks are linked to projects.\n Only members of the project or users with project management 'read' permissions have access to these tasks." }, - { - "name": "ProjectTemplates", - "description": "The project templates endpoints allow you to define different templates for projects." - }, { "name": "ProjectTemplateTags", "description": "Manage tags for project templates." }, + { + "name": "ProjectTemplates", + "description": "The project templates endpoints allow you to define different templates for projects." + }, { "name": "ProjectTypes", "description": "The project types endpoints allow you to define different types for projects." }, + { + "name": "Projects", + "description": "The projects endpoints allow you to work with the basic project data.\n If you don't assign a customer to the project, the project will be an internal project.\n In addition to the normal operation you can handle the project members and tags of the projects.\n When you assign a user to this project as a project member, you need to specify a project role for this project member. The available roles depend on the type of the project.\n You can also make one member responsible for the project, which means that we will notify this person if anything of interest happens in the project.\n The tags help you to add additional values to your projects and to find them faster.\n If you create new tags, they will be available for all other projects, too." + }, { "name": "Retainers", "description": "Retainers are used for projects with recurring budgets. Currently only hourly based monthly recurring budgets are supported." @@ -75028,6 +84531,9 @@ "name": "TaskBundles", "description": "Task bundles are reusable templates for task lists, tasks, and assignments that can be added to projects or created from existing project data." }, + { + "name": "TaskComments" + }, { "name": "TaskDependencies", "description": "The TaskDependencies endpoints allow you to get all task dependencies of a project or a task.\n A task can have multiple predecessors and multiple successors through separate dependency relationships." @@ -75040,10 +84546,6 @@ "name": "TaskLists", "description": "Task lists are a way to group tasks into user-defined lists.\n Task lists are currently available in projects and for users.\n This way, each project and each user can have a set of ordered task lists.\n Task lists can be reordered as well as the tasks within the list.\n Since tasks can be in multiple lists, the order is only applied to one list and does not affect others." }, - { - "name": "Tasks", - "description": "The Tasks endpoints can be used for general task operations and batch operations.\n The batch operations include changing the task status, assigning users and more." - }, { "name": "TaskSchedules", "description": "" @@ -75056,13 +84558,17 @@ "name": "TaskTags", "description": "Manage tags for tasks." }, + { + "name": "TaskTemplateTags", + "description": "Manage tags for task templates." + }, { "name": "TaskTemplates", "description": "The task templates endpoints can be used for managing task templates within task bundles." }, { - "name": "TaskTemplateTags", - "description": "Manage tags for task templates." + "name": "Tasks", + "description": "The Tasks endpoints can be used for general task operations and batch operations.\n The batch operations include changing the task status, assigning users and more." }, { "name": "Teams", @@ -75096,14 +84602,14 @@ "name": "UserCapacities", "description": "The user capacity endpoints allow you to define the work capacity of users." }, - { - "name": "Users", - "description": "The users endpoints allow you to manage the users of your workspace as well as their contact details." - }, { "name": "UserTags", "description": "The user tags endpoints allow you to manage tags on users." }, + { + "name": "Users", + "description": "The users endpoints allow you to manage the users of your workspace as well as their contact details." + }, { "name": "Workflows", "description": "The workflows endpoints allow you to define and manage workflows for projects and project templates." @@ -75117,25 +84623,80 @@ "description": "Use those endpoints to define workspace wide absences. A WorkspaceAbsence is an absence that is applied to all the users of the workspace. \n It is useful for defining company specific events/holidays, for example." }, { - "name": "Files", - "description": "File export endpoints." + "name": "Agent Thread Files", + "description": "Endpoints for files attached to agent threads." + }, + { + "name": "AgentFiles" + }, + { + "name": "Company Files" + }, + { + "name": "CompanyFiles" + }, + { + "name": "Document Files" + }, + { + "name": "DocumentFiles" }, { "name": "FileUpload", "description": "These endpoints can be used to upload files to the workspace." }, + { + "name": "Files", + "description": "File export endpoints." + }, { "name": "Images", "description": "The image endpoints are used to upload and download profile images, for example for users, projects and your workspace.\n These endpoints also allow you to crop and scale the image to the size you need." }, + { + "name": "Project Files" + }, + { + "name": "ProjectFiles" + }, + { + "name": "ProjectTemplate Files" + }, + { + "name": "ProjectTemplateFiles" + }, { "name": "SharedFiles", "description": "These file endpoints are used to get shared files and public profile images." }, + { + "name": "Task Files" + }, + { + "name": "TaskFiles" + }, + { + "name": "TaskTemplate Files" + }, + { + "name": "TaskTemplateFiles" + }, { "name": "Temporary Files", "description": "The temporary file endpoints allow you to upload and update files\n that do not have a connection to any entity. The files can be linked to an entity later.\n They don't show up in awork before they are either linked to a file or marked as a global file.\n Only the user who uploaded the file has access to the temporary file." }, + { + "name": "User Files" + }, + { + "name": "UserFiles" + }, + { + "name": "Workspace Files" + }, + { + "name": "WorkspaceFiles" + }, { "name": "Project Automations", "description": "Endpoints to manage automations and actions scoped to projects." @@ -75156,6 +84717,12 @@ "name": "Autopilot", "description": "Endpoints to manage awork autopilot settings for projects." }, + { + "name": "Project Activities" + }, + { + "name": "Task Activities" + }, { "name": "Search", "description": "Endpoints for full-text search and search index maintenance." diff --git a/fern/assets/api/agents01.jpg b/fern/assets/api/agents01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..226e7415605f72aa05ef928c6b297d473e74e900 GIT binary patch literal 1443947 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 Sli@6iGr-?;Eh2^f$9Gjey( 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 z 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�uV7J1yP+Lx^ZTIS7d>{_>{{L=Tb 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 -?dU3_;ktL2b@NnPKmEcSZ|h!V4ir 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 z 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 z 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∾lFFqIFI+$ByE`ATf8mNMUwq6 zs!iwm!lnp*z#(Q~H#BgSAbWwKN5Qem62Zx@>YOs@ubzcUYJ7yRKr)rzyJTx;n`mWV$+|(46rqM#Ne%&Pam)g$V&3oPsgL;P##R&S^nP(iq>> zS>)}c_xITjg(3F74+5WQAnNfC-F;$iMf9C-DMM(M!YU(dMkp!yC==u*9LpXk8+T7X zxUthDW&g`(`W zzAKY=g_J*yYZ5_=@j_zv3UmN#G-Bomzr;R5L;y&nT)UEDrnSk_)^J$2itqZ|jZ`I> zhk~D&B;0M>HR3VPq>lAU-H=Q4p-_r0g33q5ap}V zHl^7LuqbpO^N;q0GKw2j{K&OJghvDt>7J$IVt8FAMe6O9^M6uN)dK)hGu5z4n0wewgcq`By6)AB>Xf#DPmcdMrbp32f&~|8+*&dVfa z2I|1az@3Fr-8XMqVPspMA>3;p(r5+7qu7_xSi+ws^C0Ln6q}7a%)L9#uu(OUh*^b>x}bC z6%C6ja@ToF*KJ4}J+*hwj#A#;`JfZUj^jvZmefG35$Ko8DUA!LSi#z?HE^nZ?%~u= z-(J2uLeCUgqkua=DtGh85=V!g%3toet}c9yx2DaXb;Et|cJ9Jp!7d2K&e9D1IOa6N2Xe^l%@4B!zH=De7ZS_M#am?IG^klZqc5FUBN)w((g7~PflWDB zZ7Z;0U^W^(aS(g-GS2uaF0EyBBbl9jn~8q_alWeC3`Q{Ms_IXC&4qDvG=UW00YR{0y6= zy|Tn}^w^!zghzpQqeYT$6CG?I8Y%T(iwGFsP?lr7Fd}jN4cE$Z_E;RMGE#oi#Hth% zCRQPN7Hc6&GZ2d@A0{1DYczgoH_4W-mFesSvZd8>_dfV={l`SDv<^iosFKi@c&UBMxOx^Y;~d}8Ed zBxcdg#~(%H3Yn53xIi-qTv5fN!!PK0VTEyk8gO3K>-J$o_G~DxnD^pdA`6LCxV<8g zz+<(3$VWg%9tt!l)GLqiqj7h~a={~?WEtj_LW&n1n*(&*fc}JLkZ8R~pkUQm?xZ0| zcz6%hYa8^z&xXtk(<$i7SunMIQMZg!vZPW6IW@#4U9DJ{D^Pw5cS9qMdr#B9$M&ge z!sBqf0J3cQzSnGIWVla!!lXDT%5c6pU2Q}o$Ae~a`1#0UC8mwM3V}kN9Gu4kddkje zos=~V7sk?!Ft?A18Mc?&i0?}b%RrlW>jLbn|w~aiC1uf-N+ikfY&nOFDRE`dh>acMpDD)-u7b3YWJciQd8M`paz#NvblTJT39FSJ5$%!98L6^CFj;-$K(N} z=sNHDt{jmhU_U&}#79MK3X}L}7!$Vfq4`A8@g*h6&*EyQoWIU|zvb%Gj@v?R5Bi>{ zb_D`7`?=z|BKn1;{Rn)c=jS32XrgU*q2m&%5;fvy!1`~l^q+E;Ie$$XfxJ&sN}_Gb zJTw@x;m=s^0&ABr(BpZs%qJ1Xqmp0R+AS5V9sB;BC1SQ~LOpb>g8fd;n87d0(I6lB z;V;W&&PK^_+9h)7)D*DfIG2OzoB;M0Jflw$(FRc0&W{- z3%u?Y?=4+i(v}pd=(GlMSQYG$c>DYaQulhi%~9~ZfT;UnS68j}$crkV^KVbPh1(IW zM33Y0*el2DNp0cCn*MEzYy%h}kmmfQny{;=)1AP&yqdwaFjpMSG8J?1`;AQJzVAnx z@R+NRZFoYW#N>qjSI_msuf=vB-ib*^9YgP$6uwc4GyBa;l{w z;(IrL0_F@Ypz)#Qp<;|J|C_rWu*hfI%5w5+u2}oL_oZ zBF{TQRuZ=l&EYin$$F@f^WEDocpEr;2iMl?%s8BJJ*+nzj3U2T3eh1HMw$!>S}WLt zX9KrhLDb2N(`hd%wwh;|`_;BnaUp(ga$!o5(Q@cSCf}6*z8UyYpJLEd%C-i({#vMR zznN;W7y^kc9v)~p-IVxgsIAVmT}$u0{^x{FQu6bsbW(!p@k0cG#?wB;HD(=@_eqH$ zh+SuIEvHuY2lyo2bHU8F&EQK<^XrYT@Ld}nCGx)PX&%2Zf6&@;QwI5S9w}0Vp=3H> zQ5B{YK8>^C4b6j|NS(X>^Ww7f@N>BF0ayDj+w20x>@S}x;^U7W%x9yBLeEp$(%CB!{M^7rpHyDLpRe! zU*rm@pZY1r5hjrpwDUXA&flgwDU8xLdpb?(;z@Z*;*1;UW6mtyff9qsD#tP`6LY*; zm%b(IX4Z`oNt2a`IOb8f&K-O$2HfSmLPSFwUY~P@;Y&8n=t?oC#K%=hsd$bgVF6wX zU~Xz~wLt7azjREa|0Fh9r8)Gc7V^-2P?<2eNTMj&T(qK>m@A;FqW4NSWYgw2fJxOP z*UW4y+B|=wwy&DmKvR$;5}~|Aa&JqDvCw2{jIR@)kZ?Dxx!CsLQ5cecLzo#qIfDMsca>6Lkci_RiTX+$5A{eL0u4J!8<++B`YiV zpaLZxiR9AF=sdhK12kovJAqXtLV7Lh`@xNQb?G3Ma66)!Et`JDPR)?1Xl47-4^NW$ z4Vo=emXZb>XM%vcn`sh87NtTkr+R^p4I+@EcB%@(Z8kd!5wph4A+#)}V3}O5frM4E}bk!W2 ztp$PAulxch8h+la#(2e#j9b^E_{PM21vrj_Cpc2DrMz;a-!4I_a*>I6ukECdeRXzs znG2zxYa)4H{6Z62)CP>SWLau5zwd^f|xvAwEG#x614(Qj%BN!rfds zP4j51plQ#lXJus$z6-5^OHwbwOBHQi>dY-Vt@y8t<*)io3rJ471pib*rs^=WAO4Pl zw6W68vi#Pa-Yxrs()PjYDII0gdk0BJScgQ5ogDM=j00Ykej42*Tds!}-{(4u*YTG` zHo_ZhkVq>u`D}Pa31XsNBbR}6abOr9OWW`aAm})cr0C-PQ(Ta+BivxOP(G*B)bxV#jvmNQXEf8c#=D zG>Rc?qR49uZ=xP^!#M&)kK$J&RPFDtQSLh(OKzmihyM5_6z_kx2pUjtK|YC(l46YP zee>?8_f?Sfse#XiPj($aTVci^9i)^pMC=hvGt8J=t~Zsn6FR?GEkvG?V>68uQdq+g z`9=+-{fKM_(gTb3I@3Xl$q@vrNFC;pER|NU_~beTN;twoy}|}1&f8N#X^s@5glmA$ z{2q6bO&?jmO`JEQlLCD$OmiC)G-nrj2w2bj-eM(JmOaeUlAXK|qh4bh~0HNf{YO6h4Z67oN#1i=#u7%0Tghyneew zoNzI0FSw7p0Rx)#A2hnFG58WTlsMIW-Hpk6(9<6Cm==NvpF+&-T-!_)pO zv2c31_q$DhnPen37oKWw7z^7OVwm|!E?SA^E`;}!8?Sl&IsQ`?_`i`wM6_DYPoytS zwES|KAhX1=jmK$Vbf0%Vr8QL)Nvm>VShzSoPYc*RD4#W0xdwBo?(0(KA8+_UJV5Ca znCG8vGG|t`B6*A(FTl`2{}N=W?`PtLxHauhyGj@oYoLv+^PHWexpZ=`&PMf(wd9^5 z_Tc6%+D<>(mX|8?W3yNQJ@VaUPq8D4k+;P*rQqEh5Y%)rqTJ(Xc3*TvEeW2!I8)J2 zCV79n_+`jXNC{GB?B-$P%#?vP6ktkuzvRr_*d&^!bLqzelFe`aU%#lwF?8ii2s{Jk z`7bJrfx*xQP(?7KqTCMP(2SIcI!yX^Fa7_6_S7T0{N${0uERv8P+!?vBgl zu`H)I;IA7)P3$iOjtu|82lU4q`2Q#~MXV5Uf>NR!v5i0w$$|N-hPmkJcRpM{{7H&AdZ9+YB9d71_Ai$tCCVzGc-=y_M-KW$c*GdG^`Z_l}04R>G~ z0BV3NDc~NUG^xPW`|VTcF~7w`i8}vKwpccB812zk%gK5r@_v$v5?q()-JI_|y^K)` zEAp1&>8+dY;y-!;=EFAfoLuyOIhXSy%1P(en<2YPtc&M{6IBhs!Y_R~M92f_i2K7U z@as>&FYrkTm9GrX&g`;w?smdIyDq8O%Rzt4XREb3xQGr@(!QqKoYhHAeWf+NyOX{f z1M^Z7>ub-zYr)@#QJGS+PD9=k{VNB=Lx{`aPk<7`Y)?x5#Ny<`dKIb>SMn%(Uc>)R zwlCZThW}TW-T@7<{+45RBx!PG85n{M+4xfIf2}=OsN1av zdP`LZZBKu@JdstCc6#l*KN`K`Dywwf_513#tken}vI%7To`k$%e`_)4C42nYm&(@v zpkXik{isNyYk0ho`*V&&_rl*px}t_JO!^iO$IpZ6H`p5YR`=IP>cRH&1^ceFe)4Dm@8)nspxP*i9rc+&zTS7h5KxR0Mp)s+x^l zAPE*`mw)FB774K={PX_6^vBk=Og6D99^OevY^KN>70-?=dq&I4R=leuwRP*3QW3)! zsx}-AV}#@eb|3P;NB>kMr|!M%zzHx9h1cGwUWd%0%~+DBYvsU=B;u9;ToRfvkLAi4H)D{n?ZebHcptIyB9Le}I2eGC09 zuopDv?&I#_FaYps@0G11V|v$9t>Q!9Id)Dv_e{^p!vQBM{dRq{-cu`Oc~S~Md}g5m zz~*D2El9W09XuW(n9C?Vz3gx|EX(Z*=4GtdqK1m;@=1ykHJP5mrAFV@;EhCurg!J@ z_he<2xgvt~z-Ue%KgLf6>HILdMqN8wo>Qnnkj*M%Q2OSKZFv(;^^1%#lQiE0UWin? ziab%JxTHnvUun;b)0G4Qi2SKK&5wEeEW;4RK5YGbH3QJ0j#;FAesbY6Ij6N3Ci2uh z8+=J8lfg5Ea+$dUeJ7(Jw)$!j_Jtx`=Fg?i@g*SWYNHP7+iP0*6B_BKHPdA5LDxj% zf_Dy+l>tJe`c+vg<(=?^46~S2hFkG1B2JH{Oje$Ew%49?nnrI+q6gLN(fMh-Cog++ zL2mL~1`aDe_kN3Q3|U$SSI<0-V)Gf22zxII`i(bU$I*L2j=39vP~N{n3zsK+TqC@6 zU0mgNykcx?^C5vOVU9{ZU&nBt?R?H5C{+`ip5>L(ZZU8O110Wt+0nsk?WR?G4MMIL zVsJlA9DTC>Agi$>hC7^WmYcy~9-EfxzN;(vrdw9!psg}gN|vN%;7se@Oh>W` z7V2NJp>c>ACN#J|%yJz`VafOGJ?@a3r}{pUm0Kt_bCz1^03b_qe&=PtY~Svik1ukX zII?n9z9ap}@<63JA&Qq}X*$h9?#C+FGf-eMb>IfzN(P+S5hs^dD&uDFus6Oa=I@=Y zu2tKDwt0E!{uYVis$1edIDGZiWDs_WH7`z36~*T6y_+<_iy7|%wT>Qs9IVWFRyU96HK%Jo&@J!ku3GB_jRvLjeJRt_3bO2b`Ok{X{$ z7sI;@K%idkORPweLK%kn-u1B&$MF>Umt-6y@Owz^<>0spp%W6(lM+nZlQ}dqBn~z= z>%Mo^j#OxW5dj?MTbqj>i^Aw1e7gNL*e;MgbF|=dIor%<3*mvXx2!gJ#sX&g;@{FSKdAjS&c-YdRPEyu3LZS$jw@^gfJ{u#jbE$ zYDkKMI=wFvxAy^`d`1T-cza)HwY_QzD~qrIGJHLrpLyTIZ=br{{8my*HbzYllRT)N zMBIJy@YrDmtXRlvT9ln}Pe@+*Lsr2^tGk-R{)r~B`mB7en(k;kaH;sOE}5G~+7Mq+ zZO8T)4qr1CFC#;VqU$#p+DsQAurVxZ-*!%@*2%!2L}X*|rkt4Z(*t^Bzh)o)NRKTh zdgH9b9j(Lmdw95n>)1PT_l|?UM(vzKJGu{@Jt2yO=6J7MS+?-{2DRI&zH)9PRaEx6 z{-w`<-Z@>Z)>Qyrl45pWv}S=aVylMHxMa@e+S!Xf>xAR^LLkiw9x;+;T;=ygh5U)S z2BPyv>D(VG7*|&>68bVXKfZHv(rgP-6Z*C^CY~RWEDp2f9xBgaVK4UgIZwP-lc+W* zPPVl77Xc`J6?g0QbnrhlAD|ZW848!^oj^b?l zBo`z2JA32VsnnfG8>V(!nvi$YxCDtX<~ZB$&N@-chMrP(^U0&-ED*YBJ)5X|qKInA zN;$DOLCkliSb!+*1|A2|255IiT?5ZK_!&*T;aeGD$Jk?%D!K4aoON9WkGEXXZgyl` zQd#JXZxR~k+37K-YLdFG_mwT84OapXc!r8)T?45DwL>^2p;+d7(t(!G-_@~&qN5)Q z81Rx2y>(Yx$F>ViOPFVoJ!5@gyXb9kJQ8`Kyv@+;9!bfa^d|1pY$6L@ZlgqWsKjdu zX_Y!qlDoeCN^4^hWo+T6EYh0iZ)(YQCOH4V{gQ$=pmEyNh13O3S!>PdMTtonxdpK5 zlP2LWX)peEIj&4K#3$a#kg>vZ5Cf*MC^jOZHn%`~vi*5v6V( zH<(R|TA#9Wh$MfnR&7W0@#V&dh|mHg9(Oi(`WL>@z#m;bIy2JB5*OzH*hO{PiE^K# z{fJ|m5CoE}bS@X7wrp%Jy@(C5l#Q*UHm}5o+6rhBLe8qkd%zY@BCQ zfc>b!iZ>&drZ;1Z-w+1Q^ukC1VPD{GpB;I}iSJDP>@T^QneB6UOwpczO`jJ@H(-g3T`hOKS+Rx{`=t2F1K_FLmpP02SL zw*EKtyY(Y=%V}6Yqc?(oJULpf)Slg%m;*_%akbd$f90WITgIidNaZti-Ae>Dxwq;S zOYhT#rgs)@5-unR63RLyY0g@`UIrCybxz_Ohf3G+5jBciHX58yT94*FBGcdm&8~%w z^Ge=CDBEw=%Ct#={l#bdboDFnGl5CGfE@IEK(Ne+quGpLYrgZ*aXUk0gCr;+h{q&{ znVM^Z5N<0lxhD3lQ6h$dTkJG-5j-B$d7nTiNJ=Z9RY_7cCmPxV8e-U6Rcv9cTnwNS zBcC_)-On0lzo~7PqYa8#kBkEf3p|->-ca8|V4S7rUDZaYha`vd4eqe%Je0 zXAve{!AONWCfGnoHcKK}Bd{O8d4^hg3`&H4{ALbelMHsbCSD*q(! zonPmou1Q8GldD$~LysJ$V8-2V**Ptt1naYl7v3tIx?tb!`$sxHwhtc`JHUTA%(4Su z#R>|7UnE6bhejr9-MV0f%1(8E=_Fx7z(U6dYVXG5=<14Ds(ovvE9LxE`lHR`xk|#U z8dExg(k5V~t^204yv)bZKH6_PlDMO1%3!OgaDuEIXK+=o8RB{n)OqB7g~%K!@YLU3 zuIvZnz@=t2S4ver9PjGY{d^@>$l9`OH1IYKwQ68j^uoytQ}zSmq}GwY)qRiSzR6NpGq^$Gy7~|WIIk;VZzmMWc)JoMpesi4`$u+6% zfZglfWYe)LY#l^SDA4=nu@=tAF5OFN=^X`b?F@H^r!+Z#H|H!Y#jsOJuw)f8o9PyO z%~aa?#@Jwu%NOLVGt>GLE~yW;Z?y6VA9H*(I`ysrvz4ak?54yPHfry;M^lX#ZhT1O za_pBk4rDZk)pjH1$hlsUswE+bZDvoqN3fF*n#1_2qj(zROiCtkc*_ZQ45Z+Op2jnk zY$nwJvMVq}7|lim8u6^zsJUU-=UDh zb|=4@*-BuQe8+L&E5Zy8j_0f~A+ewNQ>B&I(VQ2_vsSi!X}kPWxs1(v6?Bl?a z}>BE{;AT5Pa(OE671c=i$}$M<20P+D@x)jKbkAwP;9b zBm#e_xB0RufP*oq4usS-didR;0lB;ai-Xa!V!5|nbC>@B><0FDuF!~$aW$XKK(KbG z%w*L^tZ#U@{ttd72z`c$;&>?Dx0&CS1p5aD9J2-f=NlpD!g6-}+=CPCSnrS%;}=3d zN7P1AOFa5UDTp40GWfoE(-vd&&PDY2=Z}gH$k`To{Rd;Cj>je6%5mBnE)M4R67Lgo zA$A22|CcnnRjXBcOIsFnN^#P>M=ZDaoQk4E@zf6vS_yOUx6;BdY8 z@oU4nbwy+{T-B+stL8Qt3DVXYd#M3;LpQAVhvH!Tz|P7aeO}d$hO808A7P#MpK0(PP>i_`Fzt<@CqYwg^k{ymU9ug!<`GR^d2Jx_gLJnh1~P%) zh|+AF35N;&Q3q*B>aV)d5HTnI(!g)c`>n|fC@!M238`DBpfafdWLCWJ|G*d1)}n9j zZgRf=GxwtGz9TwZVbV+gK^q$nB0>0D@lRS;{lO+7^8{Prj84B^;Tb4Wh`BnXs-9Gv zx@2Dcc0;NCA$*36f2ptR0$&-;-Yj3%R1<1-EY9fRaCh(AmoP0ty}#eFYl%f+7gp7Xax zveDe2I^;uD{v6_QXIvMviKf z+{rxn_pasIss~-IAP0&WhDg(UHGc_oVmw&Yb3Ura1|tWCGM@j#^XaKyc>fP`DHbwU zk6sT59x7(}g||fSBXPQ}NmNA}V6?pv50-tsaC~Wn0O8=wSDb11KkmyzM~LD#-a`Y> z=_m|vKC~$*M;#EyhOQSKK(FK<*I#RTbJFU9|GD0y@jqx5)zXq-%6KEc9>&s!1ZM&> zbX%-UovT`HTA)&whRi4HYC>!KtAQ`Quh!=NOXv4Etkx4(-#{%V1o_;AdIu4pa1^LP z%j|+&;Xs`;DU5B7*>x&o4+d}$QseY8Lza_N**_jShK5_62E+so2M(?6Ui}Ac&z>-X zKyS-JcQBjo%DqdJ0CwKl!*FE*57=|H=CzikP_u3QA$YGMp7Jw3^D)m%snOJ|N9T=M zoa|tJ+lbpKc4Hi6UsHhZjegn0r04nA3i=qLzz8C3~ z4r!#jLsCMdOO^&{=@OPMX#tV01qA_VSYm;tQ(A$gJEgnP`(4)Ox!&)+uJ4}#cA43k z*~v4%bIv3Cj6INF2+D!by+-qh~qK9v6ff__}*Dm4}+I%Hz3GlbJFh$Dia3=&gb6^D(oPGhUF zNb1Gj9Pr_RSQkZ?96R_hTkJaP2J0mtS|p7*gW-&kvP;zO4MmB#3v~F5so1^ex;c&^ z{=?l9KI^SKB5bpT=}Z_{jS4#bHum*aWHDF7#hBBJ%cAb%=3UNO7FH+Q=ZS(F>6D*| zm`ZH4dlF<*|48U-Kpa;-^4=;|PoL10Uj%Upp4h%k!GmmuYie}lf^Xl)lOdA!mJy#3 zjb~fkp_9%ohe6MAC+B!>Q1aD*-3qAY{V5OKvB^}hZ9K31hD^{hj(8y5y?7(dQ2aPK zOT{Go;8k%`6eVK}F&03=nd{-eICU+1Q1Z>f!uYCwA1kDPxa9o`C^kxzsH0CjsypeE zEZ!S-lV%^n3D3qq=gH$THa3Zr)@bstrVRBM`dMjuN}`O7_J;a`8o7NSwTe5AwUXKG z4}K;ZDxUqn!ufIQnpQPvJYPL+I@UWh;WL;Rhm{ShwM^>5KpRum^@d+WBJe{!oH<7f z-Ns9@YaVP3EW-1xmq|Qx^zKB@TkM)(tC`pl@@CoOUh?Bnr-_b727`?y16(hTS$+PJ z+agjJ64;Nr0L+Q*V=upacV5obktqG7Z+x^d(>Wuij@D|z_nGo-cY@i-kF(qy*a-)o z%H70Nk&mx+{iG=6T5JJ<4EwvhX9f;EHXGlX(cw;<6Lq^r*Uh@JU(k%&B}dL@u!k8g(5P+@0*jjADz9v9|i^a5JN>8PBa4F}_6ijcs#IMz&I$&K)s5 zYexh+mM=g(e4Wq3sGl%m&6h@;PsM=R@8W9|CmW2X1sPSR7d&_9#_B$YEB>Y?<{G3n zy#XlLN8%*Qh^@?h^4XATvcrg3(+PV!#{RnG*(E27%^wz5Pd8V?ttWm+sQVA!beWJph(hGh_759pw zbzzY_S;~ynm%XiWa;gn8q+5%5LgPCo(|tA=~a!d(2VQa7YiO{| zV(ED!wK|e~QMG^)ef7J5?B?7*^mIx8TwwYe-H5EdFIlWeP+jlrGkcea?(>h)Z&@|w z`Fd9LU2ZQqUkEQ#HO@5iO!DD1aCjG;x4@hYs0eaQzVi3sO*YalOWcc#^)&172}wE1nX&ZPM^Y{cGJuQfL>6u02YRfis;06 z7_|r|4fbM7@(GIqu3pY+Yk)>=1!Wfz)^D$Q88N($ZsSau1Fl%@9%4P<&_%|49p9U1 zR8_A$E1tLNJayFF^eLn|9g?_e+0$9v1qC12JIZ-QNggj6vM_3`q6pQsn}WWZHdQl+ zy6977IC^n$lAh%KFla^Qf7Cx442xC^UqDYh4q6M_5f>q|`ZZar5P3u))6z<%kLprl zQ#6p#IwBIy%jtsJPWY16{BCzwx89qpV9946D^_LLFI-wCoRvTCfNK=f>o48(G#>U+CW$=%FOdpBGUB+KII&<))9y03UK|TV&E+@;r-3cLCOboFR^4DOp1_ddP#k3E+_+q_&o!j7 z0)yoo;)`%E(}Dx>^r~ND5n=Vw!Q^N{UG;sB)!+%Gm*?Q3^~mL#mgyBIex-mP{GC2) z7)5!RM+>NlMmTlsIbb8n>ZPEGj`u$r##WRzDEOjYrGgrA2^F=lKxd}sXI)bK1zFou zr_f&JiOS!{xicP#T+?Gp&m-^`v=zo4+Bb5)=^C_7&3F_UX2(HEi%Z_0LwR5V3IT%* z-DmxZ!~lsz&0q7@A20}tsnj+ceP@@NygsKEMya~J-;y>flKv0C`jnM{aS`7?>{iE$ z)H)ffe^yc#wCOFMj zl;=*4dd-S1ilimkik4jO%jwc@*G4xm9!JZ)X#CZK`jHNhE-)8)neh+M- zp^UR?m;{{o$3)dCS2cjXl1t=L#UxlM;ncPoAYkp92s2ClVdNzStR|uBq)Vjv}4Xp(pnFl4gk9{)$ z>;LR-=jL)UXD)gHPx~Y})1vo)UmXEL|H{NPrmmbS_!Uy)oOR89#@R4q>5^{b=wGZ; zT&=`3trF2!H^>N%Tb7#>KXF1m*#E}y9?XR7ibQ*~~vs#VlvPV(dEWX_xCHsq*7 z^bIK_wPbNWtnd?AZd3gz{qkcX5%tlxb3uz|7k0Z1P{-%kZ{6|PGYxToKeq14^EAl< zMK}D9e<*&tRDHOjjLI@uCF(;n%@&_aHennR)l&uE!!19|n;r!%3}x$Gbg%GJ79_;D zszj-4jCe9?zE3VmeZV_w7`oj-zUID6k*}w3^C!No+(5kn5g#7w7I3) z-BVi&)5d(SDr)lI-;J=T920SWdS;#@Pid=Dz!1_5FpI*Z`=;G}Qs=~lC(`&_-D3L3 zVhQ7b=KTu3n!drv?!N?i*gU3g9t0@y!O!CsE5dUmJGwz z$ji{MK0!RH1g@Se2Ho0bjrrq~?VoFo=cEE!tPCno!j_+HFYCCy)^F#sxO8i$4!HDA z6N)L^av?zxw>$nMq;q=$tW_~f7IyEhoOxf|bd#P)wZPnq#ovHU-N){J{PBC8%W^`Z zE?iP1Ep=U0-}w~!MEaQKZ4DFCVu_t~XV}n_$ZH*S{>Dlbedx)8oBk$@)^Ui-=6Wq5 zo$@P$?hPw#9=L$3;SA1pmx(J`B#YsLDUsR)cBMh$Ea;{kzkKY>b)}L-EVr6WZTeGq%yh_oi z7$8+uHME4Bjn$PK(EeEfPFiVrv>5=M8=P9q0xs=@c?Hztr?gci8eR{M?!+I++znU$J&(;H%@F(?Fzb%k7Q~Eu=lW z|K5LOpQz>F^=lnO&!fauz~tgrI2IQu#J~8hy`eeSE){jh<+5xtGSh@YnSnPSj*}yP?xCc(WHgV=p3u zx5EGdiCzw3KW5K~p!Xf4S9j+J;bG>E#aIX8RjTyCg{#JL6it;|;DD zFBSbBykAK@^{7uS?eM5Sx_9Y!i8)`5YL%I7WxTjdi;`pRHoN{+YD~Vb{k2V`_QtF6 zRE)Kz{Z()CD?)}u%Ird%ZTII)@SQ$$-NB(1{#~g?vpsSE4~TEPs7X=U^TXV~ z<6$HakV{>~Mw=oyp*FzF& z)T^`)e7h=iDOl!Wcr;zo-JL&uA99n#%}UIashDYAY~78kN1NvgBKW@0CAy5ev=|$; zYh3Fx=PGtJ9Q*nZWS0KymCI*hb6jE1!WaR|K}qg)v0`fG&BiDke`R({hqsHo3rDF- z%jniBs)nnM>TNDwmeI=-wyz^3Z*DCb^)UFAKZO4W;7|0PQT`&y)uBu#TG0-ys7wip zC3At@6IG}Wes9jH zpA}be!w#GoJa)j7Cd)b1N_aXv^$c>HBWZigp_lJOWnojathV`JGBI>+R8OrOngj4J*UIoA;vfl6@ zZ|fgD`m=IYfntGWr%(U5w&R5kg$`_p``i;^`(5~Jll!)7U52AHjGABE>KBPK5Xe|K z%X}j*J$~Re@NO$aQe>e>?IQ^vnKn262!8&f%kmy6FJw4l(U*TekU<1k0`W~3*8_FL zm5-bmvHsqlnIo=75W$Ku5<#nfWIcbJ9Mf7N%QD#C3_K;7JKV#5tjR#595ZwSB85Ev zn)3BMXhK^gQczOuE*lN9y;c#ByboN^m?F4iM9Q6t!U&V_;sa*?=H*t`O@z>e-2TJg_XAgYHr z>UiIe3}JZp(&o`aO?czMGixADRz-Uz(=P7zL>qJaI6<5N2ma`wLz!=~HXHgPu>t$~ zFn6zCj--oSXm={^?mL9cku34MBT7*k3viR9yWa1>WdOKtpdv_L2(e9JFO;sq=9hBC z2(7BeK33qj2irja5p@UjZP zW#Gpv!;tj48+^W8OnKsFeYzw0Iyv{0(HLSdd)85tY+mIwxeG*#X^~uA_zxhlz$#}a zXEpz^sp?qP4gLS4zuI4jYFeaq+?te+Az|~lM`<>L?064J2FHRQ^=J7~TF(s0axeY} zG!%fmf00b^`{q`Le==+sc4c%Qc)nyt`g#v%h_z}R$-iPFi-zHkM)7|s5(ZHmvsZDC zZL?Hq!<4gu`G|pDGu7x5qk{sO52XNHO7>Fg^c;9tuLIRxwm{hAy!X(#rnJMssAve{!b2x<96r&F6qBm%IJ%u z;gWXe2)L1qth>b0!g4GBdIYkr+BDcrR?_mo2tGQ z2c$9@F=He{_naUv|9Lq`YgGHB!(9W%Zc*w`og+mO6+GcB6!* zW4!Lc_C?G{hoq%yyxbAa{d!;`uk|L)C`l`5&SPnXFtW{QVTN6Ay^^wB0{n2~aE0gw zM651c=N?yjY6B19WA!`FBQNZ~sefF9Yq5A>i4|_?#%*R_aUytrFI`n0to1UIyKjuO zg$OgEP=hNF+y0|Ej-8WQgK!Eh6Kb5K!**sK_X)IUL z_+^dhu~HP5vyn!h$kebwv}EJSHG(LcSf^j}!CH;E)e8*d=|T8O{88{^hl2L8E(~YN zb`0oB&2NIyn$n%1;eu-QX6Le=4V}+r33~*YsP+xzNQvm6i_IJ1pH=Gx>qJ0C1kBY! zIix1c-FR<9JB9fmPO)sspw%vW+{XKoDxl4~Y)zj*t-8hyVBq()h&JkHPgAMNW{)m; zOwH43UDNJY)+~vH7o6x(6=M*6P*mNWCseh)blFzlH@BBQ{mRg9*2*1(?)!|Fc^wMx zsKrq(>aW-XM$lLh<;7)zh#ILg%Q&EPac`4cw8JdLTa5LWivk8l4QvU$fo{qmedsZ( zGn6rAUPcAgOPbm{3? z?^pSh>^{%inifrtu|v>*00aEuR;FhPH2}&QYHPtG_MKXt@jx-n->~h27SE|6mEv`% zb?p-0E09wMZZ$8WqIEFp%jV9vgJ0#z86-gY>;V4JVD#-=)qAfN-C+x{WY-&}IEo0O zA%Fe(L?4r95pL6Ufr8l!2xX7pd#v!f<4(}*{anh?`zE6Z9HJmOb@U+=@T;GC=Ew240XmXmq`u(N7 zUES-YQ$Qv(qp|`CGkMU3j`t8sxJ;fc8puA80t|^E>W3 zV`4l-&)k_EoX@!K^p;AV5M#*xKI@M>p~&-=(PB#`Tda_HxHKgnIXB*Wnhk_2U()mA*?)pWR}={oFHoeNRw&Z1Tx z+9={~?gNE1cRWUtBn?Z}_?pA%B|HefAyBC;~W!MFrw<2G-_Ypgi=Zwd+!9+`3 zM~qb$gSJx_gx7mXAZF{#huR+$>VA5ZkP$#4#orW3l#YKA%pziiCp-1Z(*DJPr0s?oF_{-$-%Z((ATEq1BJt`q0MzcPn$T3~_cqi80JAKoW z&~&=#E6cvRx>Pp!m)&y3ukK3U6_iP~CtSx4pL@+Q02o^s z!jkPtoVK>VOnf3VQ0nPVEoMU74jJWWdIik1j1W zjNji>)UE_AE`XDJhw-CWV-C)u#(sTuro@@f$%CafE9_ePEZdHTvj>Z$Im60EaC_`x zG8-)kH!=klmJ{0GoKQH4(f$;5aL>W8@pVkrGyW*2_gX8gXhJTwV3 z3EXNqTmDpTyWEhm0`CCU(fFt&kn-p0%!RNvi70ABt0=QL^|YI>S5e959v?qB${J=P zP@D3%mX5AQcLJB595|%lrY-Eaidw;HheoqN9x>oA0N;0%;bUEmP3JyR#Azlb=}?*K zSI^yNtqFV4q*_Fja5IASD0cePi@}XsTtDJCW~&b8?NUH}q(m6+Zly}l%QUIqKEt?V zXHjCeoRN9jMjC#U)j+{4FG0#m((pR>@2(uR*uD)r#8r)Yq5eg%K$A$*@= zRNm@N9|nt4e#=9}@1m?xu!?G|=aN96jw$)o!C$bVs4lR2g=<9CE24`;PLU@2P{y0i zkoV+xB{}M(uY?C^@m)n$nbMw1zYbdS!AqUt=Vuaa8+e6@H)xylby-_OPw#w+w-Rd^3ZqmWRK5SkM?Xa&pE8Z13b;$UeQFgCSuDqVN#2p`v~#RY zpP?f^pk2Qw@{Q5ce#j+(jMPHxH$m;uvZ_&CDAhupLmoCynipE5xc$=IdV||5-8``+ z*NP~P5<3;%WmlnoV{+6~j!e*V4?Ab~^8!_GtNhX7$Qduov<{QTAiaEtlKB2ma&h=_ zqBPBx@eg8+oev{9PWx%|ds$3TSUJg-Os!ViOf)T-UZoBqE=zf6ij&Q+hw%y&VzdbH zef4W@x|_f2#W}L@r2A%su{gRxw0ei}q5*(Y0w1!mPv&I7w%96z3&x{BZnaSnd(+!j zy|p#3`KK@$S182Aw6dOq#Dbtw(>_)|S$UFP{opkZhY3^Z z@ta#d_ccw!HLK1~wiee%H>WVEN?nb&-Z!qb*7|u~#UQS^g4ui9e}13)KH@i*s=&cv zR^74GB%aDYq~{^hbugE=uL(3u=SYfae2&o+FF@Joe6jteVuwpaqS++RPjk>%KD(iQ zntl-RP(x{GR$;fg^J!nO0^ zM~-9s4p-kRY8pC{2oL&AFueYm2)F9gnwIe8O7QFSrQJaZqtoW01^aqZ4`Svy z=aZ*w1Fz#K`za}(ON4XY#5=aUtEaj<+~9I;zwL3QNENnDd*N*2b?B2>P|Zqpjt2EP zvtnb!t_rN&uln?=AX23}r@c3CLDxUSlhsXZdbo$zl%3tMzu+uDk*5(e_K2 zL8`ShGU&C4Ke~PNn-xBu<~=#r15aH$5A<68+djqWIrqCgpria$o(QQF1TKm}>BRrU zaCz^HN1NHv)A7OJ+pc&K)8^f4tMWLHnUGIN%_XK?0>zO6bL^!}hV1-14tp zzeM1A;p7)GZci)%@;tR`U8zw+@;MfIUI^(s;}5B#CN>{gllfOs01qyyKNdbV9WQz{wJGJStr{u@yZEC!C7zy!t-?8xawrF~ zrFuggbZqe385!-!3^$)&Tc?ly51@GUKVb&sh!|Oy>KqDPrry ziA;y;Vk6MPUq64~V&y;G+=xE&7uUg3;re*!b^5*VR$RQAoO(G9InPXwYUp#P5Vrgd z7iE%gqa^egd$1GY5v@x| zh(#H6#VQI?2dT~PR@pSO?@Xwv{ zG^v1-6FB6^qW^h~e;aN8#rlKS%%7F_xVufo1cu6~$iL}i}zwOFP#LqwE zZbBN5!kg%!Ax~46yj}G;dTcYwy_a(KQmdTDA2SG^zk_)Uf%lg=zcabp+%D5KoYUug zqH8Qt`xjzH;C0C0*F#tKtWCR=+JZGJZ)f~8@io?Xe)jV{(5~8T619C{yX{XLF}j&c zzvc&o2+6=!PViuMfA9sdGZUioG;Sl1U$^%E03j}+311GlMwBa2sO4@M#|^-M`Hd@& zDwEnXCE6sSdb75Gb~RbL(QiEVqxZI=1z&gEv}6pwKJNNzlX&Lff_yg68T2baDMqA( zAkgC5uazw9oY8v(JMY$i7NdT(*Dy@C&z&Uy6-6eu{MSygOq~xRC#pwu+2*Jx!zY-8 z5xf1!?b4o4Sqh5AY3dR8fj5w!<_o)YX6#<>?JZ<`z0K&l+Ab*OB|_efY`zRmJf`1A zqjcT43>pfCej}sN9mo;it~MW5lCN~QTRfLIn%0!`QG8&NUegYJ+_y>Kpcgwbju8z1 z_H)EkB1X>>>Y&nV|Jy%>=-@_B%-_&`zOM5h|C&41CTSF-8%LBX{V`Rh{bdV#A^1cz z@u9o}mj4mBPDrTYWtuapE^S81@bq?NY{Rtf{8;YQua%{o(WRf5k69`I#M}r@LQL^o z-{tUp3W{dKM{fB^FpN zH8*+e6`69Bs*VMCAm5>nB@A0HR*#6bPZV#Sr3~%rr@_EwulHpFXB@%(PfmI8ot#`@ zO>9wK zoTJ6p$pwDDNoc8Mk(z{8OI%|wL>#Aqv)oy6l@eunjgqxend18qA(%pz(=w{x-jEJz zC`c#kSBye__NHzZ=eIV2-!8KYiC3QJ zDKB?zQylSgn&Pi6vnZpQd7PGxaIT_wcv~~^qF#qthFJ(u{H;oz*1Q0f;-QcNgg%*? z)1yyuO6A*-hNfXEm{kD(Wk@`p_#2`4rOewjGkYnPKBq&fUaQwVU4PdFFB9j_AA=V)Wf7KtnM#@!>_;aVC>CEW)pA53InttyMJ`x6L>z z|8V?`u#fxgYU2+p3kqL9$=?;m{ z^czt{pgI%P5>oNUWD`&kt&k;lTdIsX*-^XB$Mx|NQ9i|rYlvCx;ne95q4sPQ46dsU z$q|E|@~~SXyq1`5w&lHa@ZG? z{aHnDJ&GMQtiA^e`Ye=oC7(?88OPG^@rVXB0n%^ZwkzwnE%+*$Vi(U$HbhJxfL%=; zdPT<@ytrVcX}6~a=sbp(t8be4Cx|{a^`IJboyoi{QW@f{^8XPWzvbfcr!IHf@$k?& zo$zzK^U;ldOfjX~4viV9orV)n zTz&XVh9!ZY-1`$ls@k}$LCLB68quhHO|A>k?XU7bZoEAb=)nrb(i{}o3~O?6UA@6u zA5_R)Ecv~W0rXpsiIq@X7V)*{oe`YNl!tqwutwBjc&O&lewViGsQqZEIb&;bv@~#9 z-%8j;L=)rX1)0198Di+#blgZl<3?C8$Y>3eI?QF z7~(Q0rkPa%^p=L3az1iVL?5w2cjxgFE!$LU3py&&qH zb4{;8C$`nrr@`gXp3q$&k29ZzBLbD?_7O)z`TC>;fcC1;*K?{X2B+36STA_1rF$3X zGsG5d(l%3zpKg>42nRTxB#kM)ai6nRzte&7_{iGR@ij3|`V1NcR>I3q_y-|4nQM4d zi@++>C%Ex6$D{I5%-bvE*Ct_PDbW)h`u7I*5ks0OXw3W(T|-X@yJ63{Z}ofK%1d=) z?YXzcnD0~+m;Qe0$SXAIRpss`p&Y;wr4n~%|5LhGZiOha^_!wxt!Jx^is4NnJizlsGY%Ctt9H<0^7iO9`!@x7#)z<< z&*sASeqd_PX0}M^POu62Sz1Bbw3$oYK|XMzovW{wznhU@t;~V}t5U;Di8x0`!@~Lg zc7D#UR17D1rr%T4W-$D%uWjfnHXDH1Vw(y6dfCi5lc~m_rSl&u-raG(;UU;+yc81= zK>!0qZ(z2i>c&*r=6c!GX}-8+ePQm-(|&lJOgm)7~i6I_sPxX--m&X5rdZ za|emBhocL>{&S%13_vOqfI8%O6)?)=wB(pi|ZBUQl{;H4s>hda1@7VxjY6WX9B1I-(rD_NZ)uB64Aq!IhRP zmP1<2wtavFlaZ*)xMaFN~ikh?uQ7fC~9{lcB6XS@z zpd4p(%*>WJio)51;uHHgY3$o1Mk>?<1>Mk@cE{SgagY^DHIO<5oI@7L1bIm)$=~EL z$Q)fl`B4N*{78>mAw4fWe#grIv%^K$<+Iggn#0 zulO`r2~I;UtJ!g48v60^-LF4>rje@1lZH#g*MX`rlvs=NrH*-sQ_?S-U)mD3%3&75 zuR{atewq5VM5WZmi|7`;nvW7%ugFssYO>mCQh zfWf(hFo;jW59qHq4|o4^45hKgR|r^{D&nGEHG};`oOdq$T?t9r5k@%cNbKEDRGFF~(Cy@Nf%d zux;q^dr(P84SiOe(nYM%TplJ$C(XInUy~R!NT1+L+LfdXc?vko=+LVE9ILi}f7?{A zsam$+I?3Ja@e)mwj@`tyP|!y$g;Zj5QG-KWIa!olAYaKFW_Hum{0!A4j`7iNRQw1OontIi*^Eh&$FXrfU5@qnT&_{GYOzE zA9UZ4=!&7}ZM&(etVjx`m75OgmsBxtu9)6<#_PPqd&NqVE#WDNuA%G*aWUOwidYRdqFW?0QGM9dXI=bEO{9eFF(hNu|K;o*U1l_X=5iuj?DsJC ze%>FwaS8H9K7D`AEzm|Dt637GFW@<49)s7$Dble|i!s0y9X(RSM4} zXsK3X+dgs3x5UIUPc`qi_VHu&$}`rXQ!O*5DmL{O`UPVFU3I}(_#e<%J`j)W3|X7b zCl*t|$Z6Q@j*LKf+C?~C7Vxn#*G2m@dr}^f9efQgf>;I71*ZzQHToZm7wj;;E-72 z^1dCMC4%SJ8eWGsvXN;BQMhUAs)AhLszxKrVnTIzUTct&LL@a-g zp9-d z&wl{#q^+DlmV}oBgXm5ekre*{uy$&dxZTsoF4JAfa?@t+)XKvW#a&XYh%_41Bf-6~ zb+((mLZ6e^!q`MwU(nKUtgok?-ItkZKxXw z28Fezo8cr4gzlxI_=B8^?yCRNb~7e zU}fXwxL}9jJas!)fIv?Jz*mg!4?7M6pH{m6r%J%T0v_>Ou<}&szah99Joh_T60)W( z$bf}&pa84CgF8Lu>pknL9D&pz?vFwlxauXZs}(Acxp~^XHzeEp=aZ9zKZR2oH7Z`u zOL+wPOWbS6^318c2Dk3_%rD4{_93+%=7hqSVne(aX0_XU$Y8~AQRpdc&~H?)e|kx> z0dv%%*+8Jo4D#Jr?hIXo+ecJudg;2HSS>MnVB;9nLzgax&7X|&mj8S^RD5Z?=Nx3E zp-qCs_oxs`0m`Sxjvxje%;Xn=TMDsUUA812=k8ylRTBi#hhii7KVqc7_Xr@VK8h%W z#1N428LS>H*L-|lj^*);3jiWyheto+FVSHGsl7ayDzZjf4*CDM&6#>4)ulIp0_1cy zBJYaUcu@=yH?qe&i0Ds*Sh0ODJ?3T-Ezbc&`n5te@PJ54qF1q z+dUTigx4E&41i|=UbKIr>lq$fFkU)4y{ZnZp*oevo~QG9+Cj&b;Ge4E6*U4SNu+Rv zL0hqMqK;_YTH&#SbLx#Nk}HC6_Z;|CD=yYG9E;7_2ZRceC9p?Yr(gd6Noc(8 z^OU|-6ltjLoib{tLpuZ`l+tn}J(>2%3bMH!y7nJ8{}ucvVtwT0>UCMi-iAB@eMo-R|3}pwZx7uUDw&X_cnqLmYik!Zu*-?_NqGRV;LEDjC-m4A%if zk{z1wOgkIh_W*g62KvDR_J7-MOnzm{{;TNXHfE&V{jB}b>>7M)z0bEI_Si7|STl7} zCxqBRDjzje05P%zhwBmdV&Hh(`obJ%9~@T7ApuR1R`AR5_kWN5K#zf`NFt1dunDp0 zV06>0A@wfAfNmDfeuig zdJZh-f%acx@+-FIJ0k%vCbr@Zy6*4d!d4J5-(%lzJHQ5(mg2#(5j(J7y=fSmvSJo` zN5O#7^yPBzVF{;qNQ{-`{HxRLUaGG;?=Wi@5kCl?CfR-#7kZ+ZZSJL0S^!auEopClj-hDx^nda?Q zlpxQD*oF+O>@Ujr8LW{?N+IO#HT(=l(CpnT1vS-hX?ESeeprW@udpS~NJ2GUSdCgx zOG<-Vk18&`BKiK2#qdM^^TT5kC3OZ4z*WG9vj&j!d3sIQ4!8Skr=yg}OE+sa1(W zfUsRp`KJdz(!0+c!Tr>yjxr)5w)m=BV=DBTDh-213)J$pBpy-C9p(O65(?5o~Als7czW73K!*!hyY zb3D3`P6W_~DRpjFgOt9U8$2??%ZISk*M>jbui->I3ZCf3L-%}Z`QmqCp|y{Hqy4`F zQe<;A3bhe*4B<6zlg`zC`e?ciO@J(#-3VE(jD@=7-PrC)zrzY9@`lo<^!+5~^^qITl*4*n0wJE>kag z_+z*(wQ^NqvU|13Wc7FC9;zbc{$ny`;3-t<$)hgKVp?|y`t6#Z@H7|s_N$+_$})kw zu%^GSk^6Xt^f)ER)9W%}z3WQT9^8h&D|aah09*+kD+wkA(Sxg@d0#f_p!SHzNrXg0 z!a?cXP31=W7Sgr}THD3F2FCz!{iNB2p5CS2BhI{bei9 zlW=lTKW%}wtXo=3zRDS_-`$>Fgz%tP9t@P`NBwTiPc@y%C~oJ3X2kgbsvwC z%%4AQBf2w9D$dD+2Xv6<7g=!F?;a`htS1ELNH!VOAOyANi=7F^+;5e~<0>M*V72qt z2m8;#!9@(!A48Kx{R%qIZIy#Bb@XjoGD0!Trv*kxF;n<^VE8GfoSwxxK+cyO`cWoi zFqL$f7p;B}P%6`B@NpxE{el>smzAjW8pA@U(}!f zDJzNmyFa&SR=?QSo7;|;)}S1X`))AvksstuHTj%~L>yj9hA~bYJtB&ijuj6R5**4; zOsKPjG`%X$pgAh!!(7p|#)hktEJt3i%4x>c;C2`OhRzou<+z?Zrvxr4V+Nu-eS3pG zIm8>VAHETu9c$`nfi5SA69T&ZX6f;n+g|f(T|*cXu%`yhuLPTLA~rIK%OfQ!oP)D{la+J*WT(~v*`HMNX zpQG(_&u-w2(f&ZQ!eFyKD~#t~EV!0v=BjejKZdMR$C`)*%lgb&v8rS;pvkSbCVT)g z(0@!9rg~BLk@ZH!(x$3^ojX^;@e(?;aAW3BUMuX3^}#v(HAB6WBc+U#UwXP?gNN2Y zPHa?_VD9N~O%a0?fFJ(Bo1$}?cagKytbzwzSC_6l7Mu)*o@QUa)fH;sR#KG|wd{=T zfkS|CE6Nl%*SMyOM+-Jb8685VgmN*V1jK!w)nQsbS&G$m1#z5F#Gz?)`N{G|Jn;Vi}h_}^+jhf+-+ zJDbmF0L&=!$viofQMH6*ff4VPh*TBP;-x>Cg!9qO&t*Cph#=@8!XB}aw55F{+TU_g z46arU%g;hFX!ewu-2-!dcH&}zv3C zFAF-X$4VoH;wZyHB|p>~ZgOY~RRxZGH=ru#sToH50Ki~iB727tOo~6?F!%jIADp2i z7T@YO<57O`wRSFO&Kv70f(a2zxE9(Kx;Z1o6^;JRO5ZjCGJgb*kKcPdPoVLNW)qr< zQ(ARRZLZ}mOYk@%2zaTB%3a|D-S(rBl`uVae*PFywWg;(<;xp?KI} zb>(~{saT4L)ijj9jrQ6iYELEWY0wWe8q$lqHM93kalNge+a3A~qQP6kBO#zB4b~4# zn$1=D$esS}`?updv+8L3b!Vfk!&lD<6LLG5>SNw&UJX-}Ln>6vPjVCsg;GZo`*BM@{ihJ#_rxXJjSe-O2?y91x zx{h8wUh6Eu<=0^1185(usrJ&KCTIx; z2n?C!T*$i^arELQ%YKy?^Q5p=b7nmW%V7|V$AJ)Eq1n>H`zX+ zAL%g_=1*l(noMps<=lV$`Bo0K2$MnbM+EKNYsBOhZ@c3aGY-ncZ6)^R?{9Uz5gJ}! z+Y}YGNPdmXrod!TtZAk!X;UbVZv}lCWpZ5=8ge`xg`k@HnXXk6P85I0?I4bJV^|Gf z;2ue~rrm_TO>^OQst$JOhD=x>BjTzhq!u=;U*@Sb8FTURro|tvTC2VYY2Aguya=lN zWF;u;1d6WbeK?WG5{-_?m?c>Jc+JRlr#LGo%{nl{6uL>tlmm?nsCmtFV~#1YKZ^{) zHAR825H{>u->5T2Ky9k?pR(Q)XBL=Yal8`lP>@Ef;+0@kY2R#yb-Um5=?RUbRQ7P- z%wmE#)WDyy9B@-ly+h2DO=)-ftJe15nS!g4L zBNHJWDcXqogJ-LzH5+nXCefUAT(O6gS z$RN5}&@7%$wKDC~HuAQE!gHp}*n|XYbu~T zoj>b!>R-Js8)u}eoqcD#a*zIM8O--P^19QnD-pdF1Rmey0?F1=tlRG@V>?0-gle#Z0yV@y4^7<9}28E%5yGh$xZ1 z={!aM=6J?jezR_B`I|@el0QBelvQt}Y(T?(X^dQkl*2{@k_~f+tj$@Th!i98=);xr zy>uM>5^6>!C1}s3_EbL=$lM=&6*+R7tUkM@OO$UXC#9wp@9VkZwwH&ps~vA2EoJj{ zeP*s&;aaho-&)thp5@mU#;1dz(5<{ST~KzD-b-;#Ra@Owsyegur4wQZVTv=}ioMrg zYjhWDdE4MS<2bcHW0I<)X31S5XoQo3qGwV-ntP9qOt7baBR{@V|0x z)p&L0Xz)(39d@W6X8~X z-_@G=dA{X%I3BF7>E81UY$X7CIN)f<1dBqxcUe|JE3Ns5&h}>L8D|wFexDE8{4PcpM?M zw|(Q*Fi)SrIe9C2#g6WVHyM=RJgYx>28#LBGDiC$4V&yx#xY2eONz^Obye;{nU#-zgH9 z>gk!YDc2&i=kmNnL@aMyu_pYDCF>#agom4ZR2p)snWue^tEV(BOX7kumMPweA>d+@ zeYY;qlmfBaUVs;#O6Rrz)zDr_#8<@Rh=t4;aXI}97!Tw}83Ovc8BlVY_^=D9??1U;c#_kdYF;v`tzG z{4*#uKdgcl70RYB%;5Qr^;_VJZd#1*8ZYtwe6&xJH0nzI#+i1Xj`T}| z1I#TJmIj)j@298tT%;UfR4S@Mx+uAf3i>Jh-Y(N6pX8m`Rsh7OG|L{MNFsjN5Wa!; zdrTXIXAq{4^_ag~lE1P^M&4x3bKFKKB)-R{MQ~CY{^Xb$W?^9LU4HaV6g(}jwY8?- zTC)pGY4Q)DHwoep&5&P52MoUW`jMCd9pfg|BZo!P6Gtpp>IU*&xrD<=JBPVE@OFA8 z$0lqZcxHW7KT76mYp5tsb-MppNi&dL!7li$y<#fhaB%^uLiD&48LsX}r$aIVJ2kIQ zn7L0z1{p`C-5DGT2_-enowig<@3mOG$HJs%EymS=A-(hAflP3TIE437=#%&FM1n2h zVsZ*5f==F2V{mT6<70^T;AgCA1drVT7R}-SU{vFHa_D~Ek@Sa)jPY6#XUGRo3=LNI zs_AV@mN7D{E&`bVjt06DCZr_ep^vib(#^jvxlxk{8dtVgqR2qC>xINs0hGJmZ@@d{ zG2#6|@H%5T(H1Au=fnrgv%ep7XSB&(u`QFjoKAy|B&u9@QSToV@Hw|5Bb&IL2SP1O$>cJwy=zj7>(oaI_y1NN#ng?nZt=2x130a5wheukL4l(m6@pJ`g-${D)vK z6B|sVbCbrXkz-uDb{EEK+i}&<>U$crhN7rNZ;t1K+s_PiPP}9FN%@lT5>W^qu%Yx| z!{(bA=@gEM6?LNr(>APXOQFft$k38G3Wu56AkAgmrPRnWen!kh zo31$wmW6xgKX)I2Tv2l~7n`UKW}+@3A{y-PAVNFahe@Tr3n`(VYFym&dcna#U`k?K zQ(T0$nF&SrMQ~EA!DOP(e_UXjf+N9HEaIzo?DX;Y^)aN#x&&a^Dl=PT!2>4`brS$M zhY-h|a&6&nd_cx2Dza6=YZ>6g=B4&20ge0v|RLYhT{hCO0&UV)_OtPxeResPljMy$?${rRh!FjLHcf5nvPoxX)wsC9;L|~YD3sL2(YN(eldsG5p0&b1HhmBKm=%+ zxy%~HTxtF6rt<{>cd4)SkG)-IU*-#fi8GiXsq)?S%%*#x9>a;AD|jp zBYO$tVLcmN{wAXrXi_nFpOMcaXxHhQdE7q)xf+l`bJ|H03DbvtaerZRf8P<+VpYVn z;jTS$#*U(xLwKsYu+j;&H?F}~P|b_&IQpeWuBVFLmMKS2AAgyUzzA4 z2+up3d^l|kr8CO2hlDj7Z4z!TpF4}#$-9I(dH9W*;0DAbE}M5(vLw48Xm$)^s~0;C zLJm7(J&u~NFP94Vc|0rmVR9Xmc;2g0nQV_P*cph!WLoW5rZvj+b>2>9aNZ6yKYh;3 zBI$o1Aa#bHD#mtb;K(c3ocim1WtP|z*|7`z&uj~tjsGHFQc}cjTe%GAUq-GaS zl-eqsS(fkn-TJ8xI6^R1+Pcb~v1#eWAZOb6F02|Uj4wy+dt+gaT2`35#$OZ2__u3z z?BVOD>sux>)yss0Mxw9Iv`_z-y$Z<^Q{u}E8u&y|6ugKRh%Q82-K+6F8bs5RWb-El zsgIvdN@wdH2Jfmn5MX;cjtq81I?}}Cp5A7ngNv>)H!Se&8J;8iwREaxgI&t1#x3rt zo(oYeJyGkEni|k8Y2VshXRrSwDaqMRB1>N{lkOYu`&c&a{c6XIN+#u*uWQX)g*#Da z(>_JKPafkHZv0tP{8jqD{+#faun`o6iF(c`-g`<&qFzh;Ao7jk;?N$&WlHjxr@4@- z;x$ZtyQf~Hpx(itbKfAzn&NlG2W)PiI*pp1Pn)HED`otsIP%vI{lhxv@{|M#YSmH;Eim)$OzDO=LpNG z?LS&GJc?^p%$dfFE0pRX9S6=^DrsAe(#V)S6rFb888}Z4_OA-e>Pb_IF6A1+P(vgA z`KIDI9`#ty!SskQ6bUKat;jJNdKsZBRuGTewt6M`!eeR1udgz@n6bPX#${ECR87K6 z?vD}##9b5Wl=>TyN@+u-T-Qe;yIpDogga}4YEa{!-g!oM7?!_dlrf=2{}v3qi0O+0_9Fg8{L3BO|d)=eP)J$CZySa)sjei8Lx&YNHSwMRLHsu+(~x3b56@8_e}NqeS) zX%9$Wlqd=^+6c>w(t7IDufK227*U zr})cFT{lzDxve-KlC1C+lZe;D%pN|XOTqBRXsPFe)0u_OPFV>y&EYE)WJ|6HiQ5HHDL|4YApMC0KOHP3)Wm9xs$~>*Lni9(Wo~p*f zn^Oj=$*Sx3yhI3D|Dd!a5K82z{J2=hbg z(d%Co1gc&#*yKnqJ*8wp>Sjh-71o(F{z_ml7M@;TQ&NvW*ws4AQ{8dr6yx~DTF}Om zmtuddgcqVc-B_Dia@c&mG|6R%ZrRBg8XQAWO+1}Y)OvgNsW?|?GwuF z6h3x11XZzV+o0y5SG)Jp)3J3&d?WXbbvR$N)=L5pyZcm6YkXb~&RbhY)zGe(tVv9U z?hV#2?R9^J($SGz`nJ$~pI8dba49E}!5Vhf^&*a5F@jJkR^H=Y;T!iUzQP3zPh!)L z!v#e(j2}ka1a{o3WQ!CeA=wtX`7XEIq*?7-tXJp0MA@UsZ#DLJr^*`*M=Zyz3p$f0 z?od=)=Jb!YgyOa~UP7bGO2!}&VI95en7{!qLQHLiheoX{A3IL zHzKl^C&TG_xH!|2N+ew^S4MXKqQoV#3_R78_Sr6eU$Br(Vnv>9M+Y=Zg`Us*p{<~!etJZKDQ2<;4d(BN0EwD5Iw zYN({a-J@~5K(gggedK^=S=QBjTUt9W3-+)HHwQI_3W}IN@yY|fxY-GAjPa)eBR$8C zQoFRePn(^(`8mN9TUFIF<~2mW!{cM;MoUFsfP%9qrqZRTvq#{2RV0&F zge_G~%`>L1o{8yl2}7fbVm0IKKA5L@?tbYJ<_fKovD^X~^Amqb{h!2I_dAL;#jcJ; zXo|+Qc&1L3jit82@tS0e^B~vH&L?T}E#wHx|WY=42!LyvWUlToqy!+I4eA$WUCweuwS)P zusfUhNPp+e9~BL=4bPkap2I{J2Zs2wpRILBK5IG4;7kjy;_V!&kE>Iw0b|c2C#n+# zJ8V{a-#2~C&&4kkILiPE8spnEim$#aQ49Y=;MAcsXY2rV+R{{) z68&NwhGve#GR=BxSb&=KU=lBj{8ynn-4=`5AD5))_L>7qk3WS@ zz)?3XY zr4ae0`5N>si$Auh16XF=nNOTZff(-|OS-qM!J>(Es_m-7^Kj`J%_X zMuPMY+)68U(}D)X$v1iyonc~FXw8ilJnH5whoU^6amD_HphmF0r*hKYhRhEclgy+8~Z6Zq*W`tR&zi zCRP9UGY2{)T#OcwfxAFR&ohaN1DwaWfsCyQmVk_k7$fj48n850!Fya8-uIO$B+ zcPKHkp^nrf;2h8H7{Q#}H*a}i=i&b1T=m*O)-~gU?O(senGd`vZvEi(a+A{?6niA~ zD^n}*#pP90(lddOq<;vWd+y;hC<6>^fpeOGMZ+`S4vJwaPHk5v2mkg|rqvzJJ{b9Q zhTMM0gV(x?8YR!h1WxG?-JPz*x0KMaA>TW_4=2Opviha%Y$=%Ps(f%6A97yZZT>jF zpSbcwZt%=0TrBV?o4Xvr0-aqBiYG+>iNh$(MoUCfQ=cYv5S>X|*PxfEhrDyyY`v9& zn5EemBeZy39UV>K;WMI$paBV&J`N+GLX4|}kDQffb}|5zCN6}Rlj@%BnnFH|#WBXU z{EC{I71`Skcn%pC0l==&psV%HtPTk!+3+rqlz_**xDk?(*R+>;s^s`BvBg%_+bU#Y z=5e&|nppz7bHKRY7iwjh%p)tAp^*CD^HC=f=ic!l8CAINXkLP>-DdLmz1$cOw$4a z+Y7E8d29Hslie+bhYD8s+~Rn44)Mv1nk*JP3yvC61C;sHX_*7QjqBdG&^d^wchxo8 zsuivT4i_n-;l8NRUoQ&as6%y)OOpdvwb@)q;@R;EVaM@KOo!|}O@7-!sX2_GiqR3q zuUVuHsqy&khr9aDS#q&tJYG7zvEp7Hjo)>_DCr0M1o-%Y7Ul+vI1l1X-;Js)***B5 z*QaM(gw91%C*l0%7p$KPGdNdeYueR-z3+wwmyAGtWf_PQ88MZtTU@d&-Kv{vc>wavK-GT*xS;d^WIPwpk4iXzJhu&7I{Gk$#iKeIU#ai!mwc*I;Q85GNmI`D~E^E< zmEJ0y(BEr%82^{xVS+`KPqORcu#=Sp1r zXJ=wbH}k6J=ot&^kxF;Ya=_-L7cboQ_y4|sw>;#FEk{0T^<$HK%dAAYGLRe-jrs`A z5;00)qwr^wLEc)V($kRs7nJj38K46r=SyVCX5-uIGTZ&bZQt1#Q+U7CK{n?DUro9= zg%?-;^wUaMMh#RjyX-Tw77?eU`<0NDYrK8?Gal0hl@_yX)0@UdkNiWBMW9b*D|4Lw z?eugj7yf76Soo;v7wsPIOfy=%q42407o)e+SYW+uT8D`Kp7)Y&M*XpY*@-+?Bg`?J z!hU%w8*dy)9|z3On;%mrV?|hR*^B1IqBQc->SN^D7G;j zHQ{%!fUccdUKz)ik=OjGt1L(79V*p6k)Ag|@M!x^@kex$EI*}97vT+mSxH%SJ+dnj zFxm5%oI}ZKqW_IfW{{(1Y=@65$ud(O-fJcQmfG)`ZEl+e=kJe+8;k@pQ+V(SVJK_j z(OzUPvqYQOaY%5~%i#*PN6@2|=hiBN6Q=5$@4QHH$W^0vq->INd!FAb`*GO-y&Iy< z2XQ&7TZqIA4qUAW(VshT3a&YiB>IIP-jR^wT6s!p z|C35Lq4SO^S6m+xPPeGu5`Yc{e8b^F!uakEbf4-%{{CNw_%vrGr!Cin z&k}E5m683|KWES*iB;nQTSV;Pn6~c@`j-*pvmXOS-acQ;Fu@>?5F7&`G1n0_6Cprn za5!o-q#8i-!D*WOUchC|qsBM8p4sfZNsRZirMBb(9XP8^pEI34%{nZVUC!3jqOxHt zX(BjiPPe%I+$q@c-K~*@j;Wcv?mwsLYlXEL5pw= z39M&?A95|abCV6|n!~-Ahoxyru>spUg;{&Ey(V1m1p46Zxsu-#P4}e!ttZ;DZnDI?R>l`AOx*$JN?!AsxKGpE*Hz*r3u+ zr=Dgp+a!m|RCAu-I{pJ5>2t1}V%MXBK}nUa$NS#fq6$bKWP+`P>(U-isv_P9yKK?& zr-8M!!Da6F2N3A!KLnz~>pY0*&(r(gzyG8WeZ{=We0>9*>29Z4$G71sh_{a=#V2U` zb6(|o`$2u<>(aA3wz3Kdxmw(Xn38($SGKfi>H807Tl5?dLQOuZKM$Im?nNw_j%rf~ z_k<&!(oEcMD<>#>r2`v#l#-*n2^->*|^+D|m{vi*0Re?J7Qhnn1KO3BN=Bd|x z?Kx@L6NIn_DUoJVuavN*qk$oG6iSY9^l{Wk0oGcRKU&}Hb*{lxyqv;(HrhVEtj(A% z$@H%D#H3H9_SKoCGCK|(iM>g-HaOcj(TsGPIOtjvU3a^RcwUfPyj0SpDemHeRGW)l&m}a6ygs&-H3<6~-bbjBLl- zcW)vpP6QLta~5g0DiQ0dBHv{Wk~up~=;B`sX^^IIO#B#$OnexxosO}&#$9FTZJ-*- zxZz+vntpPv5rQR<^;ZeK36G(-?b|9+H#hooC!?az$yl&qfHSkNsN_cXMgYZ@kuaHQ ze!FM{$(8S4yJx0M8N)qXx@1Opnra`!r=`cA3p;jL?fC65>o)u*V2YJXp(5g&y4#;t zlq_q1rl)9X)XdCNHCWCVHtEx9Pu3p#;$3oFf=SW>u0vYy!_gbwBn8sJj9z>Vs-``t{ex6+Uzu^GI5^ z@6N%5cC>%mOL?v(3R^WKMmjGtG9Jz@#c}@D7_%uGpN&k&k*k8t1B#Cr9* zPOo#Tc@|h5J`G(+*-K)~&54OiCr%EP&n zx!^M)YpdA!go!z*LzacB>coj^=KyDKIGJJCGvVm)csoRlUsZ04!}tQlvILu0 z)l1KGQ;owb0AYiAb3>*UY?w_L+FcMIbjryaWxV2eCfj%H7q&XWK+~Zw&wkJE56{T( zBI?w0a6VUB`uyE$90khA1_d6wAom`_z*tEWwe#UQj+x9Rs%7M1pT<#mmA^cbp%dL$P5Ifd*&ED2`2ik$trWzct^)K&XH9`zv^#T z*nB2N$ zjm>uBzSpll*7vJq(o`9(&Y8E&MnFkc9PfjGO&-_0zo>fis6Qzni321LDSeuqTnD%R z;4e*_sCWs7Kk^GwzId%U09WC*MDdETQolSF(0Sah90)H1c@VLh{^r)?01k3dAO7o# z)QItVkZ@tM5BjBl#p7VsiJ|nLHn|R6=1MP@K=-SEcNo7G;b*=+8TA&!TByl`_h{0} z?cdrGhEmZCNUP=jJ!(<`%gt&vVcU({IiTE)9K0Y2QQvMOD}o3VsbuN-W*v47L5mp< zvGIM#tbeTGb4-gAf3z3}A)zpw{I~Z$RDs|&>P3`4WR>^IP?y5Zt$FhSI1Ysi~`X!F@CMfQL$` zQ@Y+v56~WvuoJ&sv0PEG!38>TJj#-+gME)2vk|9G?LjlRBB4RPv8Usr#IWry6>Sg9 z7DLka1|Qnn?Dwqfi@5d9dg0SnVS*(Oc-isW;8gg{2VNFgj@xo9E%R#u=YPjTq|M2# z)ix$jykv5wGgJP%*}Ng__k9L#wRB#p4-eX1vAVzzyu#V|ZHtC46g;&7YTSaTt^jPS zoq z*4rcNa;0og0R4y|^6r3|vBb~b?y~ALwjWP0F#pl`hXEz89cFk}9kx}BYFhLLy48Fq z6w!jXKp03#iv(pvR|3ahGrJYewEhiy)TUU|f{{WsHrBbo%9>J|O;uZeWaHJ6H8+?W zL!SvX9gTj(lsD)|8#u8CW*rT>It0m{R-#%HVCfzspMN5#y~%?O2ep4brdb$uLDz7N z@v=64kvcn;eY4q(#0#jpardkYKbO{RtaS+eHGM;D0eNrwh9IQQ_spFV>N3LUwDn<6 zC6<2(><9OrcQDtf zw+E29kD(e5U)OR*=bTlpp74PhMrwJPA5UT4Pnww-UOoF0Ft{{E1Gj*oT?SgV=yewd=hlNqJSNHjytlm^tll{gta+~|&$mAh6kT_U7?#s8pxO*{FHa4B+m_s^&tt50&(@fzwNth?%oSonU%3~M3k~aa4)fgBkM0{lI1xHcsM(pDBL`$*!=t1#KXzkiV%zc%AuMbs~A=dOsaa5%rM} zf+vFu6ur>`Kl3*5z&_)F9ReY4?uz2F0=mF2`w2l=$Ins%({-DG^9GE=?K+ct2%jTU zoeq`^;ACzCkaBbdi)_M9U;{shmDd4CsVZL=y`XKo30A=ITg8q^fSk^M?sY?`OD9y_ zR#DZ);6gwp7-{jPf|0TNw?UZ!_{6{ z$uWwbNJF;M>)Gj%8!bh17sgy^` zctPDune)?9LuTtNn>6%zIdB@2n3Wc?cO%G8=zxv}KW}qo^~VXp zg|Toy+h@IRb+ZPdvep>y*lpfO_lGUQb4GHY^G|Ib|K^7>&JG7UfV4moa0N>UO>2B{ zv6fxn4TMm}^R`v_L8GYGaYe6L4usHws zT{|$pEfk(>wF(l0X?>-tCWX#9!mw){tIAF1oo2UzwoBjwK9yz@yFAgxF9lcK{P;9( zK1MX2^V8d+%YDZohxoV~AsNn*D4w3I$LmdGQLm=IkFcC9pFrhlePzljS2=q3ZE@~4 z-3XCf@+zz2C}&n_pW#gA$wqnIMdv15=|kPYfU2o`<#OlMjNfo30aqp-zUoIrLr}|? zR@;CL2RZgc%u^c%M!)z#;K43@Hq|BpO27<2>&S)ZjEs4NXuU49VRp;)Z|qy(6PF(N z;U$K^A0v8c)o>UGT#3(TYh&Z%cfmOt80A~Jz-K}1OLx0)X(kT;D{dD(f^Q3)zkYo6 zxaTeKp)Zx<_XDti(9=f;e3aKt*~((m*J&qj`3yT7Q(J#PKGNbO{nP;v5nYU15NM`# zT=JA9G7(0uA~I5uqqXH-{q_+ece;k>4R>mOW`0V%shB~brRAk&u53`=D{w$ZRfhTD zQ66>zy=g?mrX{xiwDI-2m-zb1r6#{{S%s~;aL@L{M?a>htG`GfK5b_r;PF1^pUA8o zxOa(|f)6Be{NQM=qMP+xIOBf^w$c|&(bxB!2I1e1gjVZ3tiLGUd-x{6-1*x%{6U{a zey+C+0?U^kZ(QDk8`<=?#JB5+=_T2(Ga){h7nZqcQvtgV?giUUW9i>{}3FpHLwE{dwU&l`&|aED+73S zsdd^7jq!_D%_ARq?X9dExbzlYdEl~yUR;a+J>0;yk<{U_ZCN+){n)cNm16FFzn&_k z&d)scPDI6FF?zc)-h{y5p!9AH!{n^!GT;+8Lx8n}9T+H=q*FvK1MNiQ!SUlOpN4S* z2ct)SY>OIM899fR%zl z>qR3<2GVW??$E-eTMz?{$MHzP0NYt4bQFBi`DqgdJpz084TP^DO)&kKnhzS_=6UVq z;qJVK+6}*+EBL)Mvr?A-=N?NX#Am0_VSrZq^|~KLT5j~2P5V18d^Y1(e9x?c=cwUm zhdxce@sL^#rR?NKrA)HVWtS;j^F0OsCy2Ob`1`JOtm8_@d^<+2za@5@{CbEI*QX`Q z$6JTSIU{>f6L@dIES5=cj9bT2DUb`qd99|w>v#m%v(Z6K(u#sh$6~mEsTCAr7uKFR z>g&StuR6O+Ebh1?d{!~q!1kFK?CqA@xOoawlNgT&^YXvD`-8G-RZgc<)MLIQqPIR$ z;Df^)I!25(qejmmJ+T`)p{Z9p63v4v69%fbOOF7312@27C%36FwF69RIk@o$>c(p! zcZF25WL#N1N;LGZjH_WSH2PM^i$J7Tyk#5>X=%R8?HQF(YXTfD3Qx#XG<=Lvl#oW_oC z2Xj<0ZvI(Qc-CnQQz|DIkMg$L%K-{q_MLF`2DMf6hT4bulB}1T9GP}%AB*B8>*zE}?;>1^-&g44yAv4ee z$R#cm24%VXEj`?-TyLP(-@&SYoqkYK^cVGW20j%Ks!qTw#Ln`;!iIsrDT$5N3jcS) z@f}b-O+{=ttbXUKe55fxza`QcPB}X0nDgBw!J`gnB3wjXX^O?o&N+#O2jK-PPWcR6 zxy8NETvo~E=UR^*Nx>wrLboqd=JS)M>q{7I^j>SA4a+~4fX-sjeZRmyb&QheKLl&u zzc{kF-ck)BC`$YY--Dw(ENlR`9n4(<@S_4-79$E8X?2ZXXX{NnrIF3&CS!3AJr3b z&m%tXO0J;!T8LQgqDPfKt|YQ+|0dn#%T_t@$4Aw-v^_>LrzHs+UezvwfBl| zj*AY=POiyi8w`fSYg?wIl*IQQ)8lIxLo)U+BD~~aO#-^O($2hN;hRWm#B&>+yB{P7RkOzjJ3}7NCZMf-793Zha_|MK z<=~g7z3t7II;XBM+3Qgd>nu?-RsHU(EuzI6h-(e_#D!7Io4;?|J2$sH+McO_AE#R* zy}nx-5lz7}CQ5;@wUP_-pNn406$o0$8AZ<7h;Z@$m5RC6=*pqY0aPy+1?3f&ld4tR zUxsVmb0cR#>qIIill4J2t5LCcz$q}d46pI`QT7uX508ow?Z)hTPbeFUWkj2MJ#K9L z#nh)b7tqt10k)1V_HT0XoGvV=j61>c4|s_)&X7&Ra%>^kb&KC~b@DuMi@o*zd3H6{ zjp4^JnKlq4y8h!hA%eTFTb?7z|&%vyt-EiGz?3Q+xtf;zy8umb-2q|0a z{W4sKRPa^du{8tTbB(pxr7{^cTfcYwVz1-*^&7ni86QnQIjUOPaEhdnv=u~$Mg(DE zaNe1$Z`dVzac&O8b)UqyWdbzlt zdh(OB7l?^X?k$F4qs%~769U+&-2T|$=f4N}VxbPWeuLXd;5P5d$(|gfvQb0fL$B~n z$ZMV|K)%^U#mhGagzlA;;TPVJ?0+jELTNk+46}gU&E_Dql@+cR)+(FZ4;s3p`*FH* zY|L}Y^MzczQ_mdCoI7MwiospWkDyk+u4vrJ?KN;q^v)~nk;|!g)>2|W zxZS!CyXahw!j~Wh{NO*KF;9FPUJkx{wLC=5BBn=rhy1%=X|UtNFbbpbCf|YflAmvZ z@BRP!8UG(oZ$VW4Az0svjfkW17;Y`Y8&{4-=rXv9>XG8x>R`rN6Y`khT7NulMj4UqQ7NXlLa@i_}@-O5?4BVn|37B-og%KqDf{8tBNFLddE#Ax;~YoWO_Z;MD@Qp z&;x_we@5T`@7W?Gc^e7d4)RpjyU)L0Bze+L$nyR}@X&801b^VkhNsx!^FFCXV|s2W zt%4qBau=^(D5wT-r(56=vE6Cj>7TU=s+AWYngbV5(&1p9@Be-*W?`QmWHj;ES(*iD zzuFvs^QPno58TXTfC4Ds_L_+cI7Z(~=Hs6X%?@b>G~yJ0cg zS~CyN$L`&vk^t|^^5j1Lk4R$+O9>DxPE}<8P5FT)>pWGI=O>K~7HwBJ2<@bD{x0!S^f1R}$|1tlk6G)N=kl-jre(4@iYXAWReT;nRD?C( zqP+Bl2D5@X(>4o=zjOuN5wWylYiUxf6)GB=MkEwCzlui=7}`G&*%#*`-^>qYkWCM} zuLW+R++|9(~*A-Q%5L;l(n!NJxVvu zAS8-;8^B!NxO!Nl7jY%1g5^|fA7dg%AvGmNaXE!x8I@rky!89?XGz{PgLO>cp}M3z zWq;qUWZLBw>8qe7i>}sVFq^f6+?4_2Y1pxTR!9&rKe#cmzA#o;VpBa?y1eM`1&mtZfch)B{*pJJiU}Fi5wB}vT5p)I1a8a42y5p zcV#Q9vmS>$IM+WWQ*v493H)qQO(Ks_7kzp%s}UMYCfKxql{*Ux%KsO%hi=lZQyn#( zOmTqn+3(VaxB3SluS0vJ#v~&=+=V`XImuRe^J+fcE@ow_#F{{@+$5%YE_NbNCVS#)-L`I*yseP`SFk-p zuq`X>iGMtgRRwCz%XH0$X1Yn@^o&=Y7ym`|;eJ&-F{E-&&BH}-Fm^7&OA{FDjB`sU8P3-ym&!yJa@SoG&UdEzXDehGp*9D-C)=r*!!LX;O zJ**CQ&5}1J_-Y*m2c$tt0{T<@X!WrQjkL)?(3*|DYnX)O{NFP@mesn(G26WDLR`|v zOD0=b^~E$$u`S$I&@c9eZEEbv)@-If8NZ4X79Wazt7G3+vSVZAU%1bGzF3c;79d1{9Cd z_NbDO{vZgsxIiQf05l+Q`wry@c)`d4{wjkZn0KNN%%^-H-b})P7fj1va!tFgArH1; zO|a6|B-6pKg=wk%g2f^fx>|U4n#lo7fkEr4(^FWj--Z1rc`4D!9rumn2r{t9&t|4^ z*eWGpRHKypEH zmjlW3&%t}`j*~ZPZ5IAPw;A8K{5F9Jj!WBY{yiOQYl7BCgK|+B&(Ip2!q)lw0II0>GLGBnRT)s)j4?h0)E8y{? zk$7iwS9?&sez%;hrY-5pg(U&l-3H@@*ttCM5CIVY+Wg;#sUY9@BG2XG)&tz-2!RW6 ziT&SY>OZ$6`{S16#0J5l(6Zp!MS+!I9!BhtqIC5t_VKf_BIiRH`-c`$X-V_JEvl`r zciVj8yUXu~%f77K{1eTB;!M1*(rw_Q7d^ROcgv^!Tp5N#=X=Gq)Y?e%=gOKx{vo(q ztI<$uELoFy>SLCewM}pAD5z?Ex-A{F z`XT$qS9+qyY)Q^HQnh^5{9V5qy%0NK%YV$kI8gHBwPMojdH+Os;5?*) z+!f`v5wlAZACHNdpYu$6qxkDjO^fMT8u5vftZRzj8`_;%@5#``WjM3H#}H$jM^~|z zSJ3tJ>fLAsg8xjt|8q+Iow-uVlGv!}@o)3jil%-V-^K(;^AdihNyB+t3-8$KjhJmx1QBURm>pj#j3TQo!)z!XN_FaQxRHJ-8)dCT|_XZ=Olp2|~v3 zENrrCZ%EsTO$oo_zYK-H=4od8|KaM(!GtSI$mghXreP7pgUpK~S zhpMn+vhQ+;sSFg%--7xbafyrGq-Fi<|;8Emd7zB8tv{krtnWISl4AWGgBT5;%u;0u)}ccQo>T_dQkpdb1_j zefaU6^bp%@PafLw{%_M;+6aV}M56^=)J!Ja!8-6)H!BQx4Z{IU_~j+V*>> zxkk2P(>(>dO5X{@GEjtY+I6~~x~2z75y07rZQa7PwlqNg1eXp+io*9Jkdv=^#F=dC zNEM9wbC{~J!W*+$TE}5GT#ZyfrTHv1e95zTNJzWN$p-h)9dYx+KE4}yBvYjK8e$y$w8 z7yca8o!Qm3ROf>;St78t$gT$5iSY(IWYqlR{ol2rlUOd%xM8ZWz-jdCnjX)HEh+XP zy&fNV-3K-8d%u^X&Z~0g!oVD0-n{ToMWH{$GZcs%{LRgGI=KHNYtFn_{kmB>##m!o zBhX7U($?u;N{A=g)XkA`DQK57=8Xqxl=jDvuJ{V)Z3)a(!NGIUejgtk_S?#5ygw7yNBYFTk$Hgi6{$^!{v)#?SeWxl&|_uok2=1n-Xg1o8Ts2f6D27`D2&RUL2pFV+D{(S{Vn>!=m@dF^Bq3~w*?R`q6^zbq)LyBd!c%@wM$ zd5<$j>Nc4FVS@ed8UGoh{C7b*4dlk|hBOw%Ths{Cn#A~HYEI%sElQu?IRmJ;Gj^3IA~gx6LdsEudt`z$7{xTvt)#*$tzT0H4Y zK}CWtw1LHCXmi6{`8(G=pcD)WLTS00gr8t-jGy=B-~!yTeM$9G*n!ehLm}sg9%(MR z4JkFwM$xJZGds15yMer7h56Jq5PE!R7&$QU%erC%YP>UvSf7-yax#ikwAcH2+Rjvz1gH7vO?dbtSa`^B?%0s0pfsFZB?ykco7Z# zNm=skVKM;cnmPkIXwLl)5(QJe8cy9Uzc<3gz;*Nk9o~C+Xcw;{qsMpQkxrs~Z4Y2a z^AjkqQ8jj47OX8f2PvjNNcuP*NE1NOFZ;(1z#9g<^arjTEx$o)h!-Ld;*x&=%9`ml zn3zC8!436#n5sFxbzV8+61ZwKDx1tJmz>DmG&bFB;{zW^D!_qSGTO%De1}~^o->y7zHQCD zdeG@rrFovbSajRadMPB95Q(KBOc20O2(Fh<(#2ci&~WS+xAP8@0+5+f!*Yj0rrg%eY|tt3Vx3`JCP2qa18d6K9|yFJqn}Rc%Z!|rIS&PC-5Fe zp*4|pa962XA#}|GoRS1I{dI}MaFbO67c@n2@{*~+k~y+&clB+zJ?TpPjY#iN_zNL} zHJX`(4|MI5R3m%4Z$lJz2}7^_*b%yR>fmbTfoDaVXaB-H8E`){QO@bcxz>QTAAlt3 zO_i06&o?9FD`t3T^*@Lj_?|cA9{Ev}Z3&~33eoMY0A(c4n;cUhyqCwKB9Z0Ek8YVp z-iNI|+@MHX9(MMRB^+XW@nbqgfix9a9^@xgqr1Enh$s_NE*kQ8bJxGeL!9<_q?Jr6 z)tX|&z3+6%)TK(!a(=4Zv54_7AIAFi1xl=im1-!lG(Wr&X z5JE}L`zX^TFCflz((9b}F8(57S5awu2mbZ*$%MfE+t&(G2B&shM=Sg7Zc&is{_hX! zJTZ4M>`AuEy*b0lqJ1Xfh0V|d<4c)xm^#Fe?a%_C71I9Hl|HFa(N&N=+&~NW|Tl%n17n^ESz@#HAe|J`^ubc(NF4hfKQI z&#Tp0dy#ZoW&HRYKGXXH+@NT| z?}e7i4+jg&g<J8%4j-2{5wc_xjfN8{{LgrqUCg~ybXKEQ;7 z1a$`kfBHke5+UD?4+)hAD=OU4%eu_Gw8oQ17}}L?(@LRE7MuC9hMss5tC{NEeG?4v zUUNnwd^S^|x2zDLEF1}My@KU})`$?$m@b^yb8dn^s4wyxB zJKHs4^|Uxf6#}`T){HN^ymw+pSRuve)z#5?8-IRgW%9B7n>Pt}ni~+k!LUJY%EC~7-(Y%X* zKTgiL3*P~JRmb*N#iPN*n$|FZJ`T*uZpd;So27^NJw|2~$a$T0bwKcH{!l73$J5G} z%7zqnIkTaKiDsQ=49AAarv(|eE0(-&#CXpp$i#Cy&$*!%Xq^Bid^Vzg>L%=y&-Hza1oG2lQ zx_JB!t##sM@Z`d1DsG5Cxy**FNh!hH1X*u-C>>zB1gN^`!4Q`X09-Zv!3h|2EEfXa zcyY+VQ!`!zw-+T2-9>d?Lm!8b*XAinNA7bQ6R-Bj9v>d?dkoz^6Gpx6zGkR-NC%_^ zaRmE_bU*^(;IQcc1F)$gcMGNF%k^?{Sp0lxjOw3YimU%Ai*r%b2Z4b0tmXKVNxRx5 zLr3)9;CEV6TG`?(c4K!dr}g$P7Z!I0a4lFKwVz4W<$c~7th%4bK^wW0CYY;e;&FAe z@z?-kO)dJ{riNAxORCz?+R4Nv0Og46ygD=VZ>^#DjD4vQSLFRRc-o<&_2o;Z2Wy(T ziK(aGal9gR`RG+^Ut7cp85g(xc)IUm&j*Z^3*Zr}*)TrRZ@(~Of1w34t9o|(&*Fwq zEh}q#__y&@zd{T6K3dfTcGuoBtE=7|LguR?m5XGt<4LID#@u%9>+sU=0R~`C+vnZE zM8##!jMR&)AC=FUc?+{|7TXj7l(^kLPv4|`B5qAnbuP?R56THeU9cWFm#F%;&?Tik z;2@aEtg2SeZl(ppIL`-|!nd7O6}G+<-pHZXbZ|!Dk2r5LGNMVNt(atMVtYt&vE*Bx z+a~Mid8syyN062Wh-3jy{Xr?4>Myn}2v&Si$^wwTh)#+t0J71W4l5r_O zj2x`k%}R?qO|Jc^snHHJ10({DY^pY~DVmvXFHQh)H!TytmJBTX=FE&>=wW}7?5jwp zV41W>dKik+oZqeIG<0pg3h2h@ln1&R3XbQQBeVu=XU@2E} za0tQTpg=L6h{&$F;^A>X6VrdTs&Hzw|6{x7NNLSr}|;$z!kB zD-0Xm(iycUBzw4Bw3qy}5c0#bRw=pbG$^PSIu~hI$^`a6R}d#x=#YchD_iT4;Cy#1BjljsbNc|j=Vf^sL8H(Ie&dBNSO=bVxS(Z{zg`Z?5r z-+`?X6u-#D)IGQ-cmFv+a$J9?+?)G5ON?*9s(o0wcINfjW#94D(U9o2kH737#pX%h zbbQqBK3lV|M4&@CpqGZdwft@0hpHQ!6eAikRTa(ca?0Ld^>&+?l(qf5x63o=+->Jn zwnDcpR6u0kv<9q5gOheDs}ORh=*(;Rjcb?vs1I$3k{TnYa`B%M`x2{~x!Bf;X%lilW|E!`f#$8?Vi(%Bvv(_ZqwFEQelB10J(Yd+KyC_B%r1Mnp zC|+{c03`lJBNbjv8!LWg#C^{4V5<0%x8d%Vn{C6k@9aYvN%*G3$L;{=vbZ$W{2%m{ z9qeoml?$(_6~w$dytIA3y+WBfgk(~_Yb@+~$hxiFXV1c8&3;wMq2Ro6q~OM)^`AMT zeE31~dY&1b%ow2hcV3^Jy94*jfslhW=sd_SM=a*JZ+ z+6867iF%m#rtf$xi;`1M?y5@e5UcCR^CcwtS!Xu}Rbl=7=L>lISHncyhe;A$!wTmM zkMsD5XANRCSlOMC6zA3sI1>Znpy#8(f$pQTbOi@T5l=rO%Rd;HDEaM6mrL@#L%MHR zMcok+mAxInw%u$>MX0*f3>G4Ug2H%MGQL2WFx&w{fD1VWQ!|nKysIC|caVXhYIXw1=G1s?xKk5%=9An{_gNSUlmPg5N zCf=ZAMw6FmW+5W6yS^k^`A^`@#!;yp<8&#a*FMw`T|`C5-ox&#{p9n@>~-@y4|RtQ zcnIB2ix3;-sh(Q-0UIAYX7B;NcWwY%=AA2{-6Z#JDxTq@xUazFFA=(DCq{1kg$)|w zh;rWDULW3OX4WTuqQV!BnA|`N>f92j8o3ggxPH+pOs_mcErhCLj{`E0vZ7nc=H|Kf zPkLjTTyE8so92<_zRUMDlF83?6o>^*qc(X0beSf((s66GfxA0%seQ{OW zCw9X7N~Oo#DG4H8C!YTPGx(j=HdI2XNATFtF`YMpYb3KMk z_k4gBt*4g=`IyYp$@?yj$W?jY#l`J`MS|ILyG{La6&?AC(PnmAqI*hYVE=i;pB?rq zi*`rHb-X7mR0l++yd`@2HX_^)x3H07!|M*Wl%Nj2mRW9{S49us{nMtFB8vo?&cB*? zVsuWmdjee!Ovi;)Ew#}#No8~;UFj;m!oT;_i#XT3zP4l*IifFhUt5Zmy@fBKf9zLj z7=#2y;Q5$-kLoMMTZ)Tt>jjwxE{8iq-A^;<9gc8O6SfuD4To3s<=&_K-qKah@)XZF zjJg}QIn{=B@JY5|aA+G0QE>b-Xuzm+>?4-ADRR8N^_g56WLELEAAWPDAvwJ9tBtJK zA;!b4$?_XE_cPw?Z6$PXjE=x|p6K}dX3yokmaH98hQ%veq&VrSN`Cy;<%+Ob>i{3| zr#wXF26#T!e9+SN{E&WNpWY-wion(=Zt`95UzpWpXGgcs#|=6@ zFjTs!^{VyP=*YHU7q?*j-I2DO+Itsf++l9+9BVcV%E?hW4ZYVG(E__V$Zk5N?cS8` zc1$ASTgs^~+i%dz?vB3xv3SxD>xlUEGe2wXpOFk15DKyOM2+nFui|!ucH;gR|K`?g zoy(!8Tpb3=7QS;hKc&ZPbIWwQ%=_$p|IV7Lj8U(*QjoqjHubnQ^6A(2WZ7;ZP0jL#s%@bp1r0Vt*w1 zXN#Wq!>8+y%(CljKNoigNVp78g6u)L6VPhz0{Kh9H($k@ANXt0JVZ}?xu23?j@^;s z&9~rRxT0gFg{x1Nx);{o`|*_QG5J%v8h^?dOzwC41Z}l53-*G0 zakN0HIx3m?`B44VvO08>vXqpp^hw{z9wd!1NGgtIvCOahmIFP7H$n9~>tODL9OUqsJN+hB6Q1K#6*Od%h7epu2qo2cdU$lx zf=;;dFrJ;Rp@O!NEBo@&;$p$P?UM?KtUb9TNX_aUu88I1JWL+Co9Di&YWPpy!|i-4 zf16gk!(+&m8fEqdkwl&&65{67| zl*(;L`hmP#bC_FJX=`ILR^r%|)@E`0#Ybg${}ek*Mre3RmBLqtRQxYDvcJcO97ttk z+^O&`UoRDO3p}EFXoH&E-Oi$GC*<~?-fU}WNi4M-$+OotU2+M}kyv`=JH0U6|6qr> z(&Gc_CXsgVsIWK1vj^^>%nPe52xbLIPi~LaYWbm8PxHXOGz6G9r>uKRU*G#x^mFRb_9O-Imv5b|1v7QY6Jnfi`iMO_L; zecFU~{+05QSj~&Ee)p>VI9W_0N3y54+NxV-t6I^{0K+)!1x`CLdsoADIo ztE)7o&`xh}i82|f`Qe{S3qY3ABwVoV>9$r41OJG(Pnw|ch@Bj4+5F{zx-9E198KmR=D!qP?Zbf5$M^$=Y)|j2AkEM?_W?96!`B~Ap+Fu!5u+kzy^@+q@>C0xM`V*im7f`8!X*-mw4Hj^715{%)b+numovId{6r&S&h@kpT`}#g zhfow&MryU^Ls?g*SIGENART=3X8B2tj?tO=%B}9|yf{-3P=Zpv;}pdUV|`@nrhb2T zHw0}PKFznO7(IcIu|Io$Z&a4=oR(lGZ;*mq_tRxJqI)$^YP2RxK%ln@H~j65EWQKj z9r&jLhsIr$0Zm`HGCB- zbh*J3=2I#hqN^4;$8{W?AT{uYh$AeOx}MP|>|PWgJ8p4fZ5Wvim^@4E6|g|*0$c9t za=SxY?9bz{*A?rC)e(sb>qJ?{CjOH1T+M#dU`tR;E?oouTruG}u- z&GzGn?!Rw3F`aQIRCp19}%GhWcV$!qqRF ziVLOZJX&%01sCVj37{LC330hUW)8MXp*ku|hhokvx-MPL_bi(j{7!#<&QWd^)p@%~ zQSb2F(1l-aWtXiYIoRmsi`K{5>R%1_VBRV`dF318-BX&U)eTmUGBRAn`X60wk4&&` zjs8^YQ@Q$)Imw-o*tPDIDlGH?!e#{(+Xf@$PQL4GwxNCA-6D5F)4b3J!8slO@7m`x zs{vu@n6^TMbNNFQ3#QFtmpVMGyVFB2A9>GSPInM10l}IFxAn+7)q_PI(E3Ji8fHUR zph&0M$;ZU+Ctiua4X2=LEi~_og!$-r(&g79 z1M#IZq?V)*LY3I%FsbCTPoICDER{)#UNT!fJyE6A;ySX@vML@`BX`DI_l!x*)XLIU zoAC4^YxS4UxAKKsB60V>1vS_|0hWVD@y+6~rdugl@t0*~Zk~F+_Q)-!MoOqvPFi8T zRLOh)Y_Zjc6a}$H33!MDOXK4q)5Wb2$61}N20u-{1--24Q|IOhchQTdg-sAkrao>D zy}vp?noVG2B-ROWE;S_N)3GuO+C{qPXm()Y(K5L;LM5UXe+FqH=jZ!z=MSLjzYf=I zd92v-u!?yJIrYIQjCB3f%Sx4k+X%rVkW`(_6Nxg;W&vugR1q$lZp(8vbd&_2nQal# z$A+u?eyJjmJ!1yr68lOco%z>_P45n#n@E=pc(K{|Wu&cJLkj#e`≫*Mk~_Bfj!$ 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

Un!sCX$7CVS>4l`@tZ1tWU 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

n8GC~9S4uq_|+8D?kk8^@~Ms(H9rmxtTOUL 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[Wjx1R1d3r?G10aA9rzg>@<_A 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

xXW<6 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 us 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 z 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

o&x%SeFZ ze)&i$31QGeLN@=d3e2G9(c~LFgsC4gqe*%jQaxbU4qU&7d3(B@wE$tvxBF*o=gjdb zd!4_TZ?>!Jy9238-%ai|cQD4E?cVFO){{MUTymotu@FD_CXlH;N*cgt!Y2c;C31el zRWZuD=P%UnsM?s10#xiGb#K4)!I!lg(B4f+&=dw~P~~(g(w)XqO$DoPZgwnyKNBFi zHGu4EmE>M&<9r$S9#S-DqBQybEDE!!wWot3 z;Zg?E5EOJbDIOfK3=?$dF@ARU!8heE`dU`RcNnHZ@sGAc$iLWmKeinrV9Z@~$1=zW z#b@}Vl#%^b(}8arttG*3FxhG0&ZCU8puIOg8y9isD+lHP3b6FMmR2*rEN_28yd+m99=ZZW~HN zK!olQb0s~P!iy&1kSWMbT_;s7Xr4*=wPLpoX&4?f=t}!vc zfyq4R6N!0jqnEcK?ifa$+!}b+X1>k&^NPr9(ynq4qwuO7895*M7nD4fojY3hKC?Iy zTD;sZ>GE;!2mSc%`k(X%>>1Z?wOE$y=7!Gh$-Y%hzgY3U7_s}k4ga4%P_Tgn63d1S z=5pHV!;8}>a%KaTJMkSR?ire)ZlmH|l+5fuxcn{S$Yji~n;9*7^l{PYkxx9ZyPd;U zpRjC<2Vn+K?u~|#%HVxZdWJEs@2#kzUXuAvqc>MgvxPaxlR;Ob9{R2wC8p3;UD(5s zGFv`M(JnL^^1gIC2h76Z@YC<^O12GyKgeNF@IKIHIZwnQGIqe-HZD<-9iH*kJ=yrs zg7VlnO0?GJZdw|2Mv{h%6L!Og*@Vc>h*GyR&PVC=|*Uq_Ym}wto4= z)9m{*9?%|}W|{ueDt!%SpCI&eSYvoc*mT5CCB|xAlMg26ZfM;FL%;{v|APAkm${w( z3(k!LW_zzHp;Pq>&hthLR={?Kq1^5hIBxOwM%Si{GhtlRee8SBY=rFlGuSZ?-f7PF zpR@0av&&#LrIts3$TK0B;mpHl?70+`V3fSO16V~%ZHR7J>y$D5DcGvcIh~&tA175p z$1jiosfi3u59&2eIgXT|jDP}WdQ0(+$RqnS_@=!pF=8z_TycjL8jK!<#h8>`a95=; zUaH4N7CmiICV(4&zc=UbL!NS&N$#W&XxSP#$%Q~R7D<25Gidc;>_bi)lul2_B&1Is zZnR<7A%nX%%u*pJx#peyjSl)QwJ6VFkIuFX6Hf``Ir2> zQpau_o>2fYGHzZxVLoRmBQtUp;Xk&`@=6@fq|0L>O3bz8=VsfZ%Z-QW{`w@oIij5D z0IZ8PB<=bj_ z4nGmQpZbl<@2F7A8kPO~2u_ryoM{>eGyd~HCiA~8#8qGyrz6UkiR- z!4InRQ#jlueWYRnXuYTeBw6kSODXu1?j}5=)NWVVQhs3K1`vns_KUq!{Hsp{g1KWog0ZeJHFz4iC|IU8&%l6 zKJakgF1&5N$D;m3HB7be8itb`#AdntIA|V(ILS38;n%)o6q|9 zdWZV+wA+N zf2+HozeL(vtr|Dn1&sYseZU_$Zl}?DIz|}QuCj9!=?e+CaBuo8Q1xb#E^9~l zD#(Kq#_An>WS!z!ND}@o>zY35zC3}#UuwyYa+nJYD z?mJoFwUGOGES7@Hp9Mw&Lf}JpkYL~(gc@I_88NqA5*Ry>>pB0kexBkvq`EYdsr4Ve zch@;$g*}2EIx0LB(Z^nQw@ws}BW*^I`{i+CC8b|*SpNy&`L>f0d*r!GYi>Nsr39rr z^eX?6#O$O5qq$YWer@04W3u=~>bI`Rl*pHULBRf_WS$Fe_v@W=qzZ%aq~h2sgEDGE zE3DCvW(yKNeQ+H9!`8uF4%Sw&wTE8~{5NQSV*ZoqAG+I7V64ubA=}X38Rd1ak>3{$-k!JfL-cnOQ`M!$MDf!hs;F;{<49?IR1pTyGlUC~;$ z{=h)GyoSVb;mB(PoodaCr4LUCXnO_4b@nl%sWaLl?l$^RpwKTXEtx%}DVcQv+#>z- zsmMb*cd|c>`<@wcm^y&zX44#Fy`r=G^V5)tQ?Boa&X0}vkscYvTTqHD?X2MQi37{K zo@`;!&D#h*(;2UbMKhd!=XA5T32+Vb){5YIcR}4uM)g114byVvJnr{DxB!%`Cwg#+M^LogV73@>hHq)Y)&wQJMlDD?Xu?rAl3oVz z7{z(bS2cE4`BeH-nJ%z@LszSYi$H>qq%bCACP!G_*+$C9jfFXgMpo&VS_v-(&FgL@ z(r@K>V}HO>aF-)wr=)o;mhR~QxNuyfnD$dYD`iX)*&u;`_itbJ%p*6Xgf+?SLzZ}$ zSl8@Arc=qpjS1(}y9nUgLB;@EUA><2M^x79@$(^h%zjVhbVeS+j!EK37=8Bc1luBw&u+Kz6Q6-?AY3E3}`42Z)r)NR$ZLqAkNrauIov^lhQG z?l^OZrA8L0@wB-qufEY@_YxtA*WVTvl6@G&l@;DvKlcPZ$G>PG%5`(;FX$`8%dYrlny6u< z!7`I?9Hy^Y=%-pVJKd<31LxDZs!p@3GB? zDW5`bfcb9T?z6J8qS55#=I7<*hbxjWuYsQkYnPZRum#z6acTX-n?@gPGliUwp`QS^ zn}DaA9GApAR9K#S07>!yCAb$@lemo~< zH!iW*v0taCg%6kyj$PflgzLZ~m-Ix#r6CNaE4hJ?+lj^ZuwP ztdUm`J$oBS&Z-$hDo>+6lcBEtUguuSF57?-aILc^F0Nqr zIAwQVF)7LQMoSa~(DWd63Rig#Vw0N4xv!I(u-O5)G^BxHUH^#h%X}~sdJ5V^xrvfx z3J$VFmEFV(^H8?DPzDDcHqybOxc)*v0rQFUBF|+ToNjSM!Ct$06fusExS!t=@%WSs zDM2MAJRoN9`8YsqSn;QYc}j8GLrEa6^xLU5xeN2UJvpUn`Y899{q{7kVHvPWC-l6T zalk72Y54X4tCpNWGbV8)@7L6K&5YQDJe!NOlxcp#np)Kc$aI+>gqUgBOH)>=9jzb@n z34n=0i1`NY%Olwq5c7YprbdZg3De<#d3D(z+$~4>8>4mxoKx*#Vmy>mJbMb`0(DLV z!emMf^0NiFmNh{js(%*M2;MN`QZY|@q1NVi%9C+}kz6I6e$$5~9i-7?LVk0WlNK^+ zG?pB?qqfh(-x?F|aen{ZD|grbo07|?YmVPaE->T}LgZNx7EH-S`d$E*9{pBwsoO_D zH09hjp{7T$;~hmpT2B$)8>Kun9D7PFo;7lNbswqCTriQ0oQw;TkDutz9r}@bUV>tQ zYw8Z$YhrxoB@AEP$ zG)z9{NxVEhlKXu&(??~w8g9R#U~|4ow}Rft9ZC-r49Ed8#9RvDZmF{kQgu?a^|!cDC4_?7w+^~!wZ)tR+3^J2WUx=SQXibKcVhOMSHn`4VzW%yg;)Yw~c*+-Vw`Q(B2q+ zK55ADqK-_^Ymn6ylj-88?i)uqv{eIeV$&1bZ3jGHl$7~Wx0<(Bd z;+A^iDoda)A`Rd!6kN2WPg)!fD>l>2goqO>dA5?I@^- z!W8Fi@n|SV{(Xc}x+k;xSFgg4T|z13}E zzpyIbzhrTCZ_r~C$f9v*Sae1|Td25fm8~7;tx&cydqU0F4#&tw9enil6lyaQ3 z+9(*ipM2IXF#-#U+JLa(zR*Uu=PM5jwtfaHoca@{-< zr0p}XMp>RjV3^-1pPhHaxG*W?mz2^dG|C;ta;3XR*L_jNb zAz6>tYJepXFy8&Bf=dsYJ5-LAIkOvuy6;Kr%e-8dxNEN~ZnxUG!w9$G0b(=kCu7l@ zF)S!u6|k~1e2f{18OCvt1&YkSxfp>Y3&z^2ae7EXX;TMC(oswDnDwH$vTxNelD4*# zQ+`}s=q`M20)A5W-86jI^=Tg(mVAG%HByRd{JqhsuSFD-V*NYwT4f%f_wM;?C#aMr zlIGTRX%{KUtA%1cdSxooS5cw3==}Q?-#l#cuBR$Lw)ESry4y2Oy!#464i_mJg+1}V zCw|`WK2^jj5TWfy!C$nD|IsrEf@d?M7-d#(Y>ra8>vXPiYxfw_4fD=sEVs;{PrZh+ zrHlKqm+nd4^U8D!%9bes@QaN$_*iN3-ArowIVUYASl-D$e1}Ppa!u*KSw~fvc=#BM z&acWgZirauTh$FB%8IK;$(;1C{W+>6S4!jI0euF@3&lh)Bn@OC*V-3lb$T1F5jfEG z5TP&2wg;j`A6Jvrkp(mC4yd%->4=f$rl}dVl~wTXRy??-+`J9?14;Hr37aZ6Xva8w zxUoCi;8H13fr}+!KUh!jfN-?vQem9run~EayWgtWV_^tMy%#gta@r;nDdxtak!YAA z-7eZ8#<2FN<=N34tbB*xSyGR>Uk0m#s_wQE5ueVkHN+R#F2jT5a>3~Z9yWFp=Mj>c z0vH}+dkIn$TtI2Uq-QLc0B#MnF`MPfsRFq~rSZoe5O6x9H zzy7)I7if9AGRYRNz`myR&c7XeW+sE;QNuY(Fqp$_o9sJ52S>~^x0xzGmvw`>Wy8Xp zdFrQjSU*(3e<2$+tgx%mP1?f5T*zKf{L%33IUE0+m2^yhOb9o%LuP`RV+jzqg^?}o zF*5)v3`*m_R+D#CULgu*WJI*e0~3|FbX~4rI7F|kIlOq~nK_r3tn0_Cjhuk=Z=PcR z-Rb|M_8!c~?F?1}gmT@4{U(#i z@{kqsU0PqK%C2>z3mTOUV_ISrhFW^S&-{o*l*RdQ3 z&Trh5GX+!aZ?+OSkzirg_%l^?_Rnmkid`M*Y4@;;1-X5C^|dQmtnuVTwcbuysG*o{2OHP9E_hd`3WQdX?R6C=A1>!-~0$jz(MxLB}wz zD=a~d_%EPNczh{+c%zm$u3bZ0=ytptRKW7%NkCy`0A?yosYdJRAGzN@w2;Z*@Ixf6 zLeWCH4^n_ZTl#H!r$%st)!uQd8YN;xrK7j-&I>uWHTdc!-0Cz8@vSb?%i9EH~2T7ba7~k!2=yBu;u&HQ2?JbuH#o_y(bPSK=`}4^i zOW}%?*vL?er5%Y7n7{UMV|EU>vw2-sn!TE4{lMqB9&y|_0@y6cdP^+#r#@)fo7tj8 z?4R+TubAW|ad70rNb+c5g$;-j9I^s^H5}Zx3=zo8ghIm-M5i%SiRe4(P|K&u!N!Y^ zj^myq(HM|n?rvTYSKKQVkEYjr=2rgfP3ynlP(vV$+}R}VNH{_Hr`|axyEn}I!>qBg zMHA9SgoGXTND4RHU-or#?+Sv6oZ`p`oVb9%oR3Ma()vtpmw`Xq80fxyqU#JwbI!X7 zEcU&tysf6H6`6Jpy_hdb3pr)!baJ%uQJ!-g0G`~NNt@QLE>uj*SQ&oA*kD7h6jRm- zO5Zyg7d6ZpX52}!YS^uxb<7kM+n@E(cUm-xSGf+#yncxlPn_mqsTfGp^qw(chY%S- zkzrTSE;+eAZj}ikJ*pp1O-z=Mf`WqHb%42KA^b&>K!!@07tl#=G~dg=)ik05zG3>uGaEg%J%E z#u~lb{^FiDJ&I>zAfjo{&8l{{g?iJR+MUniAcSlAiCqsRpu=VAr1kK7&n34i1#e3T zNzvEzYLhy6W*|9l81HBdS%2Xkj}#_xhDMVqND8qaxZT4zr|DbS$bER&>1By?Nz<+mjg8Eg)`H z7x%attnxH*sKVx8l66Q23BzlZtC7CPuozk6{cWGC|} z#cN?(#;f2fM~zuJfn04qCT1GlZH6PuSKRK62ZN#;PNIC6&#OkPpS~JT%iUVzSc9 zKZ4%3HrOv=;Vtu7J*|}IM*J30%CIC7-qksdQrVQ#0?+!cG*;}`*UfP*)*e;Mr`k6f5r?=UJ1VLeq zmDJkuOJBSql}uiA7g?O7bX)pGM|y}OY~5ARU$hX+1vNkv9b54fFPCTN&YTs3Ef|iC zY>w{zmNYH~3tMD3(=8SOIy15R`Kpeym>mwG)R}_&jSEip0IyqezA(2!gF?Og9Y?(3 zqLXa<>fySDVt=(e%02m9bzc&iv`pPn6Lk&{Gv519gryMEM@xhAgU^T)JBE-CFx&q7JA3Vzu-<%%Htp0Z|rX%K?5yHbGZ)> z*tq|1P6Xu3@2n-b;yk(CKWZ*Ih*#$KG16`(5_S%xofgcVJ2oH~lKIS_l)8Imy@V*k0Xax}|CAkehh$CpfeW`*2TX`3k zzpX%R_=~IhC&F4?cCb(SPm zMUg|P1Z2`?hP3lE>y@~gUt2x+(+ks7$3886Wm!~2DYxT16v%38iv6PeO{xjTg^+>yCu-hI= ztS$#+^S;O-X5y~8pV22;d6UzjIiY)R>|8=Yvygz4-KFP2fDIg_B%&b;0NJb6g{Bmo zlM+p7o%Z8hL+w~Wldpv}7xBd1AL9l6*ud8DfN?LgD&|VYN}rZnzF`mi(KE%{P+i#+ zC)9JxWITOl$P`Rde;c?-5jTV$(o23#8?75}rxLQKC?G)t@XIO8cXd*sU)f9Tog_t4 zG1BX;WEGWZnc_6~7F1!^_)5QIHYjHPd{HxPa4gVfH@1kGVQ7K_VZuLMv9g2%pZ&X| z(Rb*=vAt!jVf0xd?KqaK$I?C8jtq9)W+6^&P7vwK$i3xn$To;1Y%5@ zbXO>&1e`PP+3cCBj{`C3xi+Qnq8w^>N*DZId~N!BMVgBETHQaF5-kfwU$ra~>ojiW zV!3RXW+rKVK(?IE3B=GTZn#W4&v=|!Kq@5!bc&hLe!KgPI5y8P{&@M80^G~%(CRU$ zXCj+yn$1~lMZV~6^d35FIy~Rb39MYw;7kh6krWy zRedRd@0L*}OTXWfnHa5jm(ekt!ux8^ZAT#$XrlwP;%BktWCO z#fe5+XC#3YUZh@Gt9$%6+oWLp=Y(m4^#{&9La$nUZR>&d@BH^JU~K5-BA}qi3YT1^ zl7%*=nR;VH^18oCa0<_b=Z~zkXy$kcq zuWvzHIhVIy;RcS$5%jkk%M!rNMo{EoRMF&SPAIy&Nmy{W#2NglS8*ssx@%etCiOAZlYUb0u{No~Hmk7`gPreOW|S_)w5{BIJq7`3l*}?x1SMh> zE{nUz6+TEkw^>tZ0n9MXwB)0&n2G`{m~+W!>AcmV22Y&G<6-Vt3q-~@vve!;z#@##c` zv6*Nd(qLQ2;vDhVb^u#;G2+y1%5=8c3q(^uuBVypvfchpq_ieG31zUPR?Lh6d&|$e z1JMfRM^oVxZID<@0-~SK*~tL8dNbo!v*?CCIIAM^fIGXbMzd-zgj(M#x339nzCU`g zZjA*nQq^$yb}nxeNq&pXCb3#Pk`4c8#*9u!+$IS^@;+6V#es+9b zw#||j`UqyuRg5Zk^l1(7eL*%ez3>|%{RQdKFDZ$7P7>!ID4q(u#N=}sPCNfplJ(i> zQfgxC)lQA4{kvZ(5`1bg@&(FXX$+r}>PD>vrR~!)6E%TSQ(W$YAF%v^Rs|7o3DO!x#Qim8gsewrUe)$? zj^T~UU0wQ>pSJm&(>gpoJO12{|7XCnc)kHCh+@=zsKp@>Ky>g;IaGL!gCM5E07FJH z^t9h5n%P29?`>xQj*J>YN7Y)k90!-OpCLQT*skX*mbv^1v%9op)>tO8hRk%X^=PFFD22J;X#>xWl-oHdr*9N^X9FUbpg27lj6a_2+ z&sD!P?J+K>5R&%+h% z2v?STFp(}AA2&=!3cim%NDqkoq#(T@YQnF&klYTCDD$JYF(b25>igFnQNzmA0`8J0Bz^H> z01vD16n9g8L%BkeK{Vr}hF5W&6&pvi=dj>1r%#GQ-6H*9s%dnQL-WLT|4Ee03$zef zW+`$^oKWT*F@K&&lMm(v;7s+tVk9-;B=1*Kxn9r>%^po1X>;c%@;0T+6zr5?E}wFv zV?`G6RBVlMqvws1)anJ(?2Yy^89}wmM5`1hPbaCtvq-oOpDgic7ei9QzJ@?Qqa)#C zeU-MTX&2{Y72I9WN+?f`iw>If z`W!?C6nTany;jlar=P(VxK#L*U*&|uO5P&%63CH+;nPMNO}+XcxWSsFFQcwL{!x~Y zEUMnlju@{(fbB@TwCz>Kq(H&={)C3F5GFnA^b^~9j0TPOd-DvT?b^Ugid(W#FJdD> zXEaQtQ=HTA$+Do#eQ(_>u9cBO=UAS$_8$TJiHcBTV6pOeJ7)E&;9k~Ec5a%UY4f(t z@{o%GlL7K#aKFpvCbR1K3hi5t`~y+qg1y|r2e!%m$0@?jh^pIdu z4M@o|1QB)0V%X*vDp@96aG%kbnqAyYAs z4dOJXGaf+ibo?5i?FL(0vz4c9~1^g~3 zC~qY(C6V3Wf3A@DEp~Wsrnc!ki?2TXj?JhWV{IX$o1iO$=k&lO1=OXfqjF6|`KEZ;7w7|i7=#Ne0 zf71gZ;8l?u55p=1*|AgY`1vxt&j|+!b&IL>wf~9`RkQKBw_{6%d%1S$0$Wa_%=`o+kW={hhcf}-595@!Mbdace@x$jpdoaj`vF`XDyJ>3|CHd9D zGjCZ>eSVGO4r`#(J6{`EMj<-s5IygZj+TjBq+CP$)CC=Z*({Z6;(S(d&yWfv4U{a& z;7{TdZY#i*+0Jv(V_t_qF11E6@@}5LQO+xjOPydsrVZDMCeiv>v?FYmo~?ch+kn@k zU5UVK#eEcDH`S4G=ZA)aPxpx)@pbvZo>Vu*r8oV#{#w7_R-_+b(j{}l{u#gE;>GD< z?y5UBjWDo^$6v?hU&Oq)Ed2%77IDw>FHXC6%eY5nE%&f5aREFa3O~~P1?P)>WBv=y zT;SOKLHrbE2fLG*w|eh5c?p_$J`#IB6}%rm!-26-{P3OXeDo8Q*W^;-sovFdPt=dG zR(6!D74}x|Y>S#0b_LE*vTYrQ3xphm*!77Eg?`2jShad+tfkW~pB!X;M$U6A@~FbG zRyspqUQb1>8f)h$^Z>t8l2s{5;#L=Z`7I}!*x-v4X2k$OQl5{G1Ye=37;tRYW;560 zeO^JyL0_Im8Gfx=p-8z4@I3e!dnG0I>{!i*QUAoivFNm3q1rz5;QjMiL6J$zVF5%l*UL~C>c^bEu$Vrx z?H`D@xO-30D8@qA%xWi-{0*Z2?&h%V&G_ToI$L&n*veZyo4w&paS9LQ8auHfm>s`= zzU_~jytt87lDDYP>9 z6#tVnCaIE86J{i{5$_f(I|NWQLhbN?G=p3$75ac&_rD*Y$~?5g%vk&G$D_9xtXv_gfuk zuP5X!jb}%fcGFP8$EGOV3uO_DlqQOzRLVg?szB}L5tk9dEm}<{wHxlcrPIQGzkO zG6JaPElvi}`;k)UsiqMs{6Byv2Ltj*n&is$Lt~kw+}-t@%1s+{_1Hr4*QyjY$uapo zxjoNln)3bj)%%}BSo*{*P=vG< z^b?sAw2B5_VwCs#9-(9)$k7!u|4Q6mix8{=mRnH&lT<-RQ+q&KzG$f~oOvoO8X1uO z-4<#nlvhe9K<*xD>#NJ8zGy*EEmoYE!5Q>cGo!N-+bv~Ta?IExSo3no^JBl)u6E~z zJL7T9fxixsl1#5D<2;haA*pXJ?YvF4Q@zdega!Hq25HNB)p{d8Hh-l|SEI`qhY!av zNSb_*W}zSF^VlKKN||R1pBN=^-xCA(PHmx%gVG=%g91X! zV*cyaSGY=KrgmkSaa_}dTa+RHEUcgs2O4{G#x83gT*+7YSFSZ3w~Bj}jr{DW!eE&8 zG@Q{z!(DKM0puNG7$BqYk!Z#GOiC%})Ff}hxqAsf(obAv4%K=xKy481_LPK$a3OpJ zHUmfcWXD$A@56P=@TZuq6`JKb5#ZTS0q~;r+aaj#Q5K$ldYyiOG8{gqXI4;Zx2Tp0 zjxugHKoUp4tkj0oUsInbdB$F@$i6an$46xAxR*vO9~neg0jb0V6kRnfKzHcmr74!uU2JExL%Nbba3MS{UThw{?I ztfBK2lz3^W?`-Nu-+Ab6sl0oxyvz@_NS&~fCTN~0k_NbKf|=>UWYCQ1sDOLN!V6>2 zPZ_QXKkEe=IzI%`lUhaQgg@hwyD;s@iedN>pYLhCj#0wl(f=G%#eP8ZWi4DNSTfb$!hX+tQi7Ma#llI&XRYPU@%K6FZjWEt~xO?3r+~ zZjh|fPgZ?V)m(C(hZyT>cF^DQ6vXca%aGH%8K&m-wfg*k>1H>dJP}k^JFC@^2Mk8QpGJ|BeM-4W!FgVO+PWV~)QO1=ruY;L4 z3$*O&t4m?=1x<55*H7AVSe^)$yiGSE5`yV0UA+bu-O-=d$#GU-Pqd5F*;>9)sAL0s ze)Q~RydA3$o&cdWELLhdr`t5nA1`imP!jiNbvr`!kA!p^`@NJKSB!pu&+6AF^w~v; zQbGCM_;G0DSZI0g?P|IKwz6z&()yrM6-`J+@&Z=Ec{^!z7PA(vT%J0E$9fzynP!8^ zM>lT}OSAHAu1lurBa9LiH+bd6c2iZ^QsXV5hmp=ZZ<=yJk(sne(>PiQyUMS)$u2aJ z)z8`~^4i4;_%YE{{H)URc0X!loJaeKvN5h}o*!l?SWR#3u2(4_Q7*akUgRmYJphW7 zQ$;P@tp>>FC(Yw5=IiL9MG~!mxY5F!akOS}!W)dtd66ITA|VP4!Q=egy+8oB6o6a3 z`w2KMjvyBXz}I;EQ|m?ur-vOvUugdj;#fvgBRznA*fOFmP%0ThE%s0@U{JiUGigw) z<5xRAr1IW2_L}3JVWVu;G|XgU&^s_LaNRN6rVU04UG>yupYf+i^B7D{?^(923#CqC zd^%~V6uoYkc*kjM!C^>u~!*2NmG$;yMWBk59JwTJ$J3& z8=LGFz!Z!JVNwVHg2EZdaf{Jm-|~%O9yl9V6q*JW+8sbli{W41r>_bxB=zFYh|6jJ zzW$qU0)MaRpD*?{P8z4{h%q)zss5d-7FO5D=6q9i#-LSZIQPl+XjAOBa+9nv?(< znxeEIAcP_vlF&Pb-b6$ML`XuBUKB~_Xz0az^!Jwg-aB_@)~tE|(*s#R;s**YZy#!Ze|TC=Ru8bd9AA}HCn~u~2bz%J1w9(5R8jN!XNd{#qL&$NolfpK zba{<9@WZ(N`#`PXOg|4D5-D}L5d&+AUU*Iz8$^xqnn{+8&8b9oKE z_?LpY_&+I_p&pL;dEY}5PwhPI<-5ZB0pW}?D!(ry8n@*Sl(zGc%N+icwl7A*%0740 z94a`aCclF@wjiV! zw(;#>TIdXCBs9i0Gc;sdns#Dx`Rq{d=i^VFBTJ=2u)w%*x5F6S8-FZ`e;FUGf3ZRL zOaH{brM~(T038=%v>J4kRWFU{O-|iCaR;7dMpsVwBa-!1Ltd{2yHB4Z0d4gk3%+Z0 zeAZ{j(*N>AOqa~NR;NaDzu%6-r`m{y$$RBKDgX!?V4(K4{MB5(@+ax-8vABl$jRMY zpJ$(%-|4>tetIUue`lEh%)W_itD6pbOw&d6M!9P{OfMsIc$HfFrR^ni|8cYBR|@Sp zW+jGi>vtaS)IZ4)TrP&&o8zj7p9k?t67xC$1SUKOum^YJhvd^=-aSnn3l>>xJ5&ZS z6uji&n*cFXEF6=UO!L;_@hVpxA^bOn1x@c<_=%M?Vgq1;^O*#|Mfg~*@*Lh zazX!|0(Vj*NG*Zqcpmxn!#B4#fgKt=X*}HdQ+GWW>{E)BZIo?VEtIv5+uuzjFnz&8 zN6WO9sh`Ey3)E_2$$Jv*6bNSIIy!!6wwKfW7uY#VOIE~k9Mqt7u7bZg7jt3qfoh`25(F7AHN)V?pfoP5jNu}Wm zkPzcyVQ$GCyxSyik_I;mE(MNoNG*U%DXeImql+y=Xf7I3&m*xYpO*SX2uRT5;A*?n z6qv|^*2%hx?3MFMbIXA0#H@qQkBcY(=y`r@nby~bbw+(|EfC%}B^V!}(tLo?$zv75 zqTNTY=oxY=Th-t3haIx2YHR3~l%nIIJv{V=C=REr*lv0Y88i}wAY6#_%OhbpCL8FBpv{y4eX}VeP`&XHmdY1aF+- z%2RDt9#&aV6uJUksZ+8L`^Hn{Y|C-OXSVw?yj!Rz0})CF7MGFs#8R8g&sSc_mYYsn{ccLRf~yuP`mdgd?`;YF_ciQ2P! z_W3PFfqq#17)*Cdzp5gsx{`?P!fI#~kZK6S8l3K#nK%_+dP9!IvNAETrj(oSN0Z$H za{(CF7fpbIAw@7>W7FQVhEY)!-Vws|(0f_NJ@g~8w$L6r|IA#6SCi`_a<+OzG%grB0%y)Sw--%q=zI0a z!LtH}JX*c{)*G$|Ac_2OU?kqDp2l^;3#u)3$KSaxOPt^FWmP4Yo{t`YR-Kz@%z#nOX1{^FguiG@x9Z-B6WVT z9XA=<9;kav9=f($Y_Usx)KPT54;B=et03pMJ?6_o_BH)MJKQ1EV|&(zl4+KrcLxF0 z%pp*mYPVBt{S^+KkR7i|MdiVq;iC!Sl>;_D?Iy0R)zk;ip7E<7#-JCBHU!xCe1(*C z@`2pTN&3M=@QwfC2JSkZT8~+4e88^`0de?FxF_{dLoF(NsTJOTSh{|)`7vZ5f9)sL zS5_9`foN$K8+9hP59{ml+W2oJYFj!Dmr1-%)mh@7U-+|D@khPI3Co z)0npC8%FcrT@`x$GKb4Mas`=RxT~{YpG6c<6gYQd` zQH9;*M+qE7dJ&^;D3(tGaVQq(S(?}`>BQo#Tn-EY?n-}CbyBcdetXt5scZPAdWqQb z6{G(0NeeTpZPnt=mk@_jJGY?UR5E*_s{=nmazy)jcbvAASGIzoC(es1mu15b0t)7i ziPL%2qA2Wv!fA#5nKs@LRjVh7|K;EIeJ86Js+O}qtG-arIA(usf!XpmRk}40c`~Tn zclh(Eq7f=_rDy(n*Sf||dhGGwX+N``jLXTE_Ey;2=}fS%16!=h&6&t0ip zBnJ*btC_d{Rc5@Dd*eqpMSJ=ZaF!o-0iVYzkjL_>s%boj*xAuyG01nC_H3P$IJ?ew z^mvjz%uY34~o>Xo!d9ED=4`R;Yn+KuDKEcyZGLQeJgI>!`Pp(zle}LNA{g4^w_fv5=kU~Y?D5C9h;sK z*FXL!>xnIATe_jRt*ex=9m~ExPhLk4ybU^xLo+q94g&uj32}=oC{t z$q9Lp#wXb?0daX$yo)va`F*bs(zGG`ncbmC*v<;+~2 zJWC2EC4OnPg3~;+G)qk%v~&9cq>wPTASv)fMT%X?8EKr+)M<38+(tA5L!U8 z`x{b*eyumy9hz=%2iI7J=B~9%U$-ywmISq4+Z(J4adFAqzu{s3s6?7ha_!MTI>R>v zss6RKaF613iB^f32c&bkJ4uh&o?1L{I{H3O?uhY^6u(~(C>>j9Y&){1CoddwoFk;? zpRv6T#@h*Dr!dB%RpJ-*i7no&F6Q$&y@$L58B*|Of9&T7&(a!=TV@l!8n}!Kevn7yvNAB%`m7R*eD zh&4=31Dtq{a)d0v?H40C zNuYb7xo!$~H9frUfuz*A^(=)s$a|yfucFi9%*dA9Gr~B#F)r;nmzvGkTQ2vc|M9nh zV{|LWg5P@)gQl$o;D&Ff`QZ7a(`Wd6q^e$~tav|%o$_5TggeWmk8yXZGrd@86DBPE zQxopX8-gJ8P{wDn!0SL92+#*h@!R_ z5T2XItNf~&Sf>t~5FdPuTiqb#d7}QoGXI!KfyY!=vVkc?g+l;4Wzp03fU-y1f z0TTI2_^G|>u4oOwPV54?O*X2h+p$LyK#UXLi8&BT!&kd`3T%i*fG)tc{mu8SyQ(Ve z_SBh@o?8i9e&eqc$x+Nql0D05B{K3H;!Hp`n3%F2F%gRh)X# z<4=B>wF`-`L*pN{N+vHEF$K7_tD<4Gm3+GSKUFM;0T2o1=HyL!7~4%zu_RZ0 z2bT~{fZq>kKPR0E4@3EYO303S{zw)y($At9e8;dGIO1usJqsCBcbqyL1#Q`HnDENI zY@LH2U^u#_SJ*8z=r;DTa%plchR$)>QH6*GJ2rCUU?B1!9o;6l$K~0@i`jg;H z^SXdF{%u8n^ujPES|{I-hcj1{LHluXAqrU*_5mh;Ca|pbx>?~0#YhKSsKLr`+b|Q! zvTC=)-~3^`o-R4QoSS$*Zy2$~_~1V`qNlFEshov>Q#oG3sBTx_I}b49XAX^C@U@n9 zE;;NU-dUjhrrOYxK8OkLE>!t&k~nu{)^W*U`(tb8^7#E#)WU_$hSa(jr@1j?Quyp4 z1FrL%3E$hekIH}Ia?YGBST%g)SO2gAR=0S=AT=N1aLe`~$F&#Qn;iKuzES)%i|oV4 zOi>)CKy+Y)5IRcrr5!E3?({+&7WaraLQMOG(KIFC9&I4N7gw<_Pg%xK=*^MLAW%GapagU1ci0BjbJNmAokd}n!gt1A9aKjGi$0(^kOWj&^5IWA+c@gw z7o;)a!IPtSEBTZonT)y(2&na8#5!S}GfTEF&v)*%Ud}DE8=qAam0D&*=KQUHXwbGv z4cK0D4o?p+?Ol1hwY(!vb{JQEesYsH?wo`VxR|1qf+n=E7e0v4@1sO(_i!_PoW6~* zHcaGAEQY?D%Ob-iKOYk@EtU{ci-TAJQGwaLo!&l`LHxdnaRch@H}!>hX$zrn*;%%Z z9~;egxr*(rjWG?u7PtUy5zsmlEVS1#abqmOie~Z(Zd@A+R>22pxGoJKe^a%_H_YdV z+m=J>@P3n(bsMp&E72>re^asK{nKdG)R13vYQx7iy zY9J49GC7p3MPAp8N0{1J8?2^L3^)gi2w^$HKw}S13I#Pbl|{o6dNp)e<_iOxhfVH) zidPjC$_UrZ#1*ULfgpeqBlO?Bo@()&Z>DE+?!^`x>dSXcWWN9Gh%9{ z0w0-?eeVh-SPZPwJo`;0tokjNrr_khA}1&%RdgkM7~kdY9|_-lkC0mnM8JJZWpYp{ znU4WWWK@}*q#BBJ$ky3OFkQ?zG^%u%m)!)8E)bA`zI^OVz&XsYgpZ%lB*qd{ukr1K z>oFISQXbh^!i7`@(}tKe&+<(!ebB$@<0x78;R0id;7Df*He6B3>!WC6l?A8TiU!4T zO&e_$6NA&lNzCUOrKn-REK=0!FJGS*NxGPJ=Z<+4PYsw$6*;f;Y{-DN@8^Tt@2%gQ z8SKpyeMiZc_-|th{-5Nx`l+Lwfm6v408V`m^eg

QH1n-gt3(S5#Xo?3BVsDSG~! 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.MAID^%{d^8o9=)c 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 HJM#Yk9F<#J literal 0 HcmV?d00001 diff --git a/fern/docs.yml b/fern/docs.yml index 1345aef..5b07412 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -60,6 +60,14 @@ navigation: summary: ./apis/v1/summary.mdx slug: apiv1 layout: + - page: Agents Overview + path: ./pages/api/agents.mdx + icon: robot + - custom agents + - agent files + - agent threads + - agent thread files + - agent runtime - page: Projects Overview path: ./pages/api/projects.mdx icon: diagram-project @@ -82,7 +90,6 @@ navigation: - tasks - task statuses - task lists - - task views - project tasks - private tasks - assigned tasks diff --git a/fern/fern.config.json b/fern/fern.config.json index 69390ff..a18b534 100644 --- a/fern/fern.config.json +++ b/fern/fern.config.json @@ -1,4 +1,4 @@ { "organization": "awork", - "version": "5.5.1" + "version": "5.117.0" } diff --git a/fern/pages/api/agents.mdx b/fern/pages/api/agents.mdx new file mode 100644 index 0000000..b8ff275 --- /dev/null +++ b/fern/pages/api/agents.mdx @@ -0,0 +1,250 @@ +--- +title: Agents +description: Agents API Reference. +slug: agents-overview +--- + +Agents are AI teammates in awork. They can answer questions, prepare reports, and work on tasks and projects using the context of your workspace. Every user has a personal agent (the awork Agent), and workspaces can create custom agents with their own prompt, model configuration, capabilities, and connectors. + + + The Agents home in awork + + +## Core Concepts + +- **Agents** are reusable configurations: a name, a system prompt, a model (or workspace preset), and a set of capabilities such as awork access, web search, or image generation. Changes to the system prompt are versioned and can be restored. +- **Threads** are conversations with the awork Agent (`personal-agent`) or a custom agent (`custom-agent`). A thread can optionally be linked to a project, task, client, or document to give the agent context. +- **Messages** are submitted into a thread as text, attachments, or both. A thread processes one message at a time — if the agent is still working, new messages are queued and processed in order. +- **Connectors** link agents to external tools and data sources, and can be shared across the workspace. + + +Authentication works the same as for the rest of the awork API — see [Authentication](/authentication). All examples below use a Bearer token. + +Note that API keys authenticate as an API user rather than a person, and can therefore only interact with custom agents. The personal awork Agent (`personal-agent`) is tied to a real user, so `personal-agent` conversations require authenticating as that user via the [OAuth flow](/authentication). + + +## How to work with Agents + +### Creating an agent + +To create a custom agent, provide a `name` and a model selection: either a workspace model preset (`presetKey`) or both `modelProvider` and `modelName` — but not both options at once. Typically you also set a `systemPrompt` that defines the agent's job: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Client Status Reporter", + "description": "Prepares client-ready project status reports.", + "systemPrompt": "Prepare concise client-ready project updates from awork data.", + "presetKey": "balanced", + "aworkAccessEnabled": true, + "webSearchEnabled": true + }' +``` + +The response contains the new agent, including its `id`, which you need to start threads for it: + +```json title="Response" +{ + "id": "23e68187-91d6-4f7e-8d31-e3f2c60d7427", + "type": "custom", + "name": "Client Status Reporter", + "description": "Prepares client-ready project status reports.", + "systemPrompt": "Prepare concise client-ready project updates from awork data.", + "presetKey": "balanced", + "createdOn": "2026-08-29T08:00:00Z", + "createdBy": "9ad63972-4396-4b0b-9e7d-40b852cdebf8" +} +``` + +To see the available models before creating an agent, use `GET /agents/models`. + +### Getting default agent options + +Use `GET /agents/defaults` to retrieve the effective model, tool-access, connector, and skill options for a conversation. The `type` query parameter is required. In the awork UI, `personal-agent` is the **awork Agent** — the built-in personal agent available to the requesting user — while `custom-agent` refers to a custom agent configuration. + +For the awork Agent, pass `personal-agent` and omit `agentId`: + +```sh title="Personal agent (awork Agent)" +curl 'https://api.awork.com/api/v1/agents/defaults?type=personal-agent' \ + -H 'Authorization: Bearer {token}' +``` + +For a custom agent, pass both `custom-agent` and that agent's id: + +```sh title="Custom agent" +curl 'https://api.awork.com/api/v1/agents/defaults?type=custom-agent&agentId=23e68187-91d6-4f7e-8d31-e3f2c60d7427' \ + -H 'Authorization: Bearer {token}' +``` + +`agentId` is required only when `type=custom-agent`; it is not used for `personal-agent`. If `type` is omitted or has any other value, the endpoint returns `400 Bad Request` with a validation error on `type`. Generated clients also expose `type` as a required, non-null argument. + +### Copying an agent + +To duplicate an existing agent, use the dedicated copy endpoint. The source agent supplies the configuration and system prompt; you provide the new name and an optional description: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/23e68187-91d6-4f7e-8d31-e3f2c60d7427/copy' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Client Status Reporter (Marketing)", + "description": "Status reports tailored to marketing projects." + }' +``` + +The response is the new agent with its own `id`. You need read access to the source agent. + +### Updating an agent and prompt history + +Update an agent's configuration with `PUT /agents/{agentId}`. System prompt changes are recorded as versions: + +- `GET /agents/{agentId}/systempromptversions` lists the saved prompt versions. +- `POST /agents/{agentId}/systempromptversions/{systemPromptVersionId}/restore` restores a previous version. + +Agents can be archived and unarchived with `POST /agents/{agentId}/setarchived`. + +### Starting a thread for an agent + +A thread is a conversation with one agent. The `type` field is required: use `custom-agent` together with an `agentId`, or `personal-agent` for the awork Agent (no `agentId` needed). Supply `content` (or attachments) to submit the first message right away — custom agent threads require a first message, while awork Agent threads can be created without one: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/threads' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "type": "custom-agent", + "agentId": "23e68187-91d6-4f7e-8d31-e3f2c60d7427", + "title": "Weekly client status report", + "projectId": "c907b29e-f640-4639-910d-722623fd5b4a", + "content": "Summarize this project'\''s progress, risks, and next steps." + }' +``` + +The optional `projectId`, `taskId`, `clientId`, and `documentId` fields link the thread to an awork entity. The agent uses the linked entity as context for the whole conversation — for example, with a `projectId` set and awork access enabled, the agent can read the project's tasks and statuses to answer the question above; with a `documentId` set, it can read that doc's content. + + +Linking a thread to a project or task also changes who can see it. Threads without a project or task context are private to their creator. A project- or task-linked thread is visible to other users who can read that project or task **and** have the AI thread access permission (granted globally or through their project role) — for them it shows up in the project's agent threads, and they can read and contribute to the conversation. Deleting a thread remains possible only for its creator. + + +```json title="Response" +{ + "id": "6cbb219e-839d-4d23-b273-3a78bbd842ae", + "threadRunId": "8f934a03-8f8b-44ea-9137-3ca563bb75e8", + "acceptedMessageId": "66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a", + "type": "custom-agent", + "title": "Weekly client status report", + "status": "accepted", + "agentId": "23e68187-91d6-4f7e-8d31-e3f2c60d7427", + "projectId": "c907b29e-f640-4639-910d-722623fd5b4a", + "createdOn": "2026-08-29T08:00:00Z" +} +``` + +Keep the `acceptedMessageId` — you use it to check the message's processing status. + +### Sending messages to a thread + +Submit follow-up messages to an existing thread with text, attachments, or both. You can also override the model, reasoning level, tool access, connectors, and skills per message: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/threads/6cbb219e-839d-4d23-b273-3a78bbd842ae/messages' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "content": "Add the latest budget and launch-date risks to the report." + }' +``` + +A thread processes one message at a time. The response confirms acceptance — it does not contain the agent's reply — and tells you whether the message started immediately or was queued: + +```json title="Response" +{ + "threadId": "6cbb219e-839d-4d23-b273-3a78bbd842ae", + "threadRunId": "8f934a03-8f8b-44ea-9137-3ca563bb75e8", + "acceptedMessageId": "66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a", + "isQueued": false, + "status": "accepted" +} +``` + +### Adding context to a message + +There are two ways to give a specific message additional context: + +**Referencing awork entities inline.** Mention a doc, task, or project anywhere in the message `content` using entity-mention markup — the same format the awork editor produces. The agent resolves the reference with its awork tools and reads the entity's content: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/threads/6cbb219e-839d-4d23-b273-3a78bbd842ae/messages' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "content": "

Use the notes in for the report.

" + }' +``` + +Supported `data-type` values include `document`, `task`, and `project`; `data-id` is the entity's id. The agent needs awork access enabled to resolve the reference. + +**Attaching files.** The `attachments` array accepts up to 20 files per message. Reference either an existing awork file the caller can read (`aworkFileId`) or a freshly uploaded temporary file (`temporaryFileId`, see [Files & Images](/files)) — exactly one of the two per attachment: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/threads/6cbb219e-839d-4d23-b273-3a78bbd842ae/messages' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "content": "Summarize the attached briefing.", + "attachments": [ + { "aworkFileId": "7a5c994a-320a-4850-a7a8-dad86809d3ef" } + ] + }' +``` + +Both patterns also work for the first message when creating a thread. To pin an entity as context for the whole conversation instead of a single message, use the thread-level `projectId`, `taskId`, `clientId`, or `documentId` fields when [starting the thread](#starting-a-thread-for-an-agent). + +### Checking the processing status + +Poll the status of a submitted message using the server-assigned `acceptedMessageId`. The id stays the same while the message is queued and when it starts executing: + +```sh title="Request" +curl 'https://api.awork.com/api/v1/agents/threads/6cbb219e-839d-4d23-b273-3a78bbd842ae/messages/66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a/status' \ + -H 'Authorization: Bearer {token}' +``` + +```json title="Response" +{ + "messageId": "66fcbdc5-2ae6-43bd-b3ab-f18ccd24909a", + "status": "completed", + "hasAgentResponse": true, + "responseId": "msg_01K4CLIENTSTATUS" +} +``` + +Once completed, fetch the full conversation — including the agent's replies — with `GET /agents/threads/{threadId}/messages`. + +### Cancelling a run + +If an agent is taking too long or is working on the wrong thing, cancel the active run. A successful cancellation also pauses dispatch of the next queued message, and the response returns the thread: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/threads/6cbb219e-839d-4d23-b273-3a78bbd842ae/cancel' \ + -H 'Authorization: Bearer {token}' +``` + +## Files + +Agents and threads can both work with files: + +- **Agent files** are knowledge attached to an agent's configuration: upload via `POST /agents/{agentId}/files/byuploadid` (see [Files & Images](/files) for the upload flow), list with `GET /agents/{agentId}/files`, and delete with `DELETE /agents/{agentId}/files/{fileId}`. +- **Thread files** are files produced in or attached to a conversation: retrieve them with `GET /agents/threads/{threadId}/files/{fileId}` and download their content via the `/download` sub-route. + +## Connectors + +Connectors give agents access to external tools and data. List the connectors available in your workspace with `GET /agents/connectors` and the predefined presets with `GET /agents/connectors/presets`, then link one to an agent: + +```sh title="Request" +curl -X POST 'https://api.awork.com/api/v1/agents/23e68187-91d6-4f7e-8d31-e3f2c60d7427/connectors/6a1cf273-34a5-4dcd-90d6-6ba7728d488e' \ + -H 'Authorization: Bearer {token}' +``` + +Unlink a connector with the corresponding `DELETE` request. Custom connectors can be made workspace-visible or private via `PUT /agents/connectors/{connectorId}/sharing`.