From df57e704fcac4fcc2fc4f023eaff95c96bd00881 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Tue, 21 Apr 2026 15:23:08 +0300 Subject: [PATCH 01/34] vendor management --- articles/LCPublicAPI/api/Public-API.v1.json | 992 +++++++++++++++++--- 1 file changed, 840 insertions(+), 152 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index a9b77b8..cb3a1ff 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -169,6 +169,10 @@ "name": "User", "description": "User" }, + { + "name": "Vendor", + "description": "Vendor." + }, { "name": "Workflow", "description": "Workflow" @@ -19656,19 +19660,35 @@ } ] }, - "/workflows/{workflowId}": { + "/vendors": { "get": { + "operationId": "ListVendors", + "summary": "List Vendors", + "description": "Retrieves a list of all the vendors in an account.", "tags": [ - "Workflow" + "Vendor" ], - "summary": "Get Workflow", - "description": "Retrieves a workflow by identifier.", "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, { "$ref": "#/components/parameters/Authorization" }, { - "$ref": "#/components/parameters/X-LC-Tenant" + "$ref": "#/components/parameters/top" + }, + { + "$ref": "#/components/parameters/skip" + }, + { + "$ref": "#/components/parameters/location" + }, + { + "$ref": "#/components/parameters/location-strategy" + }, + { + "$ref": "#/components/parameters/sort" }, { "$ref": "#/components/parameters/fields" @@ -19680,7 +19700,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/workflow" + "$ref": "#/components/schemas/list-vendors-response" } } }, @@ -19691,7 +19711,7 @@ } }, "400": { - "description": "Error codes:\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { @@ -19720,18 +19740,8 @@ } } }, - "403": { - "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to read the workflow.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/error-response" - } - } - } - }, - "404": { - "description": "Error codes:\n* \"notFound\": the resource could not be found by identifier.", + "416": { + "description": "Error codes:\n* \"requestedRangeNotSatisfiable\": The requested entity or one of its dependencies attempted to retrieve data outside the allowed range. Skip+Top might be outside the supported range.", "content": { "application/json": { "schema": { @@ -19745,44 +19755,57 @@ } } } - }, - "operationId": "GetWorkflow" + } }, - "put": { + "post": { + "operationId": "CreateVendor", + "summary": "Create Vendor", + "description": "Creates a new vendor organization. A vendor represents an external LSP that can be assigned translation tasks. The key contact provided will become the primary point of contact for the vendor.", "tags": [ - "Workflow" + "Vendor" ], - "summary": "Update Workflow", - "description": "Updates the workflow in terms of: name, description, and task configuration (and its details). Observe the rules of [JSON Merge Patch Semantics](https://tools.ietf.org/html/rfc7386).", "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, { "$ref": "#/components/parameters/Authorization" }, { - "$ref": "#/components/parameters/X-LC-Tenant" + "$ref": "#/components/parameters/fields" } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/workflow-update-request" + "$ref": "#/components/schemas/vendor-create-request" + }, + "example": { + "name": "Lionbridge", + "description": "Leading global LSP specializing in translation and localization.", + "keyContact": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@lionbridge.com" + }, + "location": "5e115aa000a849dda048d6b423806d35", + "selfManaged": true, + "quoteTemplateId": "ab49e078-8ea1-45fc-b469-475c38a1d20b", + "customFields": [ + { + "key": "vendor_tier", + "value": "premium" + } + ] } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content", - "headers": { - "X-LC-TraceId": { - "$ref": "#/components/headers/X-LC-TraceId" - } - } - }, - "400": { - "description": "Error codes:\n* “invalid”: Invalid input in the body parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty input in the body parameter mentioned in the \"name\" field on the error response.\n* \"limit.exceeded\": a maximum number of users per task was assigned\n", + "201": { + "description": "Vendor created successfully.", "headers": { "X-LC-TraceId": { "$ref": "#/components/headers/X-LC-TraceId" @@ -19791,14 +19814,33 @@ "content": { "application/json": { "schema": { - "type": "object", - "$ref": "#/components/schemas/error-response" + "$ref": "#/components/schemas/vendor" + }, + "example": { + "id": "69e693d00000000000000000", + "name": "Lionbridge", + "description": "Leading global LSP specializing in translation and localization.", + "keyContact": { + "id": "69e693d00000000000000001", + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@lionbridge.com" + }, + "location": { + "id": "a91ec1bdc70be40ad55bfb34d76c0026", + "name": "vendors" + }, + "selfManaged": true, + "quoteTemplate": { + "id": "ab49e078-8ea1-45fc-b469-475c38a1d20b", + "name": "Standard Quote Template" + } } } } }, - "401": { - "description": "The user could not be identified.", + "400": { + "description": "Bad request. The request body is invalid or a required field is missing.", "headers": { "X-LC-TraceId": { "$ref": "#/components/headers/X-LC-TraceId" @@ -19807,44 +19849,28 @@ "content": { "application/json": { "schema": { - "type": "object", "$ref": "#/components/schemas/error-response" } } } }, - "403": { - "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to update the Workflow.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/error-response" - } - } - }, + "401": { + "description": "Unauthorized. Authentication credentials are missing or invalid.", "headers": { "X-LC-TraceId": { "$ref": "#/components/headers/X-LC-TraceId" } - } - }, - "404": { - "description": "Error codes:\n* \"notFound\": the Workflow 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:\r\n* \"projectPlanChanged\": The associated project has already been changed at the level of `projectPlan.taskConfigurations`. Updating the workflow is no longer possible; the project should be updated to set the relevant `projectPlan.taskConfigurations` fields. \r\n", + "403": { + "description": "Forbidden. The authenticated user does not have permission to create vendors.", "headers": { "X-LC-TraceId": { "$ref": "#/components/headers/X-LC-TraceId" @@ -19853,49 +19879,28 @@ "content": { "application/json": { "schema": { - "type": "object", "$ref": "#/components/schemas/error-response" } } } } - }, - "operationId": "UpdateWorkflow" - }, - "parameters": [ - { - "$ref": "#/components/parameters/workflowId" } - ] + } }, - "/workflows": { + "/vendors/{vendorId}": { "get": { + "operationId": "GetVendor", + "summary": "Get Vendor", + "description": "Retrieves a vendor by identifier.", "tags": [ - "Workflow" + "Vendor" ], - "summary": "List Workflows", - "description": "Retrieves all the workflows in an account.", "parameters": [ - { - "$ref": "#/components/parameters/Authorization" - }, { "$ref": "#/components/parameters/X-LC-Tenant" }, { - "$ref": "#/components/parameters/top" - }, - { - "$ref": "#/components/parameters/skip" - }, - { - "$ref": "#/components/parameters/location" - }, - { - "$ref": "#/components/parameters/location-strategy" - }, - { - "$ref": "#/components/parameters/sort" + "$ref": "#/components/parameters/Authorization" }, { "$ref": "#/components/parameters/fields" @@ -19907,7 +19912,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/list-workflows-response" + "$ref": "#/components/schemas/vendor" } } }, @@ -19918,7 +19923,7 @@ } }, "400": { - "description": "Error codes:\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { @@ -19947,8 +19952,8 @@ } } }, - "416": { - "description": "Error codes:\n* \"requestedRangeNotSatisfiable\": The requested entity or one of its dependencies attempted to retrieve data outside the allowed range. Skip+Top might be outside the supported range.", + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to read the vendor.", "content": { "application/json": { "schema": { @@ -19961,35 +19966,49 @@ "$ref": "#/components/headers/X-LC-TraceId" } } - } - }, - "operationId": "ListWorkflows" - } - }, - "/projects/{projectId}/custom-fields/{customFieldKey}": { - "parameters": [ - { - "name": "projectId", - "in": "path", - "required": true, - "schema": { - "type": "string" - }, - "description": "The project identifier." - }, - { - "schema": { - "type": "string" }, - "name": "customFieldKey", - "in": "path", - "required": true, - "description": "The custom field key." + "404": { + "description": "Error codes:\n* \"notFound\": the vendor 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" + } + } + } } - ], + }, "put": { - "summary": "Update Custom Field", - "operationId": "UpdateCustomField", + "operationId": "UpdateVendor", + "summary": "Update Vendor", + "description": "Updates a vendor by identifier.", + "tags": [ + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/vendor-update-request" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content", @@ -20000,7 +20019,7 @@ } }, "400": { - "description": "Error codes:\n* “invalid”: Invalid input for a readOnly field, with a different value than the deafult one. Also this code is used for invalid input values", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { @@ -20030,7 +20049,7 @@ } }, "403": { - "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to update the Custom field for the Project.", + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to update the vendor.", "content": { "application/json": { "schema": { @@ -20045,7 +20064,7 @@ } }, "404": { - "description": "Error codes:\n* \"notFound\": the Project could not be found by identifier or Custom field key could not be found or does not belong to the desired resource type.", + "description": "Error codes:\n* \"notFound\": the vendor could not be found by identifier.", "content": { "application/json": { "schema": { @@ -20059,34 +20078,38 @@ } } } - }, - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/custom-field-update-request", - "description": "Thew new value along wit" - } - } - } - }, + } + }, + "delete": { + "operationId": "DeleteVendor", + "summary": "Delete Vendor", + "description": "Deletes a vendor by identifier.", "tags": [ - "Project" + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + } ], - "description": "Allows updating individual custom fields on a project.", - "parameters": [] - } - }, - "/translation-domain/service-types": { - "get": { - "summary": "List Service Types", "responses": { - "200": { - "description": "", + "204": { + "description": "No Content", + "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/list-translation-service-types-response" + "$ref": "#/components/schemas/error-response" } } }, @@ -20096,8 +20119,8 @@ } } }, - "401": { - "description": "The user could not be identified.", + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to delete the vendor.", "content": { "application/json": { "schema": { @@ -20110,9 +20133,493 @@ "$ref": "#/components/headers/X-LC-TraceId" } } - } - }, - "operationId": "ListTranslationServiceTypes", + }, + "404": { + "description": "Error codes:\n* \"notFound\": the vendor 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" + } + } + } + } + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "vendorId", + "in": "path", + "required": true, + "description": "The vendor identifier." + } + ] + }, + "/workflows/{workflowId}": { + "get": { + "tags": [ + "Workflow" + ], + "summary": "Get Workflow", + "description": "Retrieves a workflow by identifier.", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/workflow" + } + } + }, + "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.", + "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 workflow.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + } + }, + "404": { + "description": "Error codes:\n* \"notFound\": the resource 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" + } + } + } + }, + "operationId": "GetWorkflow" + }, + "put": { + "tags": [ + "Workflow" + ], + "summary": "Update Workflow", + "description": "Updates the workflow in terms of: name, description, and task configuration (and its details). Observe the rules of [JSON Merge Patch Semantics](https://tools.ietf.org/html/rfc7386).", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/workflow-update-request" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* “invalid”: Invalid input in the body parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty input in the body parameter mentioned in the \"name\" field on the error response.\n* \"limit.exceeded\": a maximum number of users per task was assigned\n", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "$ref": "#/components/schemas/error-response" + } + } + } + }, + "401": { + "description": "The user could not be identified.", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "$ref": "#/components/schemas/error-response" + } + } + } + }, + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to update the Workflow.", + "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 Workflow 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:\r\n* \"projectPlanChanged\": The associated project has already been changed at the level of `projectPlan.taskConfigurations`. Updating the workflow is no longer possible; the project should be updated to set the relevant `projectPlan.taskConfigurations` fields. \r\n", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "$ref": "#/components/schemas/error-response" + } + } + } + } + }, + "operationId": "UpdateWorkflow" + }, + "parameters": [ + { + "$ref": "#/components/parameters/workflowId" + } + ] + }, + "/workflows": { + "get": { + "tags": [ + "Workflow" + ], + "summary": "List Workflows", + "description": "Retrieves all the workflows in an account.", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/top" + }, + { + "$ref": "#/components/parameters/skip" + }, + { + "$ref": "#/components/parameters/location" + }, + { + "$ref": "#/components/parameters/location-strategy" + }, + { + "$ref": "#/components/parameters/sort" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/list-workflows-response" + } + } + }, + "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.", + "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" + } + } + }, + "416": { + "description": "Error codes:\n* \"requestedRangeNotSatisfiable\": The requested entity or one of its dependencies attempted to retrieve data outside the allowed range. Skip+Top might be outside the supported range.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "operationId": "ListWorkflows" + } + }, + "/projects/{projectId}/custom-fields/{customFieldKey}": { + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The project identifier." + }, + { + "schema": { + "type": "string" + }, + "name": "customFieldKey", + "in": "path", + "required": true, + "description": "The custom field key." + } + ], + "put": { + "summary": "Update Custom Field", + "operationId": "UpdateCustomField", + "responses": { + "204": { + "description": "No Content", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* “invalid”: Invalid input for a readOnly field, with a different value than the deafult one. Also this code is used for invalid input values", + "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 update the Custom field for the Project.", + "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 Project could not be found by identifier or Custom field key could not be found or does not belong to the desired resource type.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/custom-field-update-request", + "description": "Thew new value along wit" + } + } + } + }, + "tags": [ + "Project" + ], + "description": "Allows updating individual custom fields on a project.", + "parameters": [] + } + }, + "/translation-domain/service-types": { + "get": { + "summary": "List Service Types", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/list-translation-service-types-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": "ListTranslationServiceTypes", "parameters": [ { "$ref": "#/components/parameters/Authorization" @@ -22299,6 +22806,25 @@ ], "description": "A response for the List Customers endpoint." }, + "list-vendors-response": { + "title": "List Vendors Response", + "type": "object", + "properties": { + "items": { + "type": "array", + "description": "The list of vendors.", + "items": { + "$ref": "#/components/schemas/vendor" + } + }, + "itemCount": { + "type": "integer", + "description": "The number of items returned in this response." + } + }, + "required": ["items", "itemCount"], + "description": "A response for the List Vendors endpoint." + }, "list-custom-field-definitions-response": { "title": "List Custom Field Definitions Response", "type": "object", @@ -31638,6 +32164,168 @@ "id" ] }, + "key-contact": { + "title": "Key Contact", + "type": "object", + "description": "The key contact of a vendor — the primary point of contact within the LSP organization.", + "properties": { + "firstName": { + "type": "string", + "description": "The first name of the key contact.", + "maxLength": 50 + }, + "lastName": { + "type": "string", + "description": "The last name of the key contact.", + "maxLength": 50 + }, + "email": { + "type": "string", + "format": "email", + "description": "The email address of the key contact.", + "maxLength": 50 + } + }, + "required": ["firstName", "lastName", "email"] + }, + "vendor": { + "title": "Vendor", + "type": "object", + "description": "Represents an external LSP (Language Service Provider) organization that can be assigned translation tasks through vendor order templates.", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the vendor. Generated by the system." + }, + "name": { + "type": "string", + "description": "The name of the vendor." + }, + "description": { + "type": "string", + "description": "
default
A description of the vendor.
", + "x-default-field": true + }, + "keyContact": { + "$ref": "#/components/schemas/user", + "description": "The user that is the primary point of contact for this vendor." + }, + "location": { + "$ref": "#/components/schemas/folder", + "description": "The folder location associated with the vendor." + }, + "selfManaged": { + "type": "boolean", + "description": "Indicates whether the vendor is self-managed. When true, the vendor can manage its own users." + }, + "quoteTemplate": { + "$ref": "#/components/schemas/project-quote-template", + "description": "The quote template associated with this vendor." + }, + "members": { + "type": "array", + "description": "The users that are members of this vendor, including the key contact and any additionally invited members.", + "items": { + "$ref": "#/components/schemas/user" + } + }, + "customFields": { + "type": "array", + "description": "Custom field values associated with the vendor.", + "items": { + "$ref": "#/components/schemas/custom-field" + } + } + }, + "required": ["id", "name"] + }, + "vendor-create-request": { + "title": "Vendor Create Request", + "type": "object", + "description": "Request body for creating a new vendor.", + "properties": { + "name": { + "type": "string", + "description": "The name of the vendor.", + "minLength": 1, + "maxLength": 50 + }, + "description": { + "type": "string", + "description": "A description of the vendor.", + "maxLength": 1024 + }, + "keyContact": { + "$ref": "#/components/schemas/key-contact", + "description": "The primary point of contact within the vendor organization. Required when creating a vendor." + }, + "location": { + "type": "string", + "description": "The identifier of the folder under which the vendor will be created. If not provided, defaults to the `vendors` folder under the account `root`." + }, + "selfManaged": { + "type": "boolean", + "description": "Indicates whether the vendor is self-managed. Defaults to true.", + "default": true + }, + "quoteTemplateId": { + "type": "string", + "description": "The identifier of the quote template to associate with the vendor." + }, + "customFields": { + "type": "array", + "description": "Custom field values to associate with the vendor.", + "items": { + "$ref": "#/components/schemas/custom-field-request" + } + } + }, + "required": ["name", "keyContact"] + }, + "vendor-update-request": { + "title": "Vendor Update Request", + "type": "object", + "description": "Request body for updating an existing vendor.", + "properties": { + "name": { + "type": "string", + "description": "The name of the vendor.", + "minLength": 1, + "maxLength": 50 + }, + "description": { + "type": "string", + "description": "A description of the vendor.", + "maxLength": 1024 + }, + "keyContactId": { + "type": "string", + "description": "The identifier of the user to set as the primary point of contact for this vendor." + }, + "selfManaged": { + "type": "boolean", + "description": "Indicates whether the vendor is self-managed." + }, + "quoteTemplateId": { + "type": "string", + "description": "The identifier of the quote template to associate with the vendor." + }, + "members": { + "type": "array", + "description": "The members to assign to this vendor.", + "items": { + "$ref": "#/components/schemas/object-id-request" + } + }, + "customFields": { + "type": "array", + "description": "Custom field values to associate with the vendor.", + "items": { + "$ref": "#/components/schemas/custom-field-request" + } + } + } + }, "volume-unit-type": { "title": "Volume Unit Type", "type": "string", From 548dce99332c9ebcf31567da4eebf74144b32fb3 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Tue, 21 Apr 2026 17:01:07 +0300 Subject: [PATCH 02/34] VOT management --- articles/LCPublicAPI/api/Public-API.v1.json | 304 ++++++++++++++++++++ 1 file changed, 304 insertions(+) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index cb3a1ff..cecf087 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20163,6 +20163,122 @@ } ] }, + "/vendors/{vendorId}/order-templates": { + "post": { + "operationId": "CreateVendorOrderTemplate", + "summary": "Create Vendor Order Template", + "description": "Creates a new vendor order template for the specified vendor.", + "tags": [ + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/vendor-order-template-create-request" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Vendor Order Template created successfully.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/vendor-order-template-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* \"invalid\": Invalid input in the field 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 create vendor order templates.", + "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 vendor 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" + } + } + } + } + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "vendorId", + "in": "path", + "required": true, + "description": "The vendor identifier." + } + ] + }, "/workflows/{workflowId}": { "get": { "tags": [ @@ -32164,6 +32280,194 @@ "id" ] }, + "vendor-order-template-response": { + "title": "Vendor Order Template Response", + "type": "object", + "description": "A vendor order template resource.", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the vendor order template." + }, + "name": { + "type": "string", + "description": "The name of the vendor order template." + }, + "description": { + "type": "string", + "description": "A description of the vendor order template." + }, + "allowQuoteEditing": { + "type": "boolean", + "description": "Whether the vendor is allowed to edit the quote." + }, + "serviceTypes": { + "type": "array", + "description": "The service type identifiers associated with this vendor order template. Use the [List Service Types](#operation/ListTranslationServiceTypes) endpoint to retrieve available values.", + "items": { + "type": "string" + } + }, + "pricingModel": { + "$ref": "#/components/schemas/pricing-model", + "description": "The pricing model associated with this vendor order template." + }, + "quoteConfiguration": { + "$ref": "#/components/schemas/vendor-order-template-quote-configuration" + }, + "holdingDelay": { + "type": "integer", + "description": "The delay in minutes before the quote is finalized." + }, + "customFields": { + "type": "array", + "description": "Custom field values associated with the vendor order template.", + "items": { + "$ref": "#/components/schemas/custom-field" + } + }, + "languagePairs": { + "type": "array", + "description": "The language pairs supported by this vendor order template.", + "items": { + "$ref": "#/components/schemas/language-pair" + } + }, + "configurations": { + "type": "array", + "description": "Assignee and manager assignments per language scope.", + "items": { + "$ref": "#/components/schemas/vot-configuration" + } + } + }, + "required": ["id", "name"] + }, + "vendor-order-template-create-request": { + "title": "Vendor Order Template Create Request", + "type": "object", + "description": "Request body for creating a new vendor order template.", + "properties": { + "name": { + "type": "string", + "description": "The name of the vendor order template.", + "minLength": 1, + "maxLength": 50 + }, + "description": { + "type": "string", + "description": "A description of the vendor order template.", + "maxLength": 1024 + }, + "allowQuoteEditing": { + "type": "boolean", + "description": "Whether the vendor is allowed to edit the quote." + }, + "serviceTypes": { + "type": "array", + "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#operation/ListTranslationServiceTypes) endpoint to retrieve available values.", + "items": { + "type": "string" + } + }, + "pricingModelId": { + "type": "string", + "description": "The identifier of the pricing model to associate with this vendor order template." + }, + "quoteConfiguration": { + "$ref": "#/components/schemas/vendor-order-template-quote-configuration" + }, + "holdingDelay": { + "type": "integer", + "description": "The delay in minutes before the quote is finalized. Applicable when quoteConfiguration is `hold`." + }, + "customFields": { + "type": "array", + "description": "Custom field values to associate with the vendor order template.", + "items": { + "$ref": "#/components/schemas/custom-field-request" + } + }, + "shouldUpdateCustomFields": { + "type": "boolean", + "description": "When true, replaces all existing custom field values with those provided in customFields. When false, only updates matching keys." + }, + "languagePairs": { + "type": "array", + "description": "The language pairs supported by this vendor order template.", + "items": { + "$ref": "#/components/schemas/language-pair" + } + }, + "assignments": { + "type": "array", + "description": "Assignee and manager assignments per language scope.", + "items": { + "$ref": "#/components/schemas/vot-configuration" + } + } + }, + "required": ["name"] + }, + "vendor-order-template-quote-configuration": { + "title": "Vendor Order Template Quote Configuration", + "type": "string", + "description": "Defines when the vendor quote is generated.\n\n- `waitForAllFiles`: Wait for all files before generating the quote.\n- `perFileQuote`: Generate a quote for each file as it arrives.\n- `finalQuoteAfterBatchCompleted`: Generate the final quote once the batch is complete.\n- `quoteBeforeCustomerQuoteGeneration`: Generate the vendor quote before the customer quote.", + "enum": [ + "waitForAllFiles", + "perFileQuote", + "finalQuoteAfterBatchCompleted", + "quoteBeforeCustomerQuoteGeneration" + ] + }, + "vot-person-request": { + "title": "Vendor Order Template Person", + "type": "object", + "description": "A user or group assigned as a manager or assignee on a vendor order template.", + "properties": { + "type": { + "type": "string", + "enum": ["user", "group"], + "description": "The type of the assignee." + }, + "id": { + "type": "string", + "description": "The identifier of the user or group." + } + }, + "required": ["type", "id"] + }, + "vot-configuration": { + "title": "Vendor Order Template Configuration", + "type": "object", + "description": "Assignee and manager overrides for a specific language scope.\n\nSet `sourceLanguageCode` only to apply overrides to all language directions sharing that source language.\nSet both `sourceLanguageCode` and `targetLanguageCode` to apply overrides to a single language direction.", + "properties": { + "sourceLanguageCode": { + "type": "string", + "description": "The source language code this override applies to. Example: `en-US`." + }, + "targetLanguageCode": { + "type": "string", + "description": "The target language code this override applies to. Example: `de-DE`. When omitted, the override applies to all language directions with the given source language." + }, + "managers": { + "type": "array", + "description": "The managers for tasks matching this scope.", + "items": { + "$ref": "#/components/schemas/vot-person-request" + } + }, + "assignees": { + "type": "array", + "description": "The assignees for tasks matching this scope.", + "items": { + "$ref": "#/components/schemas/vot-person-request" + } + } + }, + "required": ["sourceLanguageCode"] + }, + "key-contact": { "title": "Key Contact", "type": "object", From 67c746893a7f37d60105648236673f90b4e60266 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Wed, 22 Apr 2026 14:36:12 +0300 Subject: [PATCH 03/34] VOT management --- articles/LCPublicAPI/api/Public-API.v1.json | 484 +++++++++++++++++++- 1 file changed, 477 insertions(+), 7 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index cecf087..b809d24 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -19681,12 +19681,6 @@ { "$ref": "#/components/parameters/skip" }, - { - "$ref": "#/components/parameters/location" - }, - { - "$ref": "#/components/parameters/location-strategy" - }, { "$ref": "#/components/parameters/sort" }, @@ -20164,6 +20158,111 @@ ] }, "/vendors/{vendorId}/order-templates": { + "get": { + "operationId": "ListVendorOrderTemplates", + "summary": "List Vendor Order Templates", + "description": "Retrieves a list of vendor order templates for the specified vendor.", + "tags": [ + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/top" + }, + { + "$ref": "#/components/parameters/skip" + }, + { + "$ref": "#/components/parameters/sort" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/list-vendor-order-templates-response" + } + } + }, + "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.", + "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" + } + } + }, + "404": { + "description": "Error codes:\n* \"notFound\": the vendor 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" + } + } + }, + "416": { + "description": "Error codes:\n* \"requestedRangeNotSatisfiable\": The requested entity or one of its dependencies attempted to retrieve data outside the allowed range. Skip+Top might be outside the supported range.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + } + }, "post": { "operationId": "CreateVendorOrderTemplate", "summary": "Create Vendor Order Template", @@ -20279,6 +20378,291 @@ } ] }, + "/vendors/{vendorId}/order-templates/{orderTemplateId}": { + "get": { + "operationId": "GetVendorOrderTemplate", + "summary": "Get Vendor Order Template", + "description": "Retrieves a vendor order template by identifier.", + "tags": [ + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/vendor-order-template-response" + } + } + }, + "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.", + "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 vendor order template.", + "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 vendor order template 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" + } + } + } + } + }, + "put": { + "operationId": "UpdateVendorOrderTemplate", + "summary": "Update Vendor Order Template", + "description": "Updates a vendor order template by identifier.", + "tags": [ + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/vendor-order-template-update-request" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content", + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + }, + "400": { + "description": "Error codes:\n* \"invalid\": Invalid input in the field 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 update the vendor order template.", + "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 vendor order template 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" + } + } + } + } + }, + "delete": { + "operationId": "DeleteVendorOrderTemplate", + "summary": "Delete Vendor Order Template", + "description": "Deletes a vendor order template by identifier.", + "tags": [ + "Vendor" + ], + "parameters": [ + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/Authorization" + } + ], + "responses": { + "204": { + "description": "No Content", + "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 vendor order template.", + "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 vendor order template 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" + } + } + } + } + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "vendorId", + "in": "path", + "required": true, + "description": "The vendor identifier." + }, + { + "schema": { + "type": "string" + }, + "name": "orderTemplateId", + "in": "path", + "required": true, + "description": "The vendor order template identifier." + } + ] + }, "/workflows/{workflowId}": { "get": { "tags": [ @@ -32270,6 +32654,8 @@ "vendor-order-template": { "title": "Vendor Order Template", "description": "The vendor order template.", + "deprecated": true, + "x-deprecated-reason": "Use vendor-order-template-response for full vendor order template representation.", "type": "object", "properties": { "id": { @@ -32333,7 +32719,7 @@ "$ref": "#/components/schemas/language-pair" } }, - "configurations": { + "assignments": { "type": "array", "description": "Assignee and manager assignments per language scope.", "items": { @@ -32343,6 +32729,90 @@ }, "required": ["id", "name"] }, + "list-vendor-order-templates-response": { + "title": "List Vendor Order Templates Response", + "type": "object", + "properties": { + "items": { + "type": "array", + "description": "The list of vendor order templates.", + "items": { + "$ref": "#/components/schemas/vendor-order-template-response" + } + }, + "itemCount": { + "type": "integer", + "description": "The number of items returned in this response." + } + }, + "required": ["items", "itemCount"], + "description": "A response for the List Vendor Order Templates endpoint." + }, + "vendor-order-template-update-request": { + "title": "Vendor Order Template Update Request", + "type": "object", + "description": "Request body for updating an existing vendor order template.", + "properties": { + "name": { + "type": "string", + "description": "The name of the vendor order template.", + "minLength": 1, + "maxLength": 50 + }, + "description": { + "type": "string", + "description": "A description of the vendor order template.", + "maxLength": 1024 + }, + "allowQuoteEditing": { + "type": "boolean", + "description": "Whether the vendor is allowed to edit the quote." + }, + "serviceTypes": { + "type": "array", + "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#operation/ListTranslationServiceTypes) endpoint to retrieve available values.", + "items": { + "type": "string" + } + }, + "pricingModelId": { + "type": "string", + "description": "The identifier of the pricing model to associate with this vendor order template." + }, + "quoteConfiguration": { + "$ref": "#/components/schemas/vendor-order-template-quote-configuration" + }, + "holdingDelay": { + "type": "integer", + "description": "The delay in minutes before the quote is finalized. Applicable when quoteConfiguration is `finalQuoteAfterBatchCompleted`." + }, + "customFields": { + "type": "array", + "description": "Custom field values to associate with the vendor order template.", + "items": { + "$ref": "#/components/schemas/custom-field-request" + } + }, + "shouldUpdateCustomFields": { + "type": "boolean", + "description": "When true, replaces all existing custom field values with those provided in customFields. When false, only updates matching keys." + }, + "languagePairs": { + "type": "array", + "description": "The language pairs supported by this vendor order template.", + "items": { + "$ref": "#/components/schemas/language-pair" + } + }, + "assignments": { + "type": "array", + "description": "Assignee and manager assignments per language scope.", + "items": { + "$ref": "#/components/schemas/vot-configuration" + } + } + } + }, "vendor-order-template-create-request": { "title": "Vendor Order Template Create Request", "type": "object", From 7fa7d03e849224add9835fe1e57baf531a10568f Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Thu, 23 Apr 2026 16:34:03 +0300 Subject: [PATCH 04/34] VOT member management removed, we can handle these with deducated user endpoints --- articles/LCPublicAPI/api/Public-API.v1.json | 24 ++++++--------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index b809d24..87c6dd3 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -19754,7 +19754,7 @@ "post": { "operationId": "CreateVendor", "summary": "Create Vendor", - "description": "Creates a new vendor organization. A vendor represents an external LSP that can be assigned translation tasks. The key contact provided will become the primary point of contact for the vendor.", + "description": "Creates a new vendor organization. A vendor represents an external LSP that can be assigned translation tasks. The key contact provided will become the primary point of contact for the vendor.\n\nCreating a vendor automatically provisions a dedicated folder and a `VendorProjectManager` group within the account hierarchy.\n\n**Managing vendor members:** Users can be added to a vendor by inviting them via the [Create User](#/operations/CreateUser) endpoint, specifying the auto-created `VendorProjectManager` group as one of the `groups` in the request. Users can be removed from the vendor by removing them from that group using the [Update Group](#/operations/UpdateGroup) or [Update User](#/operations/UpdateUser) endpoints.", "tags": [ "Vendor" ], @@ -19784,7 +19784,6 @@ "lastName": "Doe", "email": "john.doe@lionbridge.com" }, - "location": "5e115aa000a849dda048d6b423806d35", "selfManaged": true, "quoteTemplateId": "ab49e078-8ea1-45fc-b469-475c38a1d20b", "customFields": [ @@ -19885,7 +19884,7 @@ "get": { "operationId": "GetVendor", "summary": "Get Vendor", - "description": "Retrieves a vendor by identifier.", + "description": "Retrieves a vendor by identifier.\n\nUse the `fields` query parameter to include optional nested resources such as `members`. The `members` field returns the users in the vendor's `VendorProjectManager` group. To manage vendor members, use the [Create User](#/operations/CreateUser), [Update User](#/operations/UpdateUser), or [Update Group](#/operations/UpdateGroup) endpoints.", "tags": [ "Vendor" ], @@ -19981,7 +19980,7 @@ "put": { "operationId": "UpdateVendor", "summary": "Update Vendor", - "description": "Updates a vendor by identifier.", + "description": "Updates a vendor by identifier. Only fields included in the request body are updated (partial update semantics).\n\n**Member management is not part of this endpoint.** To add a user to a vendor, invite them via the [Create User](#/operations/CreateUser) endpoint specifying the vendor's `VendorProjectManager` group. To remove a user from the vendor, remove them from that group using the [Update Group](#/operations/UpdateGroup) or [Update User](#/operations/UpdateUser) endpoints.", "tags": [ "Vendor" ], @@ -32998,7 +32997,7 @@ }, "members": { "type": "array", - "description": "The users that are members of this vendor, including the key contact and any additionally invited members.", + "description": "The users that are members of this vendor, belonging to the vendor's `VendorProjectManager` group. To add users to the vendor, invite them via the [Create User](#/operations/CreateUser) endpoint specifying the `VendorProjectManager` group. To remove users, use the [Update Group](#/operations/UpdateGroup) or [Update User](#/operations/UpdateUser) endpoints.", "items": { "$ref": "#/components/schemas/user" } @@ -33016,7 +33015,7 @@ "vendor-create-request": { "title": "Vendor Create Request", "type": "object", - "description": "Request body for creating a new vendor.", + "description": "Request body for creating a new vendor. Creating a vendor automatically provisions a dedicated folder and a `VendorProjectManager` group.", "properties": { "name": { "type": "string", @@ -33033,10 +33032,6 @@ "$ref": "#/components/schemas/key-contact", "description": "The primary point of contact within the vendor organization. Required when creating a vendor." }, - "location": { - "type": "string", - "description": "The identifier of the folder under which the vendor will be created. If not provided, defaults to the `vendors` folder under the account `root`." - }, "selfManaged": { "type": "boolean", "description": "Indicates whether the vendor is self-managed. Defaults to true.", @@ -33059,7 +33054,7 @@ "vendor-update-request": { "title": "Vendor Update Request", "type": "object", - "description": "Request body for updating an existing vendor.", + "description": "Request body for updating an existing vendor. Only fields included in the request body are updated. Member management is not part of this endpoint — use the [Create User](#/operations/CreateUser), [Update User](#/operations/UpdateUser), or [Update Group](#/operations/UpdateGroup) endpoints to add or remove users from the vendor's `VendorProjectManager` group.", "properties": { "name": { "type": "string", @@ -33084,13 +33079,6 @@ "type": "string", "description": "The identifier of the quote template to associate with the vendor." }, - "members": { - "type": "array", - "description": "The members to assign to this vendor.", - "items": { - "$ref": "#/components/schemas/object-id-request" - } - }, "customFields": { "type": "array", "description": "Custom field values to associate with the vendor.", From e87d3b9f7b6cd3339626811fe28a63a38ec0bd77 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Fri, 24 Apr 2026 11:33:11 +0300 Subject: [PATCH 05/34] added vendorFolder and groups to vendor --- articles/LCPublicAPI/api/Public-API.v1.json | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 87c6dd3..72d42c0 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -19819,10 +19819,16 @@ "lastName": "Doe", "email": "john.doe@lionbridge.com" }, - "location": { + "vendorFolder": { "id": "a91ec1bdc70be40ad55bfb34d76c0026", "name": "vendors" }, + "groups": [ + { + "id": "69e693d00000000000000002", + "name": "VendorProjectManager" + } + ], "selfManaged": true, "quoteTemplate": { "id": "ab49e078-8ea1-45fc-b469-475c38a1d20b", @@ -32983,9 +32989,16 @@ "$ref": "#/components/schemas/user", "description": "The user that is the primary point of contact for this vendor." }, - "location": { - "$ref": "#/components/schemas/folder", - "description": "The folder location associated with the vendor." + "vendorFolder": { + "$ref": "#/components/schemas/folder-v2", + "description": "The folder provisioned for this vendor during creation." + }, + "groups": { + "type": "array", + "description": "The groups located in this vendor's folder. Includes the auto-provisioned `VendorProjectManager` group as well as any custom groups created in the vendor folder. The `VendorProjectManager` group identifier can be used when inviting users to the vendor via the [Create User](#/operations/CreateUser) endpoint.", + "items": { + "$ref": "#/components/schemas/group" + } }, "selfManaged": { "type": "boolean", From f3e8d0e0676f818f9a8554f1c3139e79584d7493 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Fri, 24 Apr 2026 16:55:29 +0300 Subject: [PATCH 06/34] final touches --- articles/LCPublicAPI/api/Public-API.v1.json | 213 ++++++++++++++++---- 1 file changed, 172 insertions(+), 41 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 72d42c0..df1898e 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -4,7 +4,12 @@ "title": "Trados Cloud Platform API", "description": "The Trados Cloud Platform API", "version": "1.0", - "contact": {} + "contact": {}, + "x-extensions": { + "x-default-field": { + "description": "When true, this property is included in the response by default — even when the `fields` query parameter is omitted. Properties without this annotation are only returned when explicitly requested via `fields`. The `id` property is always returned regardless." + } + } }, "servers": [ { @@ -19776,22 +19781,39 @@ "schema": { "$ref": "#/components/schemas/vendor-create-request" }, - "example": { - "name": "Lionbridge", - "description": "Leading global LSP specializing in translation and localization.", - "keyContact": { - "firstName": "John", - "lastName": "Doe", - "email": "john.doe@lionbridge.com" + "examples": { + "selfManagedVendor": { + "summary": "Self-managed vendor with quote template and custom fields", + "value": { + "name": "Lionbridge", + "description": "Leading global LSP specializing in translation and localization.", + "keyContact": { + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@lionbridge.com" + }, + "selfManaged": true, + "quoteTemplateId": "ab49e078-8ea1-45fc-b469-475c38a1d20b", + "customFields": [ + { + "key": "vendor_tier", + "value": "premium" + } + ] + } }, - "selfManaged": true, - "quoteTemplateId": "ab49e078-8ea1-45fc-b469-475c38a1d20b", - "customFields": [ - { - "key": "vendor_tier", - "value": "premium" + "managedVendorMinimal": { + "summary": "Externally managed vendor, no quote template", + "value": { + "name": "TransPerfect", + "keyContact": { + "firstName": "Jane", + "lastName": "Smith", + "email": "jane.smith@transperfect.com" + }, + "selfManaged": false } - ] + } } } } @@ -19809,33 +19831,75 @@ "schema": { "$ref": "#/components/schemas/vendor" }, - "example": { - "id": "69e693d00000000000000000", - "name": "Lionbridge", - "description": "Leading global LSP specializing in translation and localization.", - "keyContact": { - "id": "69e693d00000000000000001", - "firstName": "John", - "lastName": "Doe", - "email": "john.doe@lionbridge.com" - }, - "vendorFolder": { - "id": "a91ec1bdc70be40ad55bfb34d76c0026", - "name": "vendors" + "examples": { + "selfManagedVendor": { + "summary": "Self-managed vendor with quote template", + "value": { + "id": "69e693d00000000000000000", + "name": "Lionbridge", + "description": "Leading global LSP specializing in translation and localization.", + "keyContact": { + "id": "69e693d00000000000000001", + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@lionbridge.com" + }, + "vendorFolder": { + "id": "a91ec1bdc70be40ad55bfb34d76c0026", + "name": "vendors" + }, + "groups": [ + { + "id": "69e693d00000000000000002", + "name": "VendorProjectManager" + } + ], + "selfManaged": true, + "quoteTemplate": { + "id": "ab49e078-8ea1-45fc-b469-475c38a1d20b", + "name": "Standard Quote Template" + } + } }, - "groups": [ - { - "id": "69e693d00000000000000002", - "name": "VendorProjectManager" + "managedVendorMinimal": { + "summary": "Externally managed vendor, no quote template", + "value": { + "id": "69e693d00000000000000003", + "name": "TransPerfect", + "keyContact": { + "id": "69e693d00000000000000004", + "firstName": "Jane", + "lastName": "Smith", + "email": "jane.smith@transperfect.com" + }, + "vendorFolder": { + "id": "b82fd2cec81cf51be66agc45e87d1137", + "name": "vendors" + }, + "groups": [ + { + "id": "69e693d00000000000000005", + "name": "VendorProjectManager" + } + ], + "selfManaged": false } - ], - "selfManaged": true, - "quoteTemplate": { - "id": "ab49e078-8ea1-45fc-b469-475c38a1d20b", - "name": "Standard Quote Template" } } } + }, + "links": { + "GetVendorById": { + "operationId": "GetVendor", + "parameters": { + "vendorId": "$response.body#/id" + }, + "description": "Use the returned vendor `id` to retrieve the full vendor resource." + }, + "CreateVendorOrderTemplate": { + "operationId": "CreateVendorOrderTemplate", + "description": "Associate this vendor with a vendor order template to enable task assignment." + } } }, "400": { @@ -19849,6 +19913,22 @@ "application/json": { "schema": { "$ref": "#/components/schemas/error-response" + }, + "examples": { + "missingRequiredField": { + "summary": "Missing required field", + "value": { + "message": "The 'name' field is required.", + "errorCode": "MISSING_REQUIRED_FIELD", + "details": [ + { + "name": "name", + "code": "REQUIRED", + "value": null + } + ] + } + } } } } @@ -19864,6 +19944,15 @@ "application/json": { "schema": { "$ref": "#/components/schemas/error-response" + }, + "examples": { + "unauthorized": { + "summary": "Missing or invalid credentials", + "value": { + "message": "Authentication credentials are missing or invalid.", + "errorCode": "UNAUTHORIZED" + } + } } } } @@ -19879,6 +19968,15 @@ "application/json": { "schema": { "$ref": "#/components/schemas/error-response" + }, + "examples": { + "forbidden": { + "summary": "Insufficient permissions", + "value": { + "message": "You do not have permission to create vendors.", + "errorCode": "FORBIDDEN" + } + } } } } @@ -20147,6 +20245,21 @@ "$ref": "#/components/headers/X-LC-TraceId" } } + }, + "409": { + "description": "Error codes:\n* \"conflict\": the vendor cannot be deleted because its folder contains resources that must be removed first. The error details describe which resources are blocking deletion.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } } } }, @@ -20236,6 +20349,21 @@ } } }, + "403": { + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to list vendor order templates for this vendor.", + "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 vendor could not be found by identifier.", "content": { @@ -20281,6 +20409,9 @@ }, { "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/fields" } ], "requestBody": { @@ -32732,7 +32863,7 @@ } } }, - "required": ["id", "name"] + "required": ["id"] }, "list-vendor-order-templates-response": { "title": "List Vendor Order Templates Response", @@ -32854,7 +32985,7 @@ }, "holdingDelay": { "type": "integer", - "description": "The delay in minutes before the quote is finalized. Applicable when quoteConfiguration is `hold`." + "description": "The delay in minutes before the quote is finalized. Applicable when quoteConfiguration is `finalQuoteAfterBatchCompleted`." }, "customFields": { "type": "array", @@ -33023,7 +33154,7 @@ } } }, - "required": ["id", "name"] + "required": ["id"] }, "vendor-create-request": { "title": "Vendor Create Request", @@ -33047,7 +33178,7 @@ }, "selfManaged": { "type": "boolean", - "description": "Indicates whether the vendor is self-managed. Defaults to true.", + "description": "Indicates whether the vendor can manage its own users and settings independently. When true (default), users with access to the vendor folder can manage the vendor's group membership. When false, only account-level administrators can manage the vendor. Can be updated after creation via the Update Vendor endpoint.", "default": true }, "quoteTemplateId": { From 1b46362c38306871f5b75fa42cbb8cb864c227e7 Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Fri, 8 May 2026 14:04:09 +0300 Subject: [PATCH 07/34] Update Public-API.v1.json --- articles/LCPublicAPI/api/Public-API.v1.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index df1898e..6e83985 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -33109,12 +33109,12 @@ }, "name": { "type": "string", - "description": "The name of the vendor." + "description": "
default
The name of the vendor.
", + "x-default-field": true }, "description": { "type": "string", - "description": "
default
A description of the vendor.
", - "x-default-field": true + "description": "A description of the vendor." }, "keyContact": { "$ref": "#/components/schemas/user", @@ -34432,4 +34432,4 @@ } } } -} \ No newline at end of file +} From ec9763d3ed465b800e4bf0cd76d6397d36005c1a Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Tue, 12 May 2026 09:21:18 +0300 Subject: [PATCH 08/34] Add 409 for create vendor --- articles/LCPublicAPI/api/Public-API.v1.json | 23 +++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 6e83985..cb6c2fe 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -19980,6 +19980,21 @@ } } } + }, + "409": { + "description": "Error codes:\n* “duplicate”: duplicate value for the field mentioned in the error details.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } } } } @@ -33109,12 +33124,12 @@ }, "name": { "type": "string", - "description": "
default
The name of the vendor.
", - "x-default-field": true + "description": "The name of the vendor." }, "description": { "type": "string", - "description": "A description of the vendor." + "description": "
default
A description of the vendor.
", + "x-default-field": true }, "keyContact": { "$ref": "#/components/schemas/user", @@ -33163,7 +33178,7 @@ "properties": { "name": { "type": "string", - "description": "The name of the vendor.", + "description": "The name of the vendor.\\\nUnsupported characters in the name: `\\` `/` `:` ` *` `?` `\"` `<` `>` `|`", "minLength": 1, "maxLength": 50 }, From 26151c5b82796d119d3d91fc2a62c51438a9c745 Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Tue, 12 May 2026 09:24:13 +0300 Subject: [PATCH 09/34] Update Public-API.v1.json --- articles/LCPublicAPI/api/Public-API.v1.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index cb6c2fe..6676594 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -33124,11 +33124,12 @@ }, "name": { "type": "string", - "description": "The name of the vendor." + "description": "
default
The name of the vendor.
", + "x-default-field": true }, "description": { "type": "string", - "description": "
default
A description of the vendor.
", + "description": "A description of the vendor.", "x-default-field": true }, "keyContact": { From fcf21b7db748c691db231c1e644504c19ec08a54 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Tue, 12 May 2026 12:51:26 +0300 Subject: [PATCH 10/34] refine vendor and VOT endpoints, add resourceType query param to customFields, add get/list quoteTemplates --- articles/LCPublicAPI/api/Public-API.v1.json | 457 ++++++++++++++++++-- 1 file changed, 415 insertions(+), 42 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 6676594..626a0e3 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -98,6 +98,10 @@ "name": "Quote", "description": "Quote" }, + { + "name": "Quote Template", + "description": "Quote Template" + }, { "name": "Rate Limits", "description": "Rate Limits" @@ -1331,6 +1335,9 @@ }, { "$ref": "#/components/parameters/fields" + }, + { + "$ref": "#/components/parameters/resourceType" } ], "tags": [ @@ -11095,6 +11102,213 @@ "operationId": "CreateProjectTemplate" } }, + "/quote-templates": { + "get": { + "tags": [ + "Quote Template" + ], + "summary": "List Quote Templates", + "description": "Retrieves a list of all the quote templates in an account.", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/top" + }, + { + "$ref": "#/components/parameters/skip" + }, + { + "$ref": "#/components/parameters/location" + }, + { + "$ref": "#/components/parameters/location-strategy" + }, + { + "$ref": "#/components/parameters/sort" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/list-quote-templates-response" + } + } + }, + "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.", + "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" + } + } + }, + "416": { + "description": "Error codes:\n* \"requestedRangeNotSatisfiable\": The requested entity or one of its dependencies attempted to retrieve data outside the allowed range. Skip+Top might be outside the supported range.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } + } + } + }, + "operationId": "ListQuoteTemplates" + } + }, + "/quote-templates/{quoteTemplateId}": { + "get": { + "tags": [ + "Quote Template" + ], + "summary": "Get Quote Template", + "description": "Retrieves a quote template by identifier.", + "parameters": [ + { + "$ref": "#/components/parameters/Authorization" + }, + { + "$ref": "#/components/parameters/X-LC-Tenant" + }, + { + "$ref": "#/components/parameters/fields" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/project-quote-template" + } + } + }, + "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.", + "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 quote template.", + "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 resource 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" + } + } + } + }, + "operationId": "GetQuoteTemplate" + }, + "parameters": [ + { + "name": "quoteTemplateId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The identifier of the quote template." + } + ] + }, "/rate-limits": { "get": { "tags": [ @@ -20025,6 +20239,69 @@ "application/json": { "schema": { "$ref": "#/components/schemas/vendor" + }, + "examples": { + "selfManagedVendor": { + "summary": "Self-managed vendor with quote template and members", + "value": { + "id": "69e693d00000000000000000", + "name": "Lionbridge", + "description": "Leading global LSP specializing in translation and localization.", + "keyContact": { + "id": "69e693d00000000000000001", + "firstName": "John", + "lastName": "Doe", + "email": "john.doe@lionbridge.com" + }, + "vendorFolder": { + "id": "a91ec1bdc70be40ad55bfb34d76c0026", + "name": "vendors" + }, + "groups": [ + { + "id": "69e693d00000000000000002", + "name": "VendorProjectManager" + } + ], + "selfManaged": true, + "quoteTemplate": { + "id": "ab49e078-8ea1-45fc-b469-475c38a1d20b", + "name": "Standard Quote Template" + }, + "members": [ + { + "id": "69e693d00000000000000010", + "firstName": "Alice", + "lastName": "Translator", + "email": "alice@lionbridge.com" + } + ] + } + }, + "externallyManagedVendor": { + "summary": "Externally managed vendor, no quote template", + "value": { + "id": "69e693d00000000000000003", + "name": "TransPerfect", + "keyContact": { + "id": "69e693d00000000000000004", + "firstName": "Jane", + "lastName": "Smith", + "email": "jane.smith@transperfect.com" + }, + "vendorFolder": { + "id": "b82fd2cec81cf51be66agc45e87d1137", + "name": "vendors" + }, + "groups": [ + { + "id": "69e693d00000000000000005", + "name": "VendorProjectManager" + } + ], + "selfManaged": false + } + } } } }, @@ -20099,7 +20376,7 @@ "put": { "operationId": "UpdateVendor", "summary": "Update Vendor", - "description": "Updates a vendor by identifier. Only fields included in the request body are updated (partial update semantics).\n\n**Member management is not part of this endpoint.** To add a user to a vendor, invite them via the [Create User](#/operations/CreateUser) endpoint specifying the vendor's `VendorProjectManager` group. To remove a user from the vendor, remove them from that group using the [Update Group](#/operations/UpdateGroup) or [Update User](#/operations/UpdateUser) endpoints.", + "description": "Updates a vendor by identifier. Only fields included in the request body are updated. We recommend reading [Updating data with PUT](../docs/Updating-data-with-PUT.html) before using this endpoint.\n\n**Member management is not part of this endpoint.** To add a user to a vendor, invite them via the [Create User](#/operations/CreateUser) endpoint specifying the vendor's `VendorProjectManager` group. To remove a user from the vendor, remove them from that group using the [Update Group](#/operations/UpdateGroup) or [Update User](#/operations/UpdateUser) endpoints.", "tags": [ "Vendor" ], @@ -20414,7 +20691,7 @@ "post": { "operationId": "CreateVendorOrderTemplate", "summary": "Create Vendor Order Template", - "description": "Creates a new vendor order template for the specified vendor.", + "description": "Creates a new vendor order template for the specified vendor.\n\nFor more information on creating vendor order templates, see [Creating order templates for vendors](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/creating-order-templates-for-vendors-708439).", "tags": [ "Vendor" ], @@ -20434,6 +20711,54 @@ "application/json": { "schema": { "$ref": "#/components/schemas/vendor-order-template-create-request" + }, + "examples": { + "singleLanguagePair": { + "summary": "Single language pair with one manager and one assignee", + "value": { + "name": "EN-FR Translation", + "pricingModelId": "pm-abc123", + "quoteConfiguration": "waitForAllFiles", + "languagePairs": [ + { "source": "en-US", "target": "fr-FR" } + ], + "assignments": [ + { + "languagePair": { "source": "en-US", "target": "fr-FR" }, + "managers": [ { "type": "user", "id": "69e693d00000000000000010" } ], + "assignees": [ { "type": "user", "id": "69e693d00000000000000011" } ] + } + ] + } + }, + "multipleLanguagePairs": { + "summary": "Multiple language pairs with group assignees and holding delay", + "value": { + "name": "Multilingual Package", + "description": "Template covering EN to DE and FR with a group-based assignee.", + "pricingModelId": "pm-def456", + "quoteConfiguration": "finalQuoteAfterBatchCompleted", + "holdingDelay": 30, + "allowQuoteEditing": true, + "serviceTypes": [ "st-translation-001" ], + "languagePairs": [ + { "source": "en-US", "target": "de-DE" }, + { "source": "en-US", "target": "fr-FR" } + ], + "assignments": [ + { + "languagePair": { "source": "en-US", "target": "de-DE" }, + "managers": [ { "type": "user", "id": "69e693d00000000000000010" } ], + "assignees": [ { "type": "group", "id": "69e693d00000000000000002" } ] + }, + { + "languagePair": { "source": "en-US", "target": "fr-FR" }, + "managers": [ { "type": "user", "id": "69e693d00000000000000010" } ], + "assignees": [ { "type": "user", "id": "69e693d00000000000000011" } ] + } + ] + } + } } } }, @@ -20446,6 +20771,28 @@ "application/json": { "schema": { "$ref": "#/components/schemas/vendor-order-template-response" + }, + "examples": { + "singleLanguagePair": { + "summary": "Single language pair template", + "value": { + "id": "vot-abc123", + "name": "EN-FR Translation", + "quoteConfiguration": "waitForAllFiles", + "allowQuoteEditing": false, + "pricingModel": { "id": "pm-abc123", "name": "Standard Rate" }, + "languagePairs": [ + { "source": "en-US", "target": "fr-FR" } + ], + "assignments": [ + { + "languagePair": { "source": "en-US", "target": "fr-FR" }, + "managers": [ { "type": "user", "id": "69e693d00000000000000010" } ], + "assignees": [ { "type": "user", "id": "69e693d00000000000000011" } ] + } + ] + } + } } } }, @@ -20629,7 +20976,7 @@ "put": { "operationId": "UpdateVendorOrderTemplate", "summary": "Update Vendor Order Template", - "description": "Updates a vendor order template by identifier.", + "description": "Updates a vendor order template by identifier. Only fields included in the request body are updated. We recommend reading [Updating data with PUT](../docs/Updating-data-with-PUT.html) before using this endpoint.", "tags": [ "Vendor" ], @@ -23476,6 +23823,25 @@ "required": ["items", "itemCount"], "description": "A response for the List Vendors endpoint." }, + "list-quote-templates-response": { + "title": "List Quote Templates Response", + "type": "object", + "properties": { + "itemCount": { + "type": "integer", + "description": "The total number of quote templates matching the query." + }, + "items": { + "type": "array", + "description": "The list of quote templates.", + "items": { + "$ref": "#/components/schemas/project-quote-template" + } + } + }, + "required": ["itemCount", "items"], + "description": "A response for the List Quote Templates endpoint." + }, "list-custom-field-definitions-response": { "title": "List Custom Field Definitions Response", "type": "object", @@ -32840,9 +33206,9 @@ }, "serviceTypes": { "type": "array", - "description": "The service type identifiers associated with this vendor order template. Use the [List Service Types](#operation/ListTranslationServiceTypes) endpoint to retrieve available values.", + "description": "The service types associated with this vendor order template.", "items": { - "type": "string" + "$ref": "#/components/schemas/translation-service-type" } }, "pricingModel": { @@ -32872,7 +33238,7 @@ }, "assignments": { "type": "array", - "description": "Assignee and manager assignments per language scope.", + "description": "Assignee and manager assignments per language pair. Contains exactly one entry for each language pair in `languagePairs`.", "items": { "$ref": "#/components/schemas/vot-configuration" } @@ -32917,18 +33283,19 @@ }, "allowQuoteEditing": { "type": "boolean", - "description": "Whether the vendor is allowed to edit the quote." + "default": false, + "description": "Whether the vendor is allowed to edit the vendor quote at any time. When `false` (default), vendor project managers can only edit the quote during the Vendor Quote Review task." }, "serviceTypes": { "type": "array", - "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#operation/ListTranslationServiceTypes) endpoint to retrieve available values.", + "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#/operations/ListTranslationServiceTypes) endpoint to retrieve available values.", "items": { "type": "string" } }, "pricingModelId": { "type": "string", - "description": "The identifier of the pricing model to associate with this vendor order template." + "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder, or `locationStrategy=bloodline` to also include pricing models inherited from ancestor folders." }, "quoteConfiguration": { "$ref": "#/components/schemas/vendor-order-template-quote-configuration" @@ -32939,15 +33306,11 @@ }, "customFields": { "type": "array", - "description": "Custom field values to associate with the vendor order template.", + "description": "Custom field values to associate with the vendor order template. Use the [List Custom Field Definitions](#/operations/ListCustomFields) endpoint with `location` set to the vendor's folder identifier and `resourceType=vendorOrderTemplate` to retrieve applicable definitions.", "items": { "$ref": "#/components/schemas/custom-field-request" } }, - "shouldUpdateCustomFields": { - "type": "boolean", - "description": "When true, replaces all existing custom field values with those provided in customFields. When false, only updates matching keys." - }, "languagePairs": { "type": "array", "description": "The language pairs supported by this vendor order template.", @@ -32957,7 +33320,7 @@ }, "assignments": { "type": "array", - "description": "Assignee and manager assignments per language scope.", + "description": "Assignee and manager assignments per language pair. Must contain exactly one entry for each language pair listed in `languagePairs`.", "items": { "$ref": "#/components/schemas/vot-configuration" } @@ -32982,18 +33345,19 @@ }, "allowQuoteEditing": { "type": "boolean", - "description": "Whether the vendor is allowed to edit the quote." + "default": false, + "description": "Whether the vendor is allowed to edit the vendor quote at any time. When `false` (default), vendor project managers can only edit the quote during the Vendor Quote Review task." }, "serviceTypes": { "type": "array", - "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#operation/ListTranslationServiceTypes) endpoint to retrieve available values.", + "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#/operations/ListTranslationServiceTypes) endpoint to retrieve available values.", "items": { "type": "string" } }, "pricingModelId": { "type": "string", - "description": "The identifier of the pricing model to associate with this vendor order template." + "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder, or `locationStrategy=bloodline` to also include pricing models inherited from ancestor folders." }, "quoteConfiguration": { "$ref": "#/components/schemas/vendor-order-template-quote-configuration" @@ -33004,15 +33368,11 @@ }, "customFields": { "type": "array", - "description": "Custom field values to associate with the vendor order template.", + "description": "Custom field values to associate with the vendor order template. Use the [List Custom Field Definitions](#/operations/ListCustomFields) endpoint with `location` set to the vendor's folder identifier and `resourceType=vendorOrderTemplate` to retrieve applicable definitions.", "items": { "$ref": "#/components/schemas/custom-field-request" } }, - "shouldUpdateCustomFields": { - "type": "boolean", - "description": "When true, replaces all existing custom field values with those provided in customFields. When false, only updates matching keys." - }, "languagePairs": { "type": "array", "description": "The language pairs supported by this vendor order template.", @@ -33022,18 +33382,18 @@ }, "assignments": { "type": "array", - "description": "Assignee and manager assignments per language scope.", + "description": "Assignee and manager assignments per language pair. Must contain exactly one entry for each language pair listed in `languagePairs`.", "items": { "$ref": "#/components/schemas/vot-configuration" } } }, - "required": ["name"] + "required": ["name", "languagePairs", "assignments", "pricingModelId", "quoteConfiguration"] }, "vendor-order-template-quote-configuration": { "title": "Vendor Order Template Quote Configuration", "type": "string", - "description": "Defines when the vendor quote is generated.\n\n- `waitForAllFiles`: Wait for all files before generating the quote.\n- `perFileQuote`: Generate a quote for each file as it arrives.\n- `finalQuoteAfterBatchCompleted`: Generate the final quote once the batch is complete.\n- `quoteBeforeCustomerQuoteGeneration`: Generate the vendor quote before the customer quote.", + "description": "Defines when the vendor quote is generated. For details on how each strategy behaves, see [Vendor order template strategies and their behavior](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/vendor-order-template-strategies-and-their-behavior-1170239).\n\n- `waitForAllFiles`: Wait for all files before generating the quote.\n- `perFileQuote`: Generate a quote for each file as it arrives.\n- `finalQuoteAfterBatchCompleted`: Generate the final quote once the batch is complete.\n- `quoteBeforeCustomerQuoteGeneration`: Generate the vendor quote before the customer quote.", "enum": [ "waitForAllFiles", "perFileQuote", @@ -33053,7 +33413,7 @@ }, "id": { "type": "string", - "description": "The identifier of the user or group." + "description": "The identifier of the user or group. For `type: user`, must be the `id` of a user present in the vendor's `members` list (see [Get Vendor](#/operations/GetVendor)). For `type: group`, must be the `id` of a group present in the vendor's `groups` list." } }, "required": ["type", "id"] @@ -33061,32 +33421,30 @@ "vot-configuration": { "title": "Vendor Order Template Configuration", "type": "object", - "description": "Assignee and manager overrides for a specific language scope.\n\nSet `sourceLanguageCode` only to apply overrides to all language directions sharing that source language.\nSet both `sourceLanguageCode` and `targetLanguageCode` to apply overrides to a single language direction.", + "description": "Assignee and manager assignment for a specific language pair. Every language pair listed in `languagePairs` must have exactly one corresponding entry in `assignments`.", "properties": { - "sourceLanguageCode": { - "type": "string", - "description": "The source language code this override applies to. Example: `en-US`." - }, - "targetLanguageCode": { - "type": "string", - "description": "The target language code this override applies to. Example: `de-DE`. When omitted, the override applies to all language directions with the given source language." + "languagePair": { + "$ref": "#/components/schemas/language-pair", + "description": "The language pair this assignment applies to." }, "managers": { "type": "array", - "description": "The managers for tasks matching this scope.", + "description": "The vendor project managers responsible for the Vendor Quote Review task for this language pair. All entries must be members of the vendor's Vendor Project Manager group.", + "minItems": 1, "items": { "$ref": "#/components/schemas/vot-person-request" } }, "assignees": { "type": "array", - "description": "The assignees for tasks matching this scope.", + "description": "The vendor users who will perform the actual service tasks (e.g. Translation, Linguistic Review, DTP) for this language pair. All entries must be members of the vendor's Vendor Project Manager group.", + "minItems": 1, "items": { "$ref": "#/components/schemas/vot-person-request" } } }, - "required": ["sourceLanguageCode"] + "required": ["languagePair", "managers", "assignees"] }, "key-contact": { @@ -33199,11 +33557,11 @@ }, "quoteTemplateId": { "type": "string", - "description": "The identifier of the quote template to associate with the vendor." + "description": "The identifier of the quote template to associate with the vendor. Use the [List Quote Templates](#/operations/ListQuoteTemplates) endpoint to retrieve available values." }, "customFields": { "type": "array", - "description": "Custom field values to associate with the vendor.", + "description": "Custom field values to associate with the vendor. Use the [List Custom Field Definitions](#/operations/ListCustomFields) endpoint with `location` set to the vendor's folder identifier and `resourceType=vendor` to retrieve applicable definitions.", "items": { "$ref": "#/components/schemas/custom-field-request" } @@ -33237,11 +33595,11 @@ }, "quoteTemplateId": { "type": "string", - "description": "The identifier of the quote template to associate with the vendor." + "description": "The identifier of the quote template to associate with the vendor. Use the [List Quote Templates](#/operations/ListQuoteTemplates) endpoint to retrieve available values." }, "customFields": { "type": "array", - "description": "Custom field values to associate with the vendor.", + "description": "Custom field values to associate with the vendor. Use the [List Custom Field Definitions](#/operations/ListCustomFields) endpoint with `location` set to the vendor's folder identifier and `resourceType=vendor` to retrieve applicable definitions.", "items": { "$ref": "#/components/schemas/custom-field-request" } @@ -34181,6 +34539,21 @@ "type": "string" } }, + "resourceType": { + "name": "resourceType", + "in": "query", + "required": false, + "description": "Filters the custom field definitions by the resource type they apply to.", + "schema": { + "type": "string", + "enum": [ + "project", + "customer", + "vendor", + "vendorOrderTemplate" + ] + } + }, "customerId": { "name": "customerId", "in": "path", From 7ad8f16b02e4e9b9a343c475a29dfcba68e330bf Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Tue, 12 May 2026 12:57:59 +0300 Subject: [PATCH 11/34] added oneOf to VOT person --- articles/LCPublicAPI/api/Public-API.v1.json | 46 ++++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 626a0e3..c2a66df 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -33403,20 +33403,44 @@ }, "vot-person-request": { "title": "Vendor Order Template Person", - "type": "object", "description": "A user or group assigned as a manager or assignee on a vendor order template.", - "properties": { - "type": { - "type": "string", - "enum": ["user", "group"], - "description": "The type of the assignee." + "discriminator": { + "propertyName": "type" + }, + "oneOf": [ + { + "title": "User assignment", + "type": "object", + "description": "Assigns an individual user. The `id` must be the `id` of a user present in the vendor's `members` list (see [Get Vendor](#/operations/GetVendor) with `fields=members`).", + "properties": { + "type": { + "type": "string", + "enum": ["user"] + }, + "id": { + "type": "string", + "description": "The identifier of the user." + } + }, + "required": ["type", "id"] }, - "id": { - "type": "string", - "description": "The identifier of the user or group. For `type: user`, must be the `id` of a user present in the vendor's `members` list (see [Get Vendor](#/operations/GetVendor)). For `type: group`, must be the `id` of a group present in the vendor's `groups` list." + { + "title": "Group assignment", + "type": "object", + "description": "Assigns a group. The `id` must be the `id` of a group present in the vendor's `groups` list (see [Get Vendor](#/operations/GetVendor)).", + "properties": { + "type": { + "type": "string", + "enum": ["group"] + }, + "id": { + "type": "string", + "description": "The identifier of the group." + } + }, + "required": ["type", "id"] } - }, - "required": ["type", "id"] + ] }, "vot-configuration": { "title": "Vendor Order Template Configuration", From a17046392327b10fb50f1d00b254c9784e132ce5 Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Tue, 12 May 2026 13:16:07 +0300 Subject: [PATCH 12/34] added unsupported characters to name of vendor/vot --- articles/LCPublicAPI/api/Public-API.v1.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index c2a66df..9549889 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -33272,7 +33272,7 @@ "properties": { "name": { "type": "string", - "description": "The name of the vendor order template.", + "description": "The name of the vendor order template.\\\nUnsupported characters in the name: `\\` `/` `:` ` *` `?` `\"` `<` `>` `|`", "minLength": 1, "maxLength": 50 }, @@ -33334,7 +33334,7 @@ "properties": { "name": { "type": "string", - "description": "The name of the vendor order template.", + "description": "The name of the vendor order template. \\\nUnsupported characters in the name: `\\` `/` `:` ` *` `?` `\"` `<` `>` `|`", "minLength": 1, "maxLength": 50 }, @@ -33600,7 +33600,7 @@ "properties": { "name": { "type": "string", - "description": "The name of the vendor.", + "description": "The name of the vendor. \\\nUnsupported characters in the name: `\\` `/` `:` ` *` `?` `\"` `<` `>` `|`", "minLength": 1, "maxLength": 50 }, From 1e72cb17686f42ccfe8fc127b8deacf42727969e Mon Sep 17 00:00:00 2001 From: "laszlo.david" Date: Tue, 12 May 2026 14:16:26 +0300 Subject: [PATCH 13/34] refactored quote configuration --- articles/LCPublicAPI/api/Public-API.v1.json | 55 ++++++++++++--------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 9549889..d27ca2c 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20714,11 +20714,11 @@ }, "examples": { "singleLanguagePair": { - "summary": "Single language pair with one manager and one assignee", + "summary": "Single language pair, with one manager and one assignee, wait for all files (default delay)", "value": { "name": "EN-FR Translation", "pricingModelId": "pm-abc123", - "quoteConfiguration": "waitForAllFiles", + "quoteConfiguration": { "behaviour": "waitForAllFiles" }, "languagePairs": [ { "source": "en-US", "target": "fr-FR" } ], @@ -20732,13 +20732,12 @@ } }, "multipleLanguagePairs": { - "summary": "Multiple language pairs with group assignees and holding delay", + "summary": "Multiple language pairs with group assignees and wait for all files with custom holding delay", "value": { "name": "Multilingual Package", "description": "Template covering EN to DE and FR with a group-based assignee.", "pricingModelId": "pm-def456", - "quoteConfiguration": "finalQuoteAfterBatchCompleted", - "holdingDelay": 30, + "quoteConfiguration": { "behaviour": "waitForAllFiles", "holdingDelay": 120 }, "allowQuoteEditing": true, "serviceTypes": [ "st-translation-001" ], "languagePairs": [ @@ -20778,7 +20777,7 @@ "value": { "id": "vot-abc123", "name": "EN-FR Translation", - "quoteConfiguration": "waitForAllFiles", + "quoteConfiguration": { "behaviour": "waitForAllFiles" }, "allowQuoteEditing": false, "pricingModel": { "id": "pm-abc123", "name": "Standard Rate" }, "languagePairs": [ @@ -33216,11 +33215,8 @@ "description": "The pricing model associated with this vendor order template." }, "quoteConfiguration": { - "$ref": "#/components/schemas/vendor-order-template-quote-configuration" - }, - "holdingDelay": { - "type": "integer", - "description": "The delay in minutes before the quote is finalized." + "$ref": "#/components/schemas/vendor-order-template-quote-configuration", + "description": "Controls when and how the vendor quote is generated." }, "customFields": { "type": "array", @@ -33298,11 +33294,8 @@ "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder, or `locationStrategy=bloodline` to also include pricing models inherited from ancestor folders." }, "quoteConfiguration": { - "$ref": "#/components/schemas/vendor-order-template-quote-configuration" - }, - "holdingDelay": { - "type": "integer", - "description": "The delay in minutes before the quote is finalized. Applicable when quoteConfiguration is `finalQuoteAfterBatchCompleted`." + "$ref": "#/components/schemas/vendor-order-template-quote-configuration", + "description": "Controls when and how the vendor quote is generated." }, "customFields": { "type": "array", @@ -33360,11 +33353,8 @@ "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder, or `locationStrategy=bloodline` to also include pricing models inherited from ancestor folders." }, "quoteConfiguration": { - "$ref": "#/components/schemas/vendor-order-template-quote-configuration" - }, - "holdingDelay": { - "type": "integer", - "description": "The delay in minutes before the quote is finalized. Applicable when quoteConfiguration is `finalQuoteAfterBatchCompleted`." + "$ref": "#/components/schemas/vendor-order-template-quote-configuration", + "description": "Controls when and how the vendor quote is generated." }, "customFields": { "type": "array", @@ -33390,10 +33380,10 @@ }, "required": ["name", "languagePairs", "assignments", "pricingModelId", "quoteConfiguration"] }, - "vendor-order-template-quote-configuration": { - "title": "Vendor Order Template Quote Configuration", + "vot-quote-behaviour": { + "title": "Vendor Order Template Quote Behaviour", "type": "string", - "description": "Defines when the vendor quote is generated. For details on how each strategy behaves, see [Vendor order template strategies and their behavior](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/vendor-order-template-strategies-and-their-behavior-1170239).\n\n- `waitForAllFiles`: Wait for all files before generating the quote.\n- `perFileQuote`: Generate a quote for each file as it arrives.\n- `finalQuoteAfterBatchCompleted`: Generate the final quote once the batch is complete.\n- `quoteBeforeCustomerQuoteGeneration`: Generate the vendor quote before the customer quote.", + "description": "The strategy that determines when the vendor quote is generated. For details on how each strategy behaves, see [Vendor order template strategies and their behavior](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/vendor-order-template-strategies-and-their-behavior-1170239).\n\n- `waitForAllFiles`: Wait until all files assigned to the vendor have reached their task, up to `holdingDelay` minutes (default: 1440 = 24 hours). If all files have not arrived within the waiting period, the quote is generated for the files that did arrive; remaining files are added to the same quote when they arrive.\n- `perFileQuote`: Generate a separate quote for each file individually as it reaches the vendor task.\n- `finalQuoteAfterBatchCompleted`: Generate a single quote immediately after the Project Planning task is completed. This is the default strategy.\n- `quoteBeforeCustomerQuoteGeneration`: Generate the vendor quote before the customer quote is generated.", "enum": [ "waitForAllFiles", "perFileQuote", @@ -33401,6 +33391,23 @@ "quoteBeforeCustomerQuoteGeneration" ] }, + "vendor-order-template-quote-configuration": { + "title": "Vendor Order Template Quote Configuration", + "type": "object", + "description": "Controls when and how the vendor quote is generated.", + "properties": { + "behaviour": { + "$ref": "#/components/schemas/vot-quote-behaviour", + "description": "The strategy that determines when the vendor quote is generated." + }, + "holdingDelay": { + "type": "integer", + "minimum": 1, + "description": "The maximum time in minutes the system waits for all files to reach the vendor task before generating the quote. Only applicable when `behaviour` is `waitForAllFiles`. Defaults to 1440 (24 hours)." + } + }, + "required": ["behaviour"] + }, "vot-person-request": { "title": "Vendor Order Template Person", "description": "A user or group assigned as a manager or assignee on a vendor order template.", From 4f9e459dd467807280c64725214d82a41e273250 Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Thu, 21 May 2026 15:06:18 +0300 Subject: [PATCH 14/34] Add Conflict response to UpdateVendor --- articles/LCPublicAPI/api/Public-API.v1.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index d27ca2c..98a57a1 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20466,6 +20466,16 @@ "$ref": "#/components/headers/X-LC-TraceId" } } + }, + "409": { + "description": "Error codes:\n\n“duplicate”: duplicate value for the field mentioned in the error details.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error-response" + } + } + } } } }, From 895839a8ba5abeafd81022eb9892aaebf23b9927 Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Fri, 22 May 2026 10:36:03 +0300 Subject: [PATCH 15/34] Update Public-API.v1.json --- articles/LCPublicAPI/api/Public-API.v1.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 98a57a1..b079607 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -33598,7 +33598,7 @@ }, "quoteTemplateId": { "type": "string", - "description": "The identifier of the quote template to associate with the vendor. Use the [List Quote Templates](#/operations/ListQuoteTemplates) endpoint to retrieve available values." + "description": "The identifier of the quote template to associate with the vendor. Use the [List Quote Templates](#/operations/ListQuoteTemplates) endpoint to retrieve available values.
The quote template must be in the same folder as the vendor or above." }, "customFields": { "type": "array", @@ -33636,7 +33636,7 @@ }, "quoteTemplateId": { "type": "string", - "description": "The identifier of the quote template to associate with the vendor. Use the [List Quote Templates](#/operations/ListQuoteTemplates) endpoint to retrieve available values." + "description": "The identifier of the quote template to associate with the vendor. Use the [List Quote Templates](#/operations/ListQuoteTemplates) endpoint to retrieve available values.
The quote template must be in the same folder as the vendor or above." }, "customFields": { "type": "array", From 907a70c9fb0883acfab0275341faf46108f7d96c Mon Sep 17 00:00:00 2001 From: vblajan Date: Mon, 25 May 2026 09:41:42 +0300 Subject: [PATCH 16/34] actual users and groups are return for VOT now instead of ids --- articles/LCPublicAPI/api/Public-API.v1.json | 73 ++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index b079607..e18d573 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -33246,7 +33246,7 @@ "type": "array", "description": "Assignee and manager assignments per language pair. Contains exactly one entry for each language pair in `languagePairs`.", "items": { - "$ref": "#/components/schemas/vot-configuration" + "$ref": "#/components/schemas/vot-configuration-response" } } }, @@ -33459,6 +33459,49 @@ } ] }, + "vot-person-response": { + "title": "Vendor Order Template Person", + "description": "A user or group assigned as a manager or assignee on a vendor order template.", + "discriminator": { + "propertyName": "type" + }, + "oneOf": [ + { + "title": "User assignment", + "type": "object", + "description": "The user it is assigned to", + "properties": { + "type": { + "type": "string", + "enum": ["user"] + }, + "user": { + "type": "object", + "description": "The user", + "$ref":"#/components/schemas/user" + } + }, + "required": ["type", "user"] + }, + { + "title": "Group assignment", + "type": "object", + "description": "The group it is assigned to", + "properties": { + "type": { + "type": "string", + "enum": ["group"] + }, + "group": { + "type": "object", + "description": "The group", + "$ref":"#/components/schemas/group" + } + }, + "required": ["type", "group"] + } + ] + }, "vot-configuration": { "title": "Vendor Order Template Configuration", "type": "object", @@ -33487,6 +33530,34 @@ }, "required": ["languagePair", "managers", "assignees"] }, + "vot-configuration-response": { + "title": "Vendor Order Template Configuration", + "type": "object", + "description": "Assignee and manager assignment for a specific language pair. Every language pair listed in `languagePairs` must have exactly one corresponding entry in `assignments`.", + "properties": { + "languagePair": { + "$ref": "#/components/schemas/language-pair", + "description": "The language pair this assignment applies to." + }, + "managers": { + "type": "array", + "description": "The vendor project managers responsible for the Vendor Quote Review task for this language pair. All entries must be members of the vendor's Vendor Project Manager group.", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/vot-person-response" + } + }, + "assignees": { + "type": "array", + "description": "The vendor users who will perform the actual service tasks (e.g. Translation, Linguistic Review, DTP) for this language pair. All entries must be members of the vendor's Vendor Project Manager group.", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/vot-person-response" + } + } + }, + "required": ["languagePair", "managers", "assignees"] + }, "key-contact": { "title": "Key Contact", From 5ea5ca10481f859f772c32de234e683da167231b Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Tue, 26 May 2026 10:40:51 +0300 Subject: [PATCH 17/34] Fix invalid link on project template settings description --- articles/LCPublicAPI/api/Public-API.v1.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index fbb31b0..1d17722 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -24894,7 +24894,7 @@ "project-template-settings-response": { "title": "Project Template Settings", "type": "object", - "description": "Project Template settings. See detailed description of options on the Official Documentation page. \n\n (Not available for List Project Templates endpoint)", + "description": "Project Template settings. See detailed description of options on the Official Documentation page. \n\n (Not available for List Project Templates endpoint)", "properties": { "general": { "$ref": "#/components/schemas/project-template-general-settings-response", @@ -33009,4 +33009,4 @@ } } } -} \ No newline at end of file +} From 7af04179d583183dc5653e0e822190e5408f3954 Mon Sep 17 00:00:00 2001 From: rwsrtritean Date: Wed, 27 May 2026 12:25:57 +0300 Subject: [PATCH 18/34] Add crossFileRepetitions at project-level --- articles/LCPublicAPI/api/Public-API.v1.json | 27 ++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index fbb31b0..2afb633 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -24572,6 +24572,28 @@ } } }, + "project-batch-tasks-settings": { + "title": "Project Batch Tasks Settings", + "type": "object", + "description": "Project Batch Tasks Settings", + "properties": { + "preProcessing": { + "$ref": "#/components/schemas/project-batch-pre-processing-settings", + "description": "Pre-Processing Settings" + } + } + }, + "project-batch-pre-processing-settings": { + "title": "Project Batch Pre-Processing Settings", + "type": "object", + "properties": { + "reportCrossFileRepetition": { + "type": "boolean", + "default": true, + "description": "
default
" + } + } + }, "project-settings-response": { "title": "Project Settings", "type": "object", @@ -24583,6 +24605,9 @@ "translationMemorySettings": { "$ref": "#/components/schemas/project-translation-memory-settings-response", "description": "(Not available for List Projects endpoint)" + }, + "batchTasks": { + "$ref": "#/components/schemas/project-batch-tasks-settings" } } }, @@ -33009,4 +33034,4 @@ } } } -} \ No newline at end of file +} From 6cfe53ae0cf5d24d03126560f4376ef4ad909bdf Mon Sep 17 00:00:00 2001 From: vblajan Date: Tue, 2 Jun 2026 15:03:55 +0300 Subject: [PATCH 19/34] adding 400 to delete VOT --- articles/LCPublicAPI/api/Public-API.v1.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index e18d573..7627cb8 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -21102,6 +21102,21 @@ } } }, + "400": { + "description": "Error codes:\n* \"invalid\": Invalid input in the field 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": { From df7d4359fe5481217eb6e013f4336035d4d5172c Mon Sep 17 00:00:00 2001 From: vblajan Date: Wed, 17 Jun 2026 01:18:51 +0300 Subject: [PATCH 20/34] updating descriptions --- articles/LCPublicAPI/api/Public-API.v1.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 7627cb8..026b144 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20622,7 +20622,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response.", + "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": { @@ -20812,7 +20812,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body 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": { @@ -20921,7 +20921,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { @@ -21017,7 +21017,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body 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": { @@ -33293,7 +33293,7 @@ "properties": { "name": { "type": "string", - "description": "The name of the vendor order template.\\\nUnsupported characters in the name: `\\` `/` `:` ` *` `?` `\"` `<` `>` `|`", + "description": "The name of the vendor order template.", "minLength": 1, "maxLength": 50 }, @@ -33316,7 +33316,7 @@ }, "pricingModelId": { "type": "string", - "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder, or `locationStrategy=bloodline` to also include pricing models inherited from ancestor folders." + "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder" }, "quoteConfiguration": { "$ref": "#/components/schemas/vendor-order-template-quote-configuration", @@ -33352,7 +33352,7 @@ "properties": { "name": { "type": "string", - "description": "The name of the vendor order template. \\\nUnsupported characters in the name: `\\` `/` `:` ` *` `?` `\"` `<` `>` `|`", + "description": "The name of the vendor order template.", "minLength": 1, "maxLength": 50 }, @@ -33375,7 +33375,7 @@ }, "pricingModelId": { "type": "string", - "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder, or `locationStrategy=bloodline` to also include pricing models inherited from ancestor folders." + "description": "The identifier of the pricing model to associate with this vendor order template. Use the [List Pricing Models](#/operations/ListPricingModels) endpoint with `location` set to the vendor's folder identifier. Set `locationStrategy=location` to see only pricing models saved directly in the vendor folder." }, "quoteConfiguration": { "$ref": "#/components/schemas/vendor-order-template-quote-configuration", @@ -33403,7 +33403,7 @@ } } }, - "required": ["name", "languagePairs", "assignments", "pricingModelId", "quoteConfiguration"] + "required": ["name", "languagePairs", "assignments", "pricingModelId", "quoteConfiguration", "serviceTypes"] }, "vot-quote-behaviour": { "title": "Vendor Order Template Quote Behaviour", From 7a01afec9211b73346367f21750623d2bbf13418 Mon Sep 17 00:00:00 2001 From: vblajan Date: Mon, 22 Jun 2026 11:07:16 +0300 Subject: [PATCH 21/34] removing allowQuoteEditing and min/max on list VOT --- articles/LCPublicAPI/api/Public-API.v1.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 026b144..8cd9a62 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20622,7 +20622,7 @@ } }, "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.", + "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { @@ -33302,11 +33302,6 @@ "description": "A description of the vendor order template.", "maxLength": 1024 }, - "allowQuoteEditing": { - "type": "boolean", - "default": false, - "description": "Whether the vendor is allowed to edit the vendor quote at any time. When `false` (default), vendor project managers can only edit the quote during the Vendor Quote Review task." - }, "serviceTypes": { "type": "array", "description": "The service type identifiers to associate with this vendor order template. Use the [List Service Types](#/operations/ListTranslationServiceTypes) endpoint to retrieve available values.", From a11381db13918d45ca9413c2f196efc09bb450f1 Mon Sep 17 00:00:00 2001 From: vblajan Date: Mon, 22 Jun 2026 11:56:53 +0300 Subject: [PATCH 22/34] adding email query param for list users --- articles/LCPublicAPI/api/Public-API.v1.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index fbb31b0..d38506a 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -19094,6 +19094,9 @@ }, { "$ref": "#/components/parameters/fields" + }, + { + "$ref": "#/components/parameters/email" } ], "responses": { @@ -32742,6 +32745,14 @@ "type": "string" } }, + "email": { + "name": "email", + "in": "query", + "description": "The exact match of the email, used to filter the response list", + "schema": { + "type": "string" + } + }, "customerId": { "name": "customerId", "in": "path", From 79b95450b8de0328e9204ebcba974cc9bd1c668d Mon Sep 17 00:00:00 2001 From: vblajan Date: Mon, 22 Jun 2026 15:45:50 +0300 Subject: [PATCH 23/34] refactoring min/max 400 error message --- articles/LCPublicAPI/api/Public-API.v1.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 8cd9a62..66c298e 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20812,7 +20812,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body 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.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body parameter mentioned in the \"name\" field on the error response.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response. \n", "content": { "application/json": { "schema": { @@ -21017,7 +21017,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body 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.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body parameter mentioned in the \"name\" field on the error response.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response. \n", "content": { "application/json": { "schema": { From 8dba18e39e601d7d9f38982dccfd916aa99ffb90 Mon Sep 17 00:00:00 2001 From: vblajan Date: Mon, 22 Jun 2026 16:05:24 +0300 Subject: [PATCH 24/34] fixing email description --- articles/LCPublicAPI/api/Public-API.v1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index d38506a..7f37156 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -32748,7 +32748,7 @@ "email": { "name": "email", "in": "query", - "description": "The exact match of the email, used to filter the response list", + "description": "The exact match of the email, used to filter the response list.", "schema": { "type": "string" } From 2acb1fbaced6fc2ea90d8b61ce7d4ea0e592a05c Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 12:13:18 +0300 Subject: [PATCH 25/34] adding what's new --- articles/LCPublicAPI/api/Public-API.v1.json | 3 ++- articles/LCPublicAPI/docs/Whats-New.md | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index b67659c..e501ae1 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -26655,7 +26655,8 @@ "description": "
default
" }, "filters": { - "$ref": "#/components/schemas/translation-memory-settings-filters-response" + "$ref": "#/components/schemas/translation-memory-settings-filters-response", + "x-default-field": true }, "updateTranslationMemoryFields": { "type": "array", diff --git a/articles/LCPublicAPI/docs/Whats-New.md b/articles/LCPublicAPI/docs/Whats-New.md index 0fc9272..eaf68b8 100644 --- a/articles/LCPublicAPI/docs/Whats-New.md +++ b/articles/LCPublicAPI/docs/Whats-New.md @@ -2,6 +2,15 @@
+## 02 July 2026 +- With this release we deliver full vendor management capabilities. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendor), [List](../api/Public-API.v1-fv.html#/operations/ListVendors), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendor), [Update](../api/Public-API.v1-fv.html#/operations/UpdateVendor), and [Delete]((../api/Public-API.v1-fv.html#/operations/DeleteVendor)) vendors via the public API. +- We have also introduced vendor order template management. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendorOrderTemplate), [List](../api/Public-API.v1-fv.html#/operations/ListVendorOrderTemplates), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendorOrderTemplate), [Update]((../api/Public-API.v1-fv.html#/operations/UpdateVendorOrderTemplate)), and [Delete]((../api/Public-API.v1-fv.html#/operations/DeleteVendorOrderTemplate)) vendor order templates. +- You can now [Get](../api/Public-API.v1-fv.html#/operations/GetQuoteTemplate) and [List](../api/Public-API.v1-fv.html#/operations/ListQuoteTemplates) quote templates. +- The [List Custom Field Definitions]((../api/Public-API.v1-fv.html#/operations/ListCustomFieldDefinitions)) endpoint has been extended with a `resourceType` query parameter, allowing you to filter custom fields by resource type. +- The [Get Project](../api/Public-API.v1-fv.html#/operations/GetProject) endpoint now exposes the `reportCrossFileRepetition` field at project level. +- The [List Users](../api/Public-API.v1-fv.html#/operations/ListUsers) endpoint now supports filtering by email address. +- We fixed various bugs. + ## 29 April 2026 - Tasks can now be [accepted](../api/Public-API.v1-fv.html#/operations/AcceptTask) on behalf of a group. - We've exposed task type configuration definitions and values across Get and List endpoints for [Projects](../api/Public-API.v1-fv.html#/operations/GetProject), [Project Templates](../api/Public-API.v1-fv.html#/operations/GetProjectTemplate), [Workflows](../api/Public-API.v1-fv.html#/operations/GetWorkflow), [Tasks](../api/Public-API.v1-fv.html#/operations/GetTask), and [Task Types](../api/Public-API.v1-fv.html#/operations/GetTaskType). From b066a2e110d1fdea42a2df1cc101f0eda14e2ad6 Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 12:16:27 +0300 Subject: [PATCH 26/34] fixing what's new --- articles/LCPublicAPI/docs/Whats-New.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/articles/LCPublicAPI/docs/Whats-New.md b/articles/LCPublicAPI/docs/Whats-New.md index eaf68b8..7c36a17 100644 --- a/articles/LCPublicAPI/docs/Whats-New.md +++ b/articles/LCPublicAPI/docs/Whats-New.md @@ -3,10 +3,10 @@
## 02 July 2026 -- With this release we deliver full vendor management capabilities. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendor), [List](../api/Public-API.v1-fv.html#/operations/ListVendors), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendor), [Update](../api/Public-API.v1-fv.html#/operations/UpdateVendor), and [Delete]((../api/Public-API.v1-fv.html#/operations/DeleteVendor)) vendors via the public API. -- We have also introduced vendor order template management. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendorOrderTemplate), [List](../api/Public-API.v1-fv.html#/operations/ListVendorOrderTemplates), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendorOrderTemplate), [Update]((../api/Public-API.v1-fv.html#/operations/UpdateVendorOrderTemplate)), and [Delete]((../api/Public-API.v1-fv.html#/operations/DeleteVendorOrderTemplate)) vendor order templates. +- With this release we deliver full vendor management capabilities. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendor), [List](../api/Public-API.v1-fv.html#/operations/ListVendors), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendor), [Update](../api/Public-API.v1-fv.html#/operations/UpdateVendor), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteVendor) vendors via the public API. +- We have also introduced vendor order template management. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendorOrderTemplate), [List](../api/Public-API.v1-fv.html#/operations/ListVendorOrderTemplates), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendorOrderTemplate), [Update](../api/Public-API.v1-fv.html#/operations/UpdateVendorOrderTemplate), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteVendorOrderTemplate) vendor order templates. - You can now [Get](../api/Public-API.v1-fv.html#/operations/GetQuoteTemplate) and [List](../api/Public-API.v1-fv.html#/operations/ListQuoteTemplates) quote templates. -- The [List Custom Field Definitions]((../api/Public-API.v1-fv.html#/operations/ListCustomFieldDefinitions)) endpoint has been extended with a `resourceType` query parameter, allowing you to filter custom fields by resource type. +- The [List Custom Field Definitions](../api/Public-API.v1-fv.html#/operations/ListCustomFieldDefinitions) endpoint has been extended with a `resourceType` query parameter, allowing you to filter custom fields by resource type. - The [Get Project](../api/Public-API.v1-fv.html#/operations/GetProject) endpoint now exposes the `reportCrossFileRepetition` field at project level. - The [List Users](../api/Public-API.v1-fv.html#/operations/ListUsers) endpoint now supports filtering by email address. - We fixed various bugs. From 53c99323d829c0c5ca48cdeed15f34b317f3b62a Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 12:20:46 +0300 Subject: [PATCH 27/34] fixing what's new --- articles/LCPublicAPI/docs/Whats-New.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/docs/Whats-New.md b/articles/LCPublicAPI/docs/Whats-New.md index 7c36a17..73db615 100644 --- a/articles/LCPublicAPI/docs/Whats-New.md +++ b/articles/LCPublicAPI/docs/Whats-New.md @@ -6,7 +6,7 @@ - With this release we deliver full vendor management capabilities. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendor), [List](../api/Public-API.v1-fv.html#/operations/ListVendors), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendor), [Update](../api/Public-API.v1-fv.html#/operations/UpdateVendor), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteVendor) vendors via the public API. - We have also introduced vendor order template management. You can now [Get](../api/Public-API.v1-fv.html#/operations/GetVendorOrderTemplate), [List](../api/Public-API.v1-fv.html#/operations/ListVendorOrderTemplates), [Create](../api/Public-API.v1-fv.html#/operations/CreateVendorOrderTemplate), [Update](../api/Public-API.v1-fv.html#/operations/UpdateVendorOrderTemplate), and [Delete](../api/Public-API.v1-fv.html#/operations/DeleteVendorOrderTemplate) vendor order templates. - You can now [Get](../api/Public-API.v1-fv.html#/operations/GetQuoteTemplate) and [List](../api/Public-API.v1-fv.html#/operations/ListQuoteTemplates) quote templates. -- The [List Custom Field Definitions](../api/Public-API.v1-fv.html#/operations/ListCustomFieldDefinitions) endpoint has been extended with a `resourceType` query parameter, allowing you to filter custom fields by resource type. +- The [List Custom Field Definitions](../api/Public-API.v1-fv.html#/operations/ListCustomFields) endpoint has been extended with a `resourceType` query parameter, allowing you to filter custom fields by resource type. - The [Get Project](../api/Public-API.v1-fv.html#/operations/GetProject) endpoint now exposes the `reportCrossFileRepetition` field at project level. - The [List Users](../api/Public-API.v1-fv.html#/operations/ListUsers) endpoint now supports filtering by email address. - We fixed various bugs. From 5da8a04bf5019184ae74678c6878b34f57e479cb Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 12:25:26 +0300 Subject: [PATCH 28/34] fixing default field --- articles/LCPublicAPI/api/Public-API.v1.json | 1 + 1 file changed, 1 insertion(+) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index e501ae1..5d0a395 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -26656,6 +26656,7 @@ }, "filters": { "$ref": "#/components/schemas/translation-memory-settings-filters-response", + "description": "
default
", "x-default-field": true }, "updateTranslationMemoryFields": { From 05d000ed37d774a846949d56db2627430e345d78 Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 12:28:21 +0300 Subject: [PATCH 29/34] fixing default field --- articles/LCPublicAPI/api/Public-API.v1.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 5d0a395..c01d24d 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -26656,8 +26656,7 @@ }, "filters": { "$ref": "#/components/schemas/translation-memory-settings-filters-response", - "description": "
default
", - "x-default-field": true + "description": "
default
" }, "updateTranslationMemoryFields": { "type": "array", From c71f9db7aad29bac5b35df5591d639fa48da1eeb Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 12:35:01 +0300 Subject: [PATCH 30/34] fixing default field --- articles/LCPublicAPI/api/Public-API.v1.json | 1 - 1 file changed, 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index c01d24d..c2cd3ff 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -32903,7 +32903,6 @@ "translation-memory-settings-filters-response": { "type": "object", "title": "Translation Memory Filters", - "description": "Translation Memory filter settings.", "properties": { "hardFilter": { "$ref": "#/components/schemas/translation-memory-settings-hard-filter-response", From a554b4cacc35e1add11609ef8d67409375146b1c Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 16:30:16 +0300 Subject: [PATCH 31/34] updating error codes --- articles/LCPublicAPI/api/Public-API.v1.json | 51 ++++++--------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index c2cd3ff..a79c0f9 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20120,58 +20120,33 @@ } }, "400": { - "description": "Bad request. The request body is invalid or a required field is missing.", - "headers": { - "X-LC-TraceId": { - "$ref": "#/components/headers/X-LC-TraceId" - } - }, + "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response, or provisioned roles cannot be updated.\n* \"empty\": Empty input for the \"roleId\" path parameter variable.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error-response" - }, - "examples": { - "missingRequiredField": { - "summary": "Missing required field", - "value": { - "message": "The 'name' field is required.", - "errorCode": "MISSING_REQUIRED_FIELD", - "details": [ - { - "name": "name", - "code": "REQUIRED", - "value": null - } - ] - } - } } } - } - }, - "401": { - "description": "Unauthorized. Authentication credentials are missing or invalid.", + }, "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" - }, - "examples": { - "unauthorized": { - "summary": "Missing or invalid credentials", - "value": { - "message": "Authentication credentials are missing or invalid.", - "errorCode": "UNAUTHORIZED" - } - } } } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } } }, "403": { @@ -20411,7 +20386,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { @@ -20471,7 +20446,7 @@ } }, "409": { - "description": "Error codes:\n\n“duplicate”: duplicate value for the field mentioned in the error details.", + "description": "Error codes:\n* \"duplicate\": duplicate value for the field mentioned in the error details.", "content": { "application/json": { "schema": { From fc80f0eaa2281c1ea6fa9b769ae8d75dc688c2b0 Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 16:46:31 +0300 Subject: [PATCH 32/34] updating error codes --- articles/LCPublicAPI/api/Public-API.v1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index a79c0f9..c371786 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20120,7 +20120,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response, or provisioned roles cannot be updated.\n* \"empty\": Empty input for the \"roleId\" path parameter variable.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response, or provisioned roles cannot be updated.\n* \"empty\": Empty input for the \"name\" field on the error response.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { From d0bc2bf42f538e4afa2d6b626c4fa17b1580c7d5 Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 16:47:54 +0300 Subject: [PATCH 33/34] updating error codes --- articles/LCPublicAPI/api/Public-API.v1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index c371786..9266ba5 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20120,7 +20120,7 @@ } }, "400": { - "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response, or provisioned roles cannot be updated.\n* \"empty\": Empty input for the \"name\" field on the error response.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.", + "description": "Error codes:\n* \"invalid\": Invalid input in the field mentioned in the \"name\" field on the error response.\n* \"empty\": Empty input in the body parameter mentioned in the \"name\" field on the error response.\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.", "content": { "application/json": { "schema": { From 49ff9ab9ecc9028fcea8593471216cb5ece4cac3 Mon Sep 17 00:00:00 2001 From: vblajan_RWSGroup Date: Thu, 2 Jul 2026 19:29:30 +0300 Subject: [PATCH 34/34] updating error codes --- articles/LCPublicAPI/api/Public-API.v1.json | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json index 9266ba5..8c89a52 100644 --- a/articles/LCPublicAPI/api/Public-API.v1.json +++ b/articles/LCPublicAPI/api/Public-API.v1.json @@ -20150,27 +20150,18 @@ } }, "403": { - "description": "Forbidden. The authenticated user does not have permission to create vendors.", - "headers": { - "X-LC-TraceId": { - "$ref": "#/components/headers/X-LC-TraceId" - } - }, + "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to create vendor order templates.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error-response" - }, - "examples": { - "forbidden": { - "summary": "Insufficient permissions", - "value": { - "message": "You do not have permission to create vendors.", - "errorCode": "FORBIDDEN" - } - } } } + }, + "headers": { + "X-LC-TraceId": { + "$ref": "#/components/headers/X-LC-TraceId" + } } }, "409": {