diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index dcfdcc4..3791401 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -97,6 +97,10 @@ "name": "Rate Limits", "description": "Rate Limits" }, + { + "name": "Roles", + "description": "Roles" + }, { "name": "Schedule Template", "description": "Schedule Template" @@ -2627,6 +2631,188 @@ }, "operationId": "GetGroup" }, + "put": { + "tags": [ + "Group" + ], + "summary": "Update Group", + "description": "Updates a group by . We recommend reading this page too [Updating data with PUT](../docs/Updating-data-with-PUT.html).", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/group-update-request" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content\n", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\n* “maxSize”: Character number or List size exceeds the maximum allowed value for the “name” field on the error response.\n* “minSize”: Character number or List size insufficient for the “name” field on the error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "401": { + "description": "The user could not be identified.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to read the Group.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "404": { + "description": "Error codes:\n* \"notFound\": the Group could not be found by identifier.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "409": { + "description": "Error codes:\n* \"conflict\": the request is conflicting with existing data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "operationId": "UpdateGroup" + }, + "delete": { + "tags": [ + "Group" + ], + "summary": "Delete Group", + "description": "Deletes a group by identifier.", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + } + ], + "responses": { + "204": { + "description": "No Content\n", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* “invalid”: Invalid input in the parameter mentioned in the “name” field on the error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "401": { + "description": "The user could not be identified.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to delete the Group.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "operationId": "DeleteGroup" + }, "parameters": [ { "$ref": "#/components/parameters/groupId" @@ -2729,6 +2915,127 @@ } }, "operationId": "ListGroups" + }, + "post": { + "tags": [ + "Group" + ], + "summary": "Create Group", + "description": "Creates a group. Group roles will take effect based on the location, where the group is being created. Read more at [How to use location and folders](../docs/How-to-use-location-and-folders.html).", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/group-create-request" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/group" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* “invalid”: Invalid input in the parameter mentioned in the “name” field on the error response.\n* “maxSize”: Character number or List size exceeds the maximum allowed value for the “name” field on the error response.\n* “minSize”: Character number or List size insufficient for the “name” field on the error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "401": { + "description": "The user could not be identified.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed create a group.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "404": { + "description": "Error codes:\n* \"notFound\": the Location/Roles could not be found by identifier.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "409": { + "description": "Error codes:\n* \"conflict\": the request is conflicting with existing data.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "operationId": "CreateGroup" } }, "/languages": { @@ -10817,6 +11124,56 @@ "operationId": "ListRateLimits" } }, + "/roles": { + "get": { + "tags": [ + "Roles" + ], + "summary": "List Roles", + "description": "Retrieves a list of all roles available for the account.", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/list-roles-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "401": { + "description": "The user could not be identified.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "operationId": "ListRoles" + } + }, "/schedule-templates": { "get": { "summary": "List Schedule Templates", @@ -20041,7 +20398,9 @@ "description": "The resource type to which this Custom Field can be applied.", "enum": [ "project", - "customer" + "customer", + "vendor", + "vendorOrderTemplate" ] }, "isReadOnly": { @@ -20734,6 +21093,19 @@ "$ref": "#/components/schemas/user" } }, + "roles": { + "type": "array", + "description": "**Note**: The identifier of `Administrator` role will not be exposed publicly and a `********` placeholder will be returned on this endpoint for the role.", + "items": { + "$ref": "#/components/schemas/role" + } + }, + "additionalRoles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/group-additional-roles" + } + }, "groupType": { "type": "string", "enum": [ @@ -20746,6 +21118,51 @@ } } }, + "group-additional-roles": { + "title": "Group Additional Roles", + "type": "object", + "description": "Roles granted to the group in addition to the group location.", + "required": [ + "location", + "roles" + ], + "properties": { + "location": { + "$ref": "#/components/schemas/folder-v2" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/role" + } + } + } + }, + "group-additional-roles-request": { + "title": "Group Additional Roles Request", + "type": "object", + "description": "Roles granted to the group in addition to the group location.", + "required": [ + "location", + "roles" + ], + "properties": { + "location": { + "type": "string", + "description": "Additional roles granted to this location identifier." + }, + "roles": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "uniqueItems": true, + "description": "The identifiers of the roles granted to the specified location.", + "items": { + "type": "string" + } + } + } + }, "group-request": { "title": "Group Request", "type": "object", @@ -20778,6 +21195,71 @@ "id" ] }, + "group-create-request": { + "title": "Group Create Request", + "type": "object", + "description": "Group of users.", + "required": [ + "name", + "location", + "roles" + ], + "allOf": [ + { + "$ref": "#/components/schemas/group-update-request" + }, + { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The folder identifier where the group will be created." + } + } + } + ] + }, + "group-update-request": { + "title": "Group Update Request", + "type": "object", + "description": "Group of users.", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "description": "The group name." + }, + "description": { + "type": "string", + "minLength": 1, + "maxLength": 200, + "description": "The group description." + }, + "roles": { + "description": "The identifiers of the roles associated with the group.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "additionalRoles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/group-additional-roles-request" + } + }, + "users": { + "type": "array", + "description": "The identifiers of the users who will be part of the group.", + "items": { + "type": "string" + } + } + } + }, "jwk": { "title": "JWK", "type": "object", @@ -21609,6 +22091,26 @@ ], "description": "A response for the List Rate Limits endpoint." }, + "list-roles-response": { + "title": "List Roles Response", + "type": "object", + "properties": { + "itemCount": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/role" + } + } + }, + "required": [ + "itemCount", + "items" + ], + "description": "A response for the List Roles endpoint." + }, "list-perfect-match-candidates-response": { "title": "List PerfectMatch Candidates Response", "type": "object", @@ -25868,6 +26370,25 @@ "projects" ] }, + "role": { + "title": "Role", + "type": "object", + "description": "Role in the account.", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The identifier of the role." + }, + "name": { + "type": "string", + "description": "Name of the role." + } + } + }, "schedule-template": { "title": "Schedule Template", "type": "object", diff --git a/articles/LCPublicAPI/api/Webhooks.v1.json b/articles/LCPublicAPI/api/Webhooks.v1.json index 533366e..4710180 100644 --- a/articles/LCPublicAPI/api/Webhooks.v1.json +++ b/articles/LCPublicAPI/api/Webhooks.v1.json @@ -183,11 +183,15 @@ "failedTaskType": { "$ref": "#/components/schemas/failed-task-type", "description": "The failed task type." + }, + "input": { + "$ref": "#/components/schemas/task-input" } }, "required": [ "id", - "name" + "name", + "input" ] }, "failed-task-error": { @@ -455,13 +459,22 @@ "type": "string", "format": "date-time", "description": "The project due date.\n\nGMT Timezone\n\nAllowed formats:\\\n\"YYYY-MM-DDThh:mmZ\"\\\n\"YYYY-MM-DDThh:mm:ssZ\"\\\n\"YYYY-MM-DDThh:mm:ss.sZ\"\\\n\"YYYY-MM-DDThh:mm:ss.ssZ\"\\\n\"YYYY-MM-DDThh:mm:ss.sssZ\"" + }, + "input": { + "$ref": "#/components/schemas/task-input" + }, + "apiInternalId": { + "type": "string", + "description": "The internal id of the task. This field is not available for non-workflow tasks", + "nullable": true } }, "required": [ "id", "status", "taskType", - "assignees" + "assignees", + "input" ] }, "task-event-assignees": { @@ -517,6 +530,99 @@ "automatic" ] }, + "task-input": { + "title": "Task Input", + "type": "object", + "x-stoplight": { + "id": "task-input" + }, + "description": "Information about the task input. Currently only `sourceFile` and `targetFile` objects are populated in webhook events.", + "properties": { + "id": { + "type": "string", + "description": "The input identifier." + }, + "inputType": { + "type": "string", + "enum": [ + "sourceFile", + "targetFile", + "languageDirection", + "project" + ], + "description": "The type of input." + }, + "sourceFile": { + "$ref": "#/components/schemas/task-input-source-file", + "description": "Source file information. Present when inputType is sourceFile." + }, + "targetFile": { + "$ref": "#/components/schemas/task-input-target-file", + "description": "Target file information. Present when inputType is targetFile." + } + }, + "required": [ + "id", + "inputType" + ] + }, + "task-input-source-file": { + "title": "Task Input Source File", + "type": "object", + "x-stoplight": { + "id": "task-input-source-file" + }, + "description": "Source file information for task input.", + "properties": { + "fileVersionId": { + "type": "string", + "description": "The file version identifier." + }, + "version": { + "type": "integer", + "description": "The file version number." + }, + "type": { + "type": "string", + "enum": [ + "native", + "bcm" + ], + "description": "The file type." + } + }, + "required": [ + "fileVersionId", + "version", + "type" + ] + }, + "task-input-target-file": { + "title": "Task Input Target File", + "type": "object", + "x-stoplight": { + "id": "task-input-target-file" + }, + "description": "Target file information for task input. Extends source file with additional sourceFileId.", + "allOf": [ + { + "$ref": "#/components/schemas/task-input-source-file" + }, + { + "type": "object", + "properties": { + "sourceFileId": { + "type": "string", + "description": "The identifier of the source file associated with this target file." + } + }, + "required": [ + "sourceFileId", + "type" + ] + } + ] + }, "webhook": { "title": "Webhook", "type": "object", diff --git a/articles/LCPublicAPI/docs/Whats-New.md b/articles/LCPublicAPI/docs/Whats-New.md index 1ab04d2..4a35283 100644 --- a/articles/LCPublicAPI/docs/Whats-New.md +++ b/articles/LCPublicAPI/docs/Whats-New.md @@ -2,6 +2,16 @@
+## 12 February 2026 +- We have extended group management capabilities. You can now [Create](../api/Public-API.v1-fv.html#/operations/CreateGroup), [Update](../api/Public-API.v1-fv.html#/operations/UpdateGroup), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteGroup) groups, `roles` and `additionalRoles` are now available in [Get](../api/Public-API.v1-fv.html#/operations/GetGroup)/[List](../api/Public-API.v1-fv.html#/operations/ListGroups) operations. To support this, we have introduced a new [List Roles](../api/Public-API.v1-fv.html#/operations/ListRoles) endpoint. +- The available resource types returned by [Get](../api/Public-API.v1-fv.html#/operations/GetCustomField) and [List](../api/Public-API.v1-fv.html#/operations/ListCustomFields) Custom Field Definition(s) have been extended to include vendor and vendor order template (VOT). +- The [task-event](../api/Webhooks.v1-fv.html#/schemas/task-event) payload has been enhanced to include `apiInternalId` and `input`. The [error-task-event](../api/Webhooks.v1-fv.html#/schemas/error-task-event) payload has been enhanced to include `failedTask.input` information + - Task events now include `apiInternalId` in the task details, allowing for easier identification of custom tasks. + - Webhook input types include `sourceFile`, `targetFile`, `languageDirection`, `project`. + - For target files, the payload now includes a targetFile object which includes: `targetFileId`, `fileVersionId`, `version`, `type` (bcm/native), `sourceFileId`. + - For source files, the payload now includes a targetFile object which includes: `sourceFileId`, `fileVersionId`, `version`, `type` (bcm/native). +- We fixed various bugs. + ## 8 December 2025 - With this release we deliver full management capabilities for both users and applications. The new user endpoints enable [Create](../api/Public-API.v1-fv.html#/operations/CreateUser), [Update](../api/Public-API.v1-fv.html#/operations/UpdateUser), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteUser) operations, while application management now supports all CRUD operations: [Get](../api/Public-API.v1-fv.html#/operations/GetApplication), [List](../api/Public-API.v1-fv.html#/operations/ListApplications), [Create](../api/Public-API.v1-fv.html#/operations/CreateApplication), [Update](../api/Public-API.v1-fv.html#/operations/UpdateApplication), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteApplication). - As announced in November 2024, the `language` and `targetLanguages` fields in [Add Source File Request](../api/Public-API.v1-fv.html#/schemas/source-file-request) now use the [Language Request](../api/Public-API.v1-fv.html#/schemas/language-request) model. diff --git a/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md b/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md index 4eae7ea..e6d7bd2 100644 --- a/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md +++ b/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md @@ -73,6 +73,13 @@ ProjectCreateRequest projectCreateRequest = new ProjectCreateRequest(); projectCreateRequest.setName("YOUR_PROJECT_NAME"); projectCreateRequest.setDueBy(DateTime.parse("2025-01-01T00:00:00.000Z")); projectCreateRequest.setProjectTemplate(new ObjectIdRequest().id("YOUR_PROJECT_TEMPLATE_ID")); +projectCreateRequest.setLocation("YOUR_PROJECT_LOCATION"); + +List languageDirectionRequest = List.of(new LanguageDirectionRequest() + .sourceLanguage(new SourceLanguageRequest("YOUR_SOURCE_LANGUAGE")) + .targetLanguage(new TargetLanguageRequest("YOUR_TARGET_LANGUAGE")) +); +projectCreateRequest.setLanguageDirections(languageDirectionRequest); // Set the `fields` query parameter so the response is populated with `projectPlan.taskConfigurations` ProjectApi.CreateProjectQueryParams queryParams = new ProjectApi.CreateProjectQueryParams();