+ You may prefer viewing the API documentation in a full-screen.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/articles/Extensibility/api/bak/redocly.yaml.bak b/articles/Extensibility/api/bak/redocly.yaml.bak
new file mode 100644
index 0000000..c20e1d9
--- /dev/null
+++ b/articles/Extensibility/api/bak/redocly.yaml.bak
@@ -0,0 +1,6 @@
+theme:
+ sidebar:
+ width: "260px"
+ openapi:
+ showObjectSchemaExamples: true
+expandResponses: 200,201,202
\ No newline at end of file
diff --git a/articles/Extensibility/docs/Whats-New.md b/articles/Extensibility/docs/Whats-New.md
new file mode 100644
index 0000000..48a70bf
--- /dev/null
+++ b/articles/Extensibility/docs/Whats-New.md
@@ -0,0 +1,62 @@
+# What's New
+
+## July 2025
+
+- We've expanded support for custom tabs to additional [locations](../docs/development/UI-App-custom-elements-locations.md). You can now use them in the following views:
+ - tasks list
+ - orders list
+ - projects list
+ - reports list
+
+## April 2025
+
+- To facilitate the management of large translation requests, batching support has been added for MT provider apps. This update includes the introduction of a new parameter, `extensions.configuration.segmentBatchSize`, which can be added to your [descriptor](../api/Extensibility-API.v1-fv.html#/operations/descriptor), along with a new error response featuring status code [413](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/413) on the translation [endpoint](../api/Extensibility-API.v1-fv.html#/operations/MachineTranslationProviderTranslateBCM).
+- A new option has been introduced on the app registration [page](../docs/appManagement/Registering.md), allowing users to designate their app for development purposes by selecting a checkbox.
+
+## December 2024
+- We have officially rebranded from RWS Language Cloud API to Trados Cloud Platform API. All references to our previous brand name will now reflect our new identity, Trados.
+
+## November 2024
+- This release introduces support for building apps that work across multiple regions. Existing apps that are already developed and in use will continue to function but will be restricted to the EU region until they are updated.
+- To help you make the required changes for multi-region support, we've provided a new guide, which you can access [here](../docs/development/Multi-Region.md).
+- Updated blueprints and sample projects are also available to get you started.
+
+## October 2024
+- With this release we deliver a new extension point designed to allow developers to extend and customize the UI elements of our platform. This extension point is being released as BETA. For more details see this [page](../docs/development/UI-App-development-guide.md).
+- We unified the Preview documentation pages into a single comprehensive [page](../docs/development/Preview-App-development-guide.md). We have introduced a new version, known as V2, of our Preview APIs.
+- We extended the information available under Verification Provider [page](../docs/development/Verification-App-development-guide.md). We have introduced a new version, known as V2, of our Verification APIs.
+- You can now add comments to [Submit Task Outcome](../api/Extensibility-API.v1-fv.html#/operations/automatiktasktypecallback) for the automatic task extensions.
+
+## June 2024
+- With this release, we have migrated from the Add-Ons concept to Apps. This significant first step sets the stage for expanding this concept to multiple areas that facilitate integrations.
+- Registered Add-Ons are backward compatible with the new Apps and can be used as is.
+- A major improvement is that an App can now declare the list of webhooks it needs in the descriptor and listen for webhook notifications.
+- The migration guide from an Add-On to an App is available [here](../docs/development/Add-On-To-App-Migration.md).
+
+## October 2023
+- We added support for dropdown lists to the app configuration. You can now define a set of values in the descriptor's `configurations` section as an array of strings via the `options` field. The user will see these values in a dropdown menu in the edit configuration panel.
+
+
+## August 2023
+- With this release we introduced a folder identifier where the translation engines will be added. This can be used to filter the [engines](../api/Extensibility-API.v1-fv.html#/operations/GetMachineTranslationProviderEngines) by folder.
+- We also added recommendations on [best practices](../docs/development/Tehnical-Requirements-And-Best-Practices.md) for a secure application development.
+- We made additional smaller improvements and corrections to our documentation.
+
+## April 2023
+- We added details for the `engineId`, `projectId`, `sourceFileId` and `targetFileId` parameters of the [Translate](../api/Extensibility-API.v1-fv.html#/operations/MachineTranslationProviderTranslateBCM) endpoint.
+- We updated the [Registering the app](../docs/appManagement/Registering.md) page.
+
+
+## February 2023
+- We introduced requirements that become mandatory for all future apps, namely: acceptance of Terms & Conditions and the Privacy Policy, along with the provisioning of the app's release notes, documentation link and the developer's contact details, starting with descriptor version `1.3`.
+- We published newer blueprints for both Java and .NET.
+- We made available headers for developers to implement custom functionality based on the current version of the installed apps: `appVersion`, `extensionPointVersion` and `extensionId`.
+- Added `projectId`, `sourceFileId` and `targetFileId` on the [translate](../api/Extensibility-API.v1-fv.html#/operations/MachineTranslationProviderTranslateBCM) request.
+
+## January 2023
+- We published new pages with our recommendations for implementing Dynamic Preview.
+
+## December 2022
+- We made available app samples for both .NET and Java in GitHub, to allow integrators to get familiar with our framework extension possibilities.
+- We published a new page with [Technical Requirements And Best Practices](./development/Tehnical-Requirements-And-Best-Practices.md).
+
diff --git a/articles/Extensibility/docs/appManagement/Approvals.md b/articles/Extensibility/docs/appManagement/Approvals.md
new file mode 100644
index 0000000..a345ff9
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Approvals.md
@@ -0,0 +1,58 @@
+---
+stoplight-id: f0cb88dbb2089
+---
+
+# Approvals and Support Communication
+
+## Approval Process
+
+All apps have to go through the **Approval Process** in order to achieve certain results. The **Approval Process** is our way of validating that your apps comply with the RWS Trados policies. We have a dedicated **RWS Support** team responsible for the apps validations. The support team has full rights over the registered apps.
+
+After having registered your app in Trados, you will gain access to the comments panel within the app's details page. Here you can leave comments or questions for our **RWS Support** team. The replies received from the Support team members will be displayed in the same panel.
+
+
+
+
+> [!NOTE]
+> This is not a live chat, and you should refresh to check for replies. However, you don't need to keep an eye on it always, as we have email notifications in place for both roles: the developer and the support team member.
+
+The comments panel is also used to track the **approval requests**. These requests can only be triggered by the app's developer in one of the following scenarios:
+1. **Publish the app**. See more details [here](./Publishing.md).
+2. **Publish a new version** with major changes. Find more details [here](./Updating.md).
+3. **Unpublish the app** when installed instances exist publicly. Find more details [here](./Retiring.md).
+
+Opening a request triggers the following:
+1. The app will be marked with the *Pending approval* status.
+2. The comments log will be updated with the requested change (Publish/Update/Unpublish) along with the associated comment.
+3. The support team will be notified to begin the review of your request.
+
+During the review phase, our support team will install and test the app. They can also ask for changes via the comments panel. For instance, your app might not have a suitable name or description before going public so they might advise you to change it.
+
+After the support team is happy with your request, most likely they are going to approve it. However, they can also reject the request.
+
+As a developer, you can cancel the request at any time.
+
+The **Approval Process** ends with one of the following:
+1. The request is **approved** or **rejected** by the RWS Support team.
+2. The request is **canceled** by the developer.
+
+> [!NOTE]
+> During the Approval Process you can still use your app as usual.
+
+## App Suspended
+
+The support team can also **suspend** an app if they notice a weird behavior. An example would be the case when your app generates a large amount of errors.
+
+
+
+
+Suspending an app will result in:
+1. Withdrawal from the **RWS AppStore** , if it was published.
+2. Preventing the public consumers from using the app anymore. The developer and support users can still install and use it in order to debug the issues.
+
+While the app is suspended, the developer can communicate with the support team in order to sort out the issues. When the problem is fixed, the app is going to be unsuspended by the support team and it will be again publicly available to consumers.
+
diff --git a/articles/Extensibility/docs/appManagement/Foreword.md b/articles/Extensibility/docs/appManagement/Foreword.md
new file mode 100644
index 0000000..b76ebe5
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Foreword.md
@@ -0,0 +1,18 @@
+---
+stoplight-id: 015bfda96d1a6
+---
+
+# Foreword
+
+This section is about managing apps in RWS Trados and it is dedicated to developers.
+
+Most of the features presented in these guides are **subscription-bound**, meaning that, depending on your account subscription, you may or may not benefit from them.
+
+The management of the apps is only available to the account **administrators**.
+
+Terms used throughout these guides include:
+1. Developer (tenant) - the tenant from which the app was registered.
+2. Consumers - the tenants where the app was installed.
+3. RWS Support - an RWS Trados internal support team dedicated to helping out with the apps management processes.
+
+
diff --git a/articles/Extensibility/docs/appManagement/Installing.md b/articles/Extensibility/docs/appManagement/Installing.md
new file mode 100644
index 0000000..f8ee9d1
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Installing.md
@@ -0,0 +1,29 @@
+---
+stoplight-id: hspobp79yp423
+---
+
+
+# Installing the App
+
+After the app is successfully registered, you can proceed to install it. The installation is tenant-based, which means that all users in the tenant will be able to use the app.
+
+To install the app you need to:
+1. Find your app in the **My Apps** tab and select the **Install** button.
+2. When prompted with a form containing placeholders for the account settings details, remember that these are the configuration settings exposed through the [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor). All mandatory fields will be marked with '*'.
+3. Pay attention if the app advertises any [scopes](../../docs/development/Authentication-Overview.md), you will be notified by the installation form.
+
+
+
+
+4. Fill in the fields and select **Complete**.
+5. If the app supports validation of settings, it will be automatically performed at installation time via the [validation endpoint](../../api/Extensibility-API.v1-fv.html#/operations/ValidateConfigurationSettings).
+
+
+
+
+> [!NOTE]
+> The configuration settings can be modified anytime by clicking the **Edit App Configuration** button.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/appManagement/Publishing.md b/articles/Extensibility/docs/appManagement/Publishing.md
new file mode 100644
index 0000000..37eb698
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Publishing.md
@@ -0,0 +1,24 @@
+---
+stoplight-id: 220f6cf2449fe
+---
+
+# Publishing the App
+
+The publish operation makes your app publicly available in the **RWS AppStore**, allowing other tenants to install and use it.
+
+After registering, it is recommended that you install and test your app before publishing it to the store.
+
+To publish your app you need to:
+1. Test that it works as expected.
+2. Select your app from the **My Apps** tab and click the **Publish** button. A comment box appears, this is where you can leave a message for the RWS support team (not mandatory).
+3. Clicking **Publish** again will trigger the **Approval Process**.
+4. The app will get in a pending state until someone from the support team approves or rejects the publish request. It shouldn't take long to get a response, as the support team is automatically notified when there are new requests.
+5. After the support team approves your request, the app becomes publicly available in the **RWS AppStore**.
+
+
+
+
+> [!NOTE]
+> Publishing a private app will always publish its latest version.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/appManagement/Registering.md b/articles/Extensibility/docs/appManagement/Registering.md
new file mode 100644
index 0000000..7c233c8
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Registering.md
@@ -0,0 +1,36 @@
+---
+stoplight-id: 7295d1d88211f
+---
+
+# Registering the App
+
+Registration is the first step in integrating your app into the Trados platform.
+
+To register a new app, you need to:
+1. After you log in, navigate to the **RWS AppStore** from the user icon menu.
+
+
+
+
+2. Go to **My Apps** tab, select **New App** and provide the following details:
+ - the *Development Name* and *Development Description*, which will only be visible to the developer tenant (do not confuse them with the name and the description of the app descriptor)
+ - the *App Descriptor URL* is the app's [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) address. This must be a secure URL.
+ - the *Development App* checkbox represents whether your app is intended for development and testing purposes. Development apps cannot be published.
+3. After filling in these fields, finish the registration by clicking the **Register** button.
+
+
+
+
+Common issues that may occur during registration include:
+
+
+Issue | Fix suggestion
+---------|-----------
+Invalid Descriptor URL | Make sure the provided URL is formed correctly and it points to your descriptor endpoint.
+ Incorrect `BaseUrl` | If you are using one of our blueprints, check the blueprint guides ([.NET](../development/blueprints/Dot-Net-Blueprint.md#appsettingsjson) or [Java](../development/blueprints/Java-Blueprint.md#applicationyml)) on how to set up the `BaseUrl` field.
+ Already registered | This would normally occur if you already registered your app. If so, you can [unregister](./Retiring.md) the old version and perform the registration once again.
+ Descriptor does not comply with the [contract](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) | Make sure the required fields are returned and the allowed values correspond to the ones from the contract.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/appManagement/Retiring.md b/articles/Extensibility/docs/appManagement/Retiring.md
new file mode 100644
index 0000000..6d80b95
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Retiring.md
@@ -0,0 +1,50 @@
+---
+stoplight-id: ttmhuovvyy6rs
+---
+
+
+# Retiring the App
+
+Before retiring an app, you must first go through the following steps:
+1. Unpublish the app
+2. Unregister the app
+
+## Unpublish the App
+
+First, if your app is published, you will need to withdraw it from the **RWS AppStore**. To unpublish the app you need to:
+1. Select your app from the **My Apps** tab and click the **Unpublish** button.
+2. A comment box will appear, where you can leave a message for the RWS Support team (optional). You are also warned that unpublishing the app will cause all the public consumers to lose their installed instances (except for the developer's instance and the shared ones).
+3. If you choose to continue, the app will either:
+ - Enter the **Approval Process**, because there were public installations found. In this case, all the consumers will be notified and advised to uninstall the app. Usually, there is a grace period of **30 days**. When the grace period ends, if there are still any active instances, they will be automatically removed when the support team approves the request.
+ - Become **private** instantly, because there were no public installations found.
+
+
+
+
+## Unregister the App
+
+After the app becomes private, the only active instances left should be the developer's one and the shared ones (if the app had been previously shared). You can either uninstall them manually or unregister the app directly. The second option will automatically uninstall the instances left, before removing the app.
+
+> [!NOTE]
+> An app can only be deleted when there are no other installed instances.
+
+To unregister the app, you need to:
+1. Select your app from the **My Apps** tab and click the **Delete** button.
+2. You will be asked if you want to automatically uninstall the shared instances.
+3. If you choose to do so, Trados will attempt to remove the remaining instances (if any are found) and eventually delete the app definitively. This is done asynchronously, so you will need to refresh the page to see the changes.
+ - If the unregister process fails due to app communication errors, the app will be marked with the *Delete failed* status and you will have the possibility to force the deletion.
+ - The **Force Delete** button will tell Trados to ignore the communication errors and proceed with the app removal.
+
+
+
+
+**Force deleting example**
+
+
+
\ No newline at end of file
diff --git a/articles/Extensibility/docs/appManagement/Sharing.md b/articles/Extensibility/docs/appManagement/Sharing.md
new file mode 100644
index 0000000..30ade2e
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Sharing.md
@@ -0,0 +1,22 @@
+---
+stoplight-id: ruuiy7dsn27on
+---
+
+# Sharing the App
+By default, a newly registered app is private, meaning that only the developer tenant has access to it. However, you can share your app with other tenants even if it hasn't been published yet.
+
+A private version of a public app can also be shared prior to its publication. Please note that once the app is published, the Share button will no longer be visible.
+
+To share the app you need to:
+1. Test that it works as expected.
+2. Select your app from the **My Apps** tab and click the **Share** button.
+3. You will receive a public link which you can share with other tenants. The link expires after **7 days**.
+4. The link's recipient will then be able to access and install the app.
+
+
+
+
+> [!NOTE]
+> The number of sharing links and shared installed instances is restricted by the sharing benefit quota from your account subscription.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/appManagement/Updating.md b/articles/Extensibility/docs/appManagement/Updating.md
new file mode 100644
index 0000000..2a0ea73
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Updating.md
@@ -0,0 +1,42 @@
+---
+stoplight-id: b7cdff09ad767
+---
+
+# Updating the App
+
+There might be times when you need to make changes to your app. Whether you want to fix bugs, correct flaws, or add new functionality, the changes should eventually reach your registered app instance. That's why RWS Trados supports app versioning.
+
+To update the app you need to:
+1. Increment the `version` field in the app's [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor), as Trados relies on it to detect the newer versions.
+2. Wait for Trados to detect the new version. It could take up to 2 minutes to detect it.
+3. You should also receive an email notification informing you that there's a new app version available.
+4. Check the new version on the app details page. If you don't see it, please contact our support team.
+5. At this point you should be able to install or update to the latest version.
+
+
+
+
+## Publishing a new version
+
+For an app that is already published, you may also choose to publish the new version.
+
+To publish an update you need to:
+1. Test that your new version works as expected.
+2. Select your app from the **My Apps** tab and click the **Publish update** button. This could result in one of the following:
+ 1. The app will enter the **Approval Process**, if the new version's descriptor contains **major changes**. The following changes are considered major:
+ - BaseURL
+ - Scopes
+ - Standard endpoints
+ - Extensions
+ - Configuration settings
+ 2. The app's new version will be instantly **published** if none of the above fields are affected by the changes.
+3. Finally, the app consumers will be notified that there is a new version available to which they can upgrade.
+
+
+
+
+
diff --git a/articles/Extensibility/docs/appManagement/Validating.md b/articles/Extensibility/docs/appManagement/Validating.md
new file mode 100644
index 0000000..aa9c455
--- /dev/null
+++ b/articles/Extensibility/docs/appManagement/Validating.md
@@ -0,0 +1,45 @@
+---
+stoplight-id: aacd1775aae19
+---
+
+# Validating Account Settings
+
+As we have already seen, most apps require some configuration settings in order to serve their purpose. For example, the machine translation apps such as Google and DeepL may need some credentials to communicate with the 3rd party MT provider.
+
+## Validations
+
+There are a couple of places where the settings are validated automatically or where you can perform the validation yourself.
+
+### Installation
+
+The first validation is done when installing the app. If the settings are correct, the installation will complete without any warning messages. Otherwise, if you provide incorrect settings, a warning message will notify you and the invalid field(s) will be highlighted in red (if the app provides such granular information).
+The installation completes eventually, but your instance will be marked as *Not configured* and you won't be able to use it.
+
+
+
+
+### Edit Configuration
+
+Once the app has been installed you can edit the settings at any time from the **Edit App configuration** window. Clicking the **Save** button will also trigger the validation of the newer settings.
+
+
+
+
+Another option is to perform the validation on demand by clicking the **Validate saved configuration** button. As the name suggests, **the validation is done against the saved settings**. This means that you would first have to save the settings before clicking the validation button.
+
+
+
+
+### Automatic Validation
+
+Some settings, especially credentials may expire after a while. The purpose of the automatic validation is to detect the instances with expired settings and mark them accordingly. A background job runs daily and checks all the installed instances. When a validation fails, that particular instance will be marked as *Not configured*, making it unusable anymore.
+
+
+
+Therefore, if your app has suddenly stopped working, it might be due to expired settings. To fix this state, you can provide new settings by using the **Edit App configuration** functionality.
diff --git a/articles/Extensibility/docs/consumer/Automatic-Task-App-consumer-guide.md b/articles/Extensibility/docs/consumer/Automatic-Task-App-consumer-guide.md
new file mode 100644
index 0000000..15453bd
--- /dev/null
+++ b/articles/Extensibility/docs/consumer/Automatic-Task-App-consumer-guide.md
@@ -0,0 +1,88 @@
+---
+tags: [Consumer]
+stoplight-id: xmvf6rjkuqma6
+---
+
+
+# Automatic Task
+
+Automatic Task apps offer the possibility to add custom functionality within a project's workflow.
+
+Examples of automatic tasks:
+- send notifications about the project
+- update project details
+- copy the project files to a shared location
+
+## Installing the App
+
+To benefit from the app's functionality, you first have to install it on your account. You can install an app by following these steps:
+
+1. Navigate to **RWS AppStore** where you can find all the public apps.
+
+ 
+
+2. Select the desired app.
+3. Read the app's documentation by accessing the documentation link.
+4. Some Automatic Task apps might also require access to your account resources. The installation window will advertise the requested permissions.
+
+ 
+
+4. Click the **Install** button and fill in the configuration settings. Only the settings marked with '*' are required.
+5. After you have filled in the settings and acknowledged the requested access click **Complete**.
+
+ 
+
+
+Some apps also support validation of the configured settings. The first validation is automatically performed at installation time. If the provided settings are invalid, you will be prompted with an error message letting you know that the settings are incorrect.
+
+> [!NOTE]
+> The configuration settings can be modified at any time by clicking the **Edit App Configuration** button.
+
+## Using the Automatic Task App
+
+Once you have the app installed on your account, anyone from the account will be able to use it. However, only the account admins have the rights to manage the apps.
+
+An app of this type could expose one or more automated tasks that are available to integrate within your workflow templates.
+
+### Creating a New Workflow Template
+
+To use the app's automatic task(s) within your projects, first, you will need a **Workflow Template** with the task(s) provided by the app. To create a template, follow these steps:
+1. Navigate to **Resources** -> **Workflows** -> **Workflow Templates** and click **New Workflow Template**.
+2. Fill in the required fields and start building your custom workflow template.
+3. Add the app's automatic task.
+
+ 
+
+4. Configure the task.
+
+ 
+
+5. Click **Save configurations** and complete your template.
+6. When finished, click **Save & Activate**.
+
+> [!NOTE]
+> The above illustrations are based on a template draft. You may need to create the new template from scratch.
+
+### Creating a New Workflow
+
+The workflow template created at the previous step must be assigned to a **Workflow**. To create a new one, follow these steps:
+1. Navigate to **Resources** > **Workflows** > **Workflows** and click **New Workflow**.
+2. Fill in the required fields.
+3. Select your newly created template from the dropdown list.
+4. Check the tasks in the workflow and configure them.
+5. Click **Create**.
+
+
+
+### Using the App's Automatic Task within a Project
+
+To create a **Project** with the new resources, you can either have them in a **Project Template** or select them at the project creation time. In this example we will go with the first option:
+
+
+
+After creating the project, you can track the progress in the **Task History** tab. Here you can check the app's task status. Depending on the complexity of the task it may take some time to finish.
+
+
+
+> [!NOTE]
+> The app task illustrated above is just a mockup task that does not have a real purpose.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/consumer/Dynamic-Preview-guide.md b/articles/Extensibility/docs/consumer/Dynamic-Preview-guide.md
new file mode 100644
index 0000000..4f7cae2
--- /dev/null
+++ b/articles/Extensibility/docs/consumer/Dynamic-Preview-guide.md
@@ -0,0 +1,38 @@
+---
+stoplight-id: j6yjjz5b5gtv5
+---
+
+# Dynamic Preview
+Dynamic Preview apps offer the ability to render previews dynamically based on selections the user makes in the preview page.
+
+## Installing the App
+
+To benefit from the app's functionality first you have to install it on your account. You can install an app by following these steps:
+
+1. Navigate to **RWS AppStore** where you can find all the public apps.
+
+ 
+
+2. Select the desired app.
+3. Read the app's documentation by accessing the documentation link.
+4. Click the **Install** button.
+5. When finished, select **Complete**.
+
+
+
+## Setting up the Preview
+
+1. Under your Trados Enterprise account, set up a new FileType.
+2. Select a file type which is supported by your app. In this case, we chose the XML 2: Any XML FileType
+3. Follow the steps shown below to add the Dynamic Preview Type to your FileType Preview Settings.
+
+
+
+4. Create a project and add your file which you will be previewing to it.
+5. Open the Online Editor and select the Preview Type as shown below:
+
+
+
+6. In the rendered preview, change the dynamic page which is loaded as shown in the example below. Note: The mechanism for changing the content dynamically will depend on the app implementation and preview rendering.
+
+
diff --git a/articles/Extensibility/docs/consumer/MT-App-consumer-guide.md b/articles/Extensibility/docs/consumer/MT-App-consumer-guide.md
new file mode 100644
index 0000000..958feeb
--- /dev/null
+++ b/articles/Extensibility/docs/consumer/MT-App-consumer-guide.md
@@ -0,0 +1,74 @@
+---
+tags: [Consumer]
+stoplight-id: aq5ppczlrfiwc
+---
+
+
+# Machine Translation
+
+Machine Translation apps offer the possibility to use external machine translation providers within the Trados platform.
+
+## Installing the App
+
+To benefit from the app's functionality first you have to install it on your account. You can install an app by following these steps:
+
+1. Navigate to **RWS AppStore** where you can find all the public apps.
+
+ 
+
+2. Select the desired app.
+3. Read the app's documentation by accessing the documentation link.
+4. Click the **Install** button and fill in the configuration settings. Only the settings marked with '*' are required.
+5. When you are done, click **Complete**.
+
+ 
+
+
+Some apps also support validation of the configured settings. The first validation is automatically performed at installation time. If the provided settings are invalid, you will be prompted with an error message letting you know that the settings are incorrect.
+
+> [!NOTE]
+> The configuration settings can be modified at any time by clicking the **Edit App Configuration** button.
+
+## Using the Machine Translation App
+
+Once you have the app installed on your account, anyone from the account will be able to use it. However, only the account administrators have the permissions to manage the apps.
+
+### Creating a new Translation Engine
+
+To use the MT app within your projects, you will need a Translation Engine with the engines provided by the app. To create one follow these steps:
+1. Navigate to **Resources** -> expand **Linguistic Resources** -> **Translation Engines** and click **New Translation Engine**.
+2. Fill in the required fields.
+3. Select the desired language pair(s).
+4. Under the Machine Translation section click **Add Machine Translation Model**.
+5. The app should provide the supported models for the requested language pair(s).
+6. Select the models and click **Create**.
+
+
+
+### Creating a new Workflow
+
+You will need a workflow that contains the **Machine Translation** step and has at least one of your Translation Engine's language pairs. To create a new one follow these steps:
+1. Navigate to **Resources** > **Workflows** > **Workflows** and click **New Workflow**.
+2. Fill in the required fields.
+3. Select the language pair(s).
+4. Select a template with Machine Translation steps (for example, one could be **Simple Translation**).
+5. Check the tasks in the workflow and configure them.
+6. Click **Create**.
+
+
+
+### Translating with the MT App
+
+To create a **Project** with the new resources you can either have them in a **Project Template** or select them at the project creation time. In this example we'll go with the first option:
+
+
+
+> [!NOTE]
+> The project language pair also has to match the ones from the engine and the workflow.
+
+Once the project reaches the **Translation** step, you can open it in **Online Editor** and check the translated segments from the MT app. You also have the possibility to search for Lookups in order to receive alternative translations.
+
+
+
+> [!NOTE]
+> The translations illustrated above are just some demonstrative mock-ups.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Add-On-To-App-Migration.md b/articles/Extensibility/docs/development/Add-On-To-App-Migration.md
new file mode 100644
index 0000000..53f60c8
--- /dev/null
+++ b/articles/Extensibility/docs/development/Add-On-To-App-Migration.md
@@ -0,0 +1,36 @@
+---
+stoplight-id: fhf8qgiqk5ml3
+---
+
+# Add-on to App Migration
+
+If you previously have developed an add-on, you have to migrate it to the app concept. Add-ons have in the descriptor the property `descriptorVersion` with value `1.3` or less. Apps start with `descriptorVersion` `1.4`.
+
+## Changes
+
+The most important changes:
+
+* Lifecycle events have been renamed for consistency, and the payload have been changed. But the blueprint code covers these and following it should get you started really fast.
+* Auth0 `clientId` and `clientSecret` have been moved from install (tenant) scope to app scope. Where before you had a separate set of Auth0 credentials for each install, now you get one set when your app is registered in Trados. That means that you can get the token from Auth0 once (for the period of its validity), and make Trados Cloud Platform API requests for any tenant that has the app installed, by providing the tenant in the X-LC-TenantId header.
+* We've introduced a new Lifecycle event `UPDATED` which will be used to update the app on various changes. Currently it can update the `clientId` and `clientSecret`. That is useful if credentials need to be cycled.
+
+The Migration Blueprints cover how to update the add-on to support all these new features.
+
+Management changes:
+* Publishing doesn't require you to install the current app version.
+* The current available app version will be published when you publish.
+* When registering, you'll have an extra field where you select people from your account that should receive emails regarding managing your app.
+
+
+## Upgrade Process
+
+The process of migration should look like:
+
+* Depending on if your add-on is Java or .NET, go to the appropriate blueprint page: [Java Migration Blueprint](blueprints/Java-Migration-Blueprint.md) or [.NET Migration Blueprint](blueprints/Dot-Net-Migration-Blueprint.md). This page will contain details on what changes must be done.
+* Perform the changes in your code and deploy it to a test instance
+* Test the changes by having an add-on installed on your account before the app deploy. After the deploy update your install to the new version and confirm it's functioning as previously.
+* Deploy your "Production" instance
+* If it was published to App Store, publish the new version
+
+Because you might have installs with the old version, you'll have to maintain the code to handle requests for version 1.3 and 1.4 - for example the endpoint paths that were specified in the old descriptor should be still valid.
+
diff --git a/articles/Extensibility/docs/development/App-Descriptor.md b/articles/Extensibility/docs/development/App-Descriptor.md
new file mode 100644
index 0000000..b464343
--- /dev/null
+++ b/articles/Extensibility/docs/development/App-Descriptor.md
@@ -0,0 +1,146 @@
+---
+stoplight-id: 1j4h4ccwlvxkq
+---
+
+# App Descriptor
+
+A descriptor defines what the app does. The very first interaction between Trados and an app is requesting the descriptor.
+
+The app developer must accurately fill in all the details within the descriptor, specifying the app's functionalities, and then register the app by submitting a URL linking to the descriptor
+
+## Basic Information
+
+The descriptor model defines attributes that provide basic information like `name`, `description`, `releaseNotes`. The [model](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) provides documentation for all the fields.
+
+## Version
+
+The `version` field is used by Trados to detect newer versions of the app's descriptor. You should increase the version every time you make a change in the descriptor, otherwise, your changes won't reach the registered instance from Trados.
+
+The version is periodically checked by Trados by performing GET descriptor requests.
+
+## Base URL
+
+`baseUrl` defines the base for any endpoint defined in the descriptor. All calls from Trados will be made by concatenating `baseUrl` and the path defined for an endpoint in the descriptor.
+
+For example, if we have in the descriptor:
+
+```json
+{
+ "baseUrl": "https://foo.com",
+ "standardEndpoints": {
+ "health": "/health"
+ }
+}
+```
+
+Trados will make scheduled GET requests to `https://foo.com/health` to check the health.
+
+### Changing Base URL
+For various reasons you might want to change the host of your App and that can be done from Trados management UI.
+
+When updating the host, you also have to update `baseUrl` to match the new host.
+
+You must still support old host as all previous installs will be calling on the `baseUrl` at the installed version. In order to be able to decomission the old host, you must make sure all consumers updated their installs to latest version.
+
+> [!WARNING]
+> Because request authentication is based on Audience matching 'baseUrl', you must ensure that your authentication code can accept both old and new `baseUrl`. See [Request Authentication](Request-Authentication.md).
+
+## Standard Endpoints
+
+An app must implement a set of standard endpoints that are defined in the descriptor schema under `standardEndpoints`. Not all endpoints are required, as you can see in the descriptor schema.
+
+All endpoint paths need to start with the leading character `/` and are relative to `baseUrl`.
+
+Standard endpoints are defined under the `Standard` tag. The actual path should be replaced with the one you defined in the descriptor. The expected Request and Responses are defined and should be used as reference.
+
+### Lifecycle Endpoint
+
+Additionally, in the `standardEnpoints` section we can find the lifecycle endpoint. This endpoint needs to handle different events sent by Trados (similar to webhooks). For instance, when the app is being installed on a certain account, Trados will send an `INSTALLED` event along with some data for that account. The app should react and save the received data.
+- `appLifecycle` - is used for all types of events: `REGISTERED`, `UNREGISTERED`, `INSTALLED`, and `UNINSTALLED`. See the contract [here](../../api/Extensibility-API.v1-fv.html#/operations/Lifecycle).
+
+> [!NOTE]
+> If your app is built from our blueprints, you shouldn't have to change anything, as these endpoints work out of the box.
+
+## Extensions
+
+The list of provided extensions is described under `extensions`. An app can provide none, one, or more extensions.
+
+Any extension will have the generic set of properties:
+- `extensionPointId` that specifies what extension point it extends. Can be only a value specified in the descriptor contract (ex: `lc.mtprovider`).
+- `extensionPointVersion` defines the version of the extension point it extends. The allowed value is defined in the descriptor contract (ex: `1.0`).
+- `name` is defined by the developer, to provide a friendly name for the extension. This is useful when the app provides multiple extensions.
+- `description` will have a summary describing the extension.
+- `configuration` defines the extension and the structure depends on the type of the extension that is implemented.
+```json
+{
+ ...
+ "extensions": [
+ {
+ "extensionPointId": "",
+ "extensionPointVersion": "1.0",
+ "id": "myAwesomeExtension",
+ "name": "My Awesome Extension",
+ "description": "An awesome extension that makes magic",
+ "configuration": { ... }
+ }
+ ]
+ ...
+}
+```
+
+Read more on how to define the extensions for your app in our development guides:
+1. Automatic Task [guide](./Automatic-Task-App-development-guide.md).
+2. Machine Translation [guide](./MT-App-development-guide.md).
+3. Preview [guide](./Preview-App-development-guide.md).
+
+## Configuration
+
+An app can request configuration details at installation time (and it can be edited later).
+
+> [!NOTE]
+> On an update, new configuration settings can be added, and the user will be requested to enter the newer configuration values.
+
+Configurations are app scoped. If you need to assign configuration values for individual extensions within the app, use clear and explicit naming conventions so users understand what information to input into each field. Additionally, tooltips can be provided by setting the description attribute.
+
+Configuration settings can be `string`, `number`, `integer`, `boolean`, `datetime` or `secret`. Additionally, the `string` dataType supports an array of options that will be displayed in a picklist form(for ex: `"options": [ "option1", "option2" ]`).
+
+- for `boolean` a checkbox will be rendered.
+- `datetime` will render a date time pick control.
+- `secret` is used for passwords and secrets, the characters being hidden.
+
+Example:
+```json
+{
+ ...
+ "configuration": [
+ {
+ "name": "Third party token",
+ "id": "thirdPartyToken",
+ "description": "The token used to authenticate to third party API",
+ "dataType": "string"
+ }
+ ]
+ ...
+}
+```
+
+> [!NOTE]
+> Note that in the example the `optional` and `defaultValue` properties have not been specified, so these will be set to their default values, as specified in the contract ( false for `optional` and undefined for `defaultValue`).
+
+Moreover, you have the option to define a list of choices using the `options` field. When this field is filled, the values will be presented in a dropdown menu. It's important to note that the only acceptable `dataType` in this scenario is `string`.
+
+## Scopes
+
+
+Scopes within the app define the extent of access requested to the tenant's data. Depending on the actions carried out by the app, it may require read-only privileges, read/write permissions, or even access to secure projects. The permissible values for scopes are listed under the `scopes` section.
+
+The scopes advised in the descriptor will be presented to the consumers during installation. They can then decide whether to proceed with the installation and grant access to the app.
+
+Once access is granted, the app will be able to perform authorized requests to the Trados Cloud Platform API.
+
+> [!NOTE]
+> If the app doesn't make requests to Trados Cloud Platform API, no scopes should be specified.
+
+## Webhooks
+
+Webhooks can be registered automatically when declared in the descriptor. See [Webhooks](Webhooks.md) page for more details.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/App-Versioning.md b/articles/Extensibility/docs/development/App-Versioning.md
new file mode 100644
index 0000000..0f1e8f7
--- /dev/null
+++ b/articles/Extensibility/docs/development/App-Versioning.md
@@ -0,0 +1,30 @@
+---
+stoplight-id: 8qooshkz6t5ps
+---
+
+
+# App Versioning
+
+This article explains how the app versions work and how to use multiple versions of your app.
+
+## Versions in Trados
+
+When registering the app, the descriptor is saved in Trados as the initial version. The [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) includes a `version` field, which indicates the app's version. This version number should be incremented each time changes are made to the descriptor (such as endpoints or naming) to ensure Trados detects the new version. Only descriptors with higher version numbers are detected and added alongside existing ones. This enables the installed instances to be associated with a particular version of the app.
+
+Throughout an app's lifespan, it can be installed in various versions across different tenants. For instance, one tenant might install version 1.0.1, another 1.0.2, and a third 1.0.3. Although they expect to use the app at these particular versions, if no special actions are taken by the developer, they will probably all be using the same instance, which probably has a single implementation and does not take into consideration the expected version.
+
+## Versioning Pitfall
+
+To delve deeper into the issue highlighted above, consider the following scenario:
+
+Your app has a public version installed across multiple tenants. Eventually, you opt to modify an extension's functionality. Upon deploying these changes, integrations will utilize the updated instance, thereby adopting the newly implemented business logic. However, this may not align with your intentions, or worse, it could introduce errors for tenants who have installed the older version and expect it to maintain its previous behavior.
+
+## Versioning Your App
+
+To ensure that new behavior only affects new installations and tenants updating to the latest version, you can version the extension endpoints. For example, suppose your app implements an Automatic Task Extension with a [submit](../../api/Extensibility-API.v1-fv.html#/operations/automatictasktypeexecutetask) endpoint like `{baseUrl}/v1/submit`, as specified in the contract. To prevent older versions from accessing the new functionality, create a new set of endpoints labeled with a new version, such as `{baseUrl}/v2/submit`, exclusively available in the updated descriptor version. Consequently, older versions won't recognize the existence of the v2 endpoint and will continue to use the v1 endpoint. Ensure that the v1 endpoint remains accessible at the same path defined in the older descriptor.
+
+For more details on version updates, refer to this dedicated [guide](../appManagement/Updating.md).
+
+## Versioning Headers
+
+An alternative option to handle different business logic based on the installed version is to utilize the provided HTTP headers. These headers (`appVersion`, `extensionPointVersion`, `extensionId`) allow developers to implement custom functionality based on the actual version of the installed apps across different customers.
diff --git a/articles/Extensibility/docs/development/Authentication-Overview.md b/articles/Extensibility/docs/development/Authentication-Overview.md
new file mode 100644
index 0000000..49f6c08
--- /dev/null
+++ b/articles/Extensibility/docs/development/Authentication-Overview.md
@@ -0,0 +1,7 @@
+# Authentication Overview
+
+Communication between Trados and apps is secured through multiple measures, ensuring that both the communication channel is tamper-proof and encrypted to protect against eavesdropping, but also to protect against unauthorized access.
+
+Firstly, this is achieved by requiring that all endpoints on the app provide HTTPS using TLS 1.2, but also that Trados is available on HTTPS. This secures the communication both ways.
+
+Secondly, the requests from Trados to the apps are authenticated with JWS Bearer tokens, that can be validated against a public key that is exposed in Trados Cloud Platform API and is cycled at regular intervals.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Automatic-Task-App-development-guide.md b/articles/Extensibility/docs/development/Automatic-Task-App-development-guide.md
new file mode 100644
index 0000000..2189c9d
--- /dev/null
+++ b/articles/Extensibility/docs/development/Automatic-Task-App-development-guide.md
@@ -0,0 +1,242 @@
+---
+tags: [Development]
+stoplight-id: 2dlyn1ep2e2p5
+---
+
+
+# Automatic Task
+
+Automatic Task extensions offer the possibility to add custom functionality within a project's workflow.
+
+Examples of automatic tasks:
+- send notifications about the project
+- update project details
+- copy the project files to a shared location
+
+Most of the Automatic Task extensions will need to perform certain requests to [Trados Cloud Platform API](https://languagecloud.sdl.com/lc/api-docs/72b66de24898e-rws-language-cloud-api) in order to achieve the desired result. The Trados Cloud Platform API SDKs (for [Java](https://languagecloud.sdl.com/lc/api-docs/java-client) and [.NET](https://languagecloud.sdl.com/lc/api-docs/net-client)) are publicly available.
+
+In order to build a new Automatic Task extension we recommend to start by using the provided [app blueprints](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints).
+
+## Automatic Task Extension
+
+For an app to offer Automatic Task functionality, it must define at least one Automatic Task extension within its [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor).
+For example:
+
+```json
+{
+ ...
+ "extensions": [
+ {
+ "extensionPointId": "lc.automatictask",
+ "id": "SAMPLE_AUTOMATICTASK_EXTENSION_ID",
+ "name": "SAMPLE_AUTOMATICTASK_EXTENSION_NAME",
+ "description": "SAMPLE_AUTOMATICTASK_EXTENSION_DESCRIPTION",
+ "extensionPointVersion": "1",
+ "configuration": {
+ "endpoints": {
+ "lc.automatictask.submit": "/v1/submit"
+ },
+ "supportedInputFileType": "nativeSource",
+ "outputFileType": "nativeSource",
+ "scope": "file",
+ "outcomes": [
+ {
+ "default": true,
+ "description": "Done.",
+ "outcome": "done"
+ }
+ ],
+ "workflowTemplateConfigurations": [
+ {
+ "name": "SAMPLE_AUTOMATICTASK_EXTENSION_CONFIG_NAME",
+ "id": "SAMPLE_AUTOMATICTASK_EXTENSION_CONFIG_ID",
+ "description": "SAMPLE_AUTOMATICTASK_EXTENSION_CONFIG_DESCRIPTION",
+ "optional": false,
+ "defaultValue": "SAMPLE_DEFAULT_VALUE",
+ "dataType": "string"
+ }
+ ]
+ }
+ }
+ ]
+ ...
+}
+```
+
+- `extensionPointId` - the identifier of the extension point corresponding to this extensionType: **lc.automatictask**
+- `id` - unique extension identifier provided by the app developer
+- `name` - provide a friendly and unique name. It might be shown to the end user, and it may be useful in helping the user distinguish between multiple extensions
+- `description` - the description of the automatic task extension
+- `extensionPointVersion` - the version of the extension point that is implemented in the Extension
+- `configuration` - the task configuration
+
+ - `endpoints`
+ - `lc.automatictask.submit` - the path of the endpoint that accepts a task for execution
+
+ - `supportedInputFileType` - the input file type supported by the task. All tasks can have input files, regardless of their scope.
+
+ Acceptable values:
+
+ - `nativeSource`: processes source files in their native upload form (for example: FileTypeDetection, Engineering, FileFormatConversion)
+
+ - `bcmSource`: processes source files in their converted "bcm" form (for example: DocumentContentAnalysis, CopySourceToTarget)
+
+ - `bcmTarget`: processes target files in their "bcm" form (for example: Translation, Linguistic Review, MachineTranslation, TranslationMemoryMatching, TranslationMemoryUpdate, TargetFileGeneration)
+
+ - `nativeTarget`: processes target files in their native "generated" form (for example: DTP, FinalCheck)
+
+ - `sdlxliffTarget`: processes target files in their "sdlxliff" form, specifically for Import tasks. It is not recommended for automated task types at this time (early 2022).
+
+ - `none`: does not process the file content, neither to read nor to update it
+
+ - `outputFileType` - describes what the output files are for the given task.
+
+ Acceptable values:
+
+ - idem with `supportedInputFileType`
+
+ >The `supportedInputFileType` and `outputFileType` parameters affect the extension task order in the workflow template, as follows:
+ >- an extension task can only follow another task with the same `outputFileType` as its `supportedInputFileType` (except for the extension tasks with `supportedInputFileType: nativeSource` which can be placed first in the workflow).
+ >- a normal task can only follow an external task with the same `outputFileType` as its `supportedInputFileType`.
+
+ - `scope` - describes the applicability of a task within a project
+
+ Acceptable values:
+
+ - `file`: the task will be applicable for every file in the project. It will process either the source or the target files, based on the relation with supportedInputFileType and outputFileType
+
+ - `targetLanguage`: the task will be applicable for every target language of the project
+
+ - `batch`: the task is applicable only once for a batch execution within a project
+
+ - `task`: the task is applicable to other tasks. Specifically tailored for Error tasks. Not recommended for automated task types at this time (early 2022).
+
+ - `vendorOrder`: the task is part of the vendor negotiation process. Not recommended for automated task types at this time (early 2022).
+
+ - `outcomes` - the possible outcomes of this automatic task:
+
+ - `outcome` - a custom outcome value
+
+ - `description` - the outcome description
+
+ - `default` - if `TRUE`, this outcome will be used when no specific outcome is provided. At least one outcome must be set as default.
+
+ - `workflowTemplateConfigurations` - definitions of the configurations that the app needs at runtime in order to execute a task. The task will be configured when you create a workflow template, a workflow or a project. The configuration values will be passed to the app when a task is submitted for execution. For example, an extension that uploads a file to an FTP can have the location as a configuration.
+
+ - `name` - short, user-friendly name for the configuration settings
+
+ - `id` - an alphanumeric identifier, including underscores
+
+ - `description` - a user-friendly description of the configuration settings, describing what the user should set in the textbox
+
+ - `optional` - if the configuration setting is optional
+
+ - `defaultValue` - the default value of the setting
+
+ - `dataType` - specifies the data type for the value, to be used for input type generation
+
+ - `options` - a list of setting options
+
+You can define as many automatic extensions as you need. They could have the same extension point (submit endpoint) or different ones, depending on your app design.
+
+### Extension Usage
+
+You can integrate your extension task within a **Workflow Template** as shown below:
+
+
+
+The `workflowTemplateConfigurations` can be configured as follows:
+
+
+
+Based on the created **Workflow Template** you can create a new **Workflow**.
+
+
+
+The last step is to start a **Project** using the **Workflow** created in the previous step.
+
+
+
+Find more details on how to use an Automatic Task app in the [consumer guide](../consumer/Automatic-Task-App-consumer-guide.md).
+
+### Scopes
+
+Depending on the actions performed by the app you may need to request access to the account's resources, otherwise the requests to the Trados Cloud Platform API will fail due to insufficient permissions.
+
+To request access from the consumers, you need to specify one or more scopes within the app's descriptor, as shown below:
+
+```json
+{
+ ...
+ "scopes" : [
+ "TENANT",
+ "TENANT_READ",
+ "ACCESS_SECURE_PROJECT_CONTENT"
+ ]
+ ...
+}
+```
+The allowed values are:
+- `TENANT` - Read/write/delete all tenant data (resources).
+- `TENANT_READ` - Read-only access to all tenant data (resources).
+- `ACCESS_SECURE_PROJECT_CONTENT` - Access to secure project content.
+
+They will be presented to the consumers at installation time in order for them to decide if they want to proceed with the installation and allow access to the app.
+
+### Submit Endpoint
+
+The `lc.automatictask.submit` endpoint is used to receive and process the tasks from Trados. This endpoint should only schedule the task and return `200`. The scheduled task would be picked up by a background process that will send the result to the received callbackUrl.
+
+ Example:
+
+```json
+POST /v1/submit
+X-LC-Tenant: LC-TENANT_ID
+
+{
+ "projectId": "SAMPLE_PROJECT_ID",
+ "correlationId": "SAMPLE_TASK_ID",
+ "callbackUrl": "http://theCallback/callThisBack",
+ "workflowConfiguration": [
+ {
+ "id": "SAMPLE_CONFIG_ID",
+ "value": "SAMPLE_CONFIG_VALUE"
+ }
+ ]
+}
+```
+
+- The `correlationId` is the task identifier from Trados. You can also find it in the project details page under the _Task History_ tab.
+
+- The `callbackUrl` is a Trados endpoint where the app will send the outcome after the task is processed.
+
+- The `X-LC-Tenant` header has to be kept in order to perform the callback request. Find more details in the dedicated section below.
+
+The blueprints contain placeholders from where you can start implementing the endpoint's functionality:
+- [.NET blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppBlueprint/Rws.LC.AppBlueprint/Controllers/AutomaticTaskController.cs#L36)
+- [Java blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppBlueprint/src/main/java/com/rws/lt/lc/blueprint/web/AutomaticTaskController.java#L16)
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/automatictasktypeexecutetask) for further details.
+
+### Callback Endpoint
+
+This is a Trados endpoint used to receive the task outcome from the Automatic Task apps. Each automatic task will have its own callback URL.
+
+ Example:
+
+```json
+POST /external-job/v1/callback?token=CALLBACK_TOKEN
+X-LC-Tenant: LC-TENANT_ID
+
+{
+ "success": true,
+ "outcome": "Done",
+ "errors": null
+}
+```
+
+- The request needs to include the `X-LC-Tenant` header.
+
+- The `token` should be already present in the received `callbackUrl` on the submit endpoint.
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/automatiktasktypecallback) for further details.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Concepts.md b/articles/Extensibility/docs/development/Concepts.md
new file mode 100644
index 0000000..eab6a7e
--- /dev/null
+++ b/articles/Extensibility/docs/development/Concepts.md
@@ -0,0 +1,19 @@
+# Concepts
+
+Trados apps offer a way to extend the Trados functionality.
+
+## Apps
+
+An app is a Rest API service, hosted by the developer, that is registered with Trados and will be invoked in the flows it is registered to handle. For example, an app can implement a new Machine Translation engine and register it with Trados. The new machine translation option will be available to whoever installs the app on their account.
+
+Apps can be either private or published to the store where they can be freely installed on other accounts.
+
+## Extensions
+
+An app can have many extensions or none at all. An extension is an atomic functionality design to provide functionality defined by an Extension Point. For instance, an app might include a Machine Translation Extension, which lets it translate text using a service not built into Trados.
+
+Imagine the app as a box, with each extension as a piece that enhances it. You're not restricted to just one Machine Translation extension in the app. You can add as many extensions as you want, maybe different translation services. Also, it's fine to mix different types of extensions in one app.
+
+## Extension Points
+
+Trados defines Extension Points that can be implemented in apps. For example, Machine Translation is an Extension Point. The actual implementation in an app is called an Extension.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Deployment-Strategy.md b/articles/Extensibility/docs/development/Deployment-Strategy.md
new file mode 100644
index 0000000..b6b0166
--- /dev/null
+++ b/articles/Extensibility/docs/development/Deployment-Strategy.md
@@ -0,0 +1,35 @@
+# Deployment Strategy
+
+In this guide, we will outline the recommended deployment strategy, the main ideas behind it, and how you can apply it.
+
+The proposed strategy involves hosting at least 2 instances of your app:
+- The **preview** instance
+- The **live** instance
+
+## The Preview Instance
+
+The preview instance is designated for testing and experimenting with new things, such as extensions, configurations, etc.
+
+This instance **must not be published**. If needed, for testing purposes, it can be [shared](../appManagement/Sharing.md) with other tenants.
+
+We suggest using a distinctive **development name** and **description** to differentiate it from the live instance. For example:
+
+
+
+
+
+> [!NOTE]
+> Make sure you use a **descriptor URL** different from the one you need for the live instance. You cannot register two apps with the same descriptor URL.
+
+## The Live Instance
+
+The live instance is the one you'll be using for production purposes. It might already be installed and used on a particular account, or shared with other accounts, or it may be the instance that is currently being [published](../appManagement/Publishing.md).
+
+Registration example:
+
+
+
+Finally, here is a comparison between the 2 instances:
+
+
+
diff --git a/articles/Extensibility/docs/development/Lifecycle.md b/articles/Extensibility/docs/development/Lifecycle.md
new file mode 100644
index 0000000..79794fa
--- /dev/null
+++ b/articles/Extensibility/docs/development/Lifecycle.md
@@ -0,0 +1,64 @@
+# Lifecycle
+
+Communication between Trados and an app service involves several lifecycles. Some examples include: registration, installation, publishing, and more.
+
+The very basic flow of when an app is first registered by a developer and installed (optional, but recommended, step for developers) looks like this:
+
+
+
+
+A summary of all standard endpoints and their role in the lifecycle of an app:
+
+
+- `GET /descriptor` is the very first endpoint that will be invoked when the app owner tries to register it in Trados.
+- `POST /app-lifecycle` will be the next in order, with an identifier of `REGISTERED`.
+- `POST /app-lifecycle` will be again invoked with id `INSTALLED`.
+- `GET /configuration` will be invoked to get the list of configuration settings (including default values, current values) that need to be provided by the administrator who installed the app on their tenantId.
+- `POST /configuration` will set the configuration values for the tenantId. Note: not all the settings can be sent in a single request. There may be multiple requests that are setting different configuration values. The app should keep these settings safe.
+- Also note that this endpoint can be called any time after uninstall if the administrator decides to change any of the settings.
+
+## Lifecyle Events
+
+The lifecycle events are handled by the [lifecycle endpoint](./App-Descriptor.md#lifecycle-endpoint).
+
+### Registered Event
+
+The lifecycle for registering the app in Trados:
+
+- `POST /app-lifecycle` with id `REGISTERED` will notify the app service that it has been registered. From that moment on, administrators can install the app on their accounts, share it or publish. The payload will contain the `clientId` and `clientSecret` which can be used for authenticating with RWS Language Cloud API. That data should be stored securely in the app database.
+
+### Installed Event
+
+The lifecycle for installing of the app in an account:
+
+- `POST /app-lifecycle` with id `INSTALLED` is sent when the app is installed on an account. Only tenant identifier should be stored securely in the app database for keeping track of installed accounts.
+
+### Uninstalled Event
+
+The lifecycle for uninstalling of the app from an account:
+
+- `POST /app-lifecycle` will notify the app service, by providing the id `UNINSTALLED`. The app should delete any account-related data.
+
+### Unregistered Event
+
+The lifecycle for unregistering an app from Trados:
+
+- `POST /app-lifecycle` will be invoked with id `UNREGISTERED`. If there are accounts that haven't been previously uninstalled, they should be considered so, and all the related data be deleted.
+
+### Updated Event
+
+A special lifecycle event has been introduced to help with the upgrade from 1.3 to 1.4 descriptor versions (from add-ons to apps). Also it will be used in the future for refreshing `clientId` and `clientSecret`:
+
+- `POST /app-lifecycle` will provide credentials update when has the id `UPDATED`. The payload is similar to `REGISTERED` event.
+
+## Other Endpoints
+
+There are also endpoints that can be called at any point in time:
+
+- `GET /descriptor` - can be called before registration, during registration, after registration, on scheduled intervals, and so on.
+- `GET /health` - will be called during and after registration. It is scheduled to be checked periodically.
+- `GET /documentation` - can be called at any time.
+
+Additionally, there are also the Extension endpoints which are invoked in the business lifecycle.
diff --git a/articles/Extensibility/docs/development/MT-App-development-guide.md b/articles/Extensibility/docs/development/MT-App-development-guide.md
new file mode 100644
index 0000000..d077c7b
--- /dev/null
+++ b/articles/Extensibility/docs/development/MT-App-development-guide.md
@@ -0,0 +1,170 @@
+---
+tags: [Development]
+stoplight-id: y6tealkmfbf36
+---
+
+
+# Machine Translation
+
+Machine Translation apps offer the possibility to use external machine translation providers within the Trados platform.
+
+To build a new MT app we recommend starting by using the provided [app blueprints](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints).
+
+## Machine Translation Extension
+
+An MT app needs to define at least one MT extension within its [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor).
+For example:
+
+```json
+{
+ ...
+ "extensions": [
+ {
+ "id": "SAMPLE_MT_EXTENSION_ID",
+ "name": "SAMPLE_MT_EXTENSION_NAME",
+ "extensionPointVersion": "1",
+ "extensionPointId": "lc.mtprovider",
+ "description": "SAMPLE_MT_EXTENSION_DESCRIPTION",
+ "configuration": {
+ "endpoints": {
+ "lc.mtprovider.translate": "/v1/translate",
+ "lc.mtprovider.engines": "/v1/translation-engines"
+ },
+ "format": "html" // or "bcm"
+ }
+ }
+ ]
+ ...
+}
+```
+
+- `id` - unique extension identifier provided by the app Developer
+- `name` - provide a friendly and unique name. It might be shown to the end user, and it may be useful in helping the user distinguish between multiple extensions
+- `extensionPointVersion` - the version of the extension point that is implemented in the Extension
+- `extensionPointId` - the extension point identifier corresponding to this extensionType: **lc.mtprovider**
+- `description` - the MT extension description
+- `configuration` - the extension configuration
+ - `endpoints` - the required endpoints for the MT extension
+ - `lc.mtprovider.translate` - the endpoint used to receive and translate content from Trados
+ - `lc.mtprovider.engines` - the endpoint used to retrieve the available translation engines (supported language pairs)
+ - `format` - the content's format supported by the app on the `translate` endpoint.
+
+### Translation Engines Endpoint
+
+The `lc.mtprovider.engines` endpoint provides the available translation engines for the requested language pairs.
+
+ Example:
+```html
+GET /v1/translation-engines?model=NEURAL&sourceLanguage=en-US&targetLanguage=ro-RO&targetLanguage=ro-MD&targetLanguage=fr-FR&exactMatch=true
+```
+
+- The `model` is the translation engine's type and its value can be either `NEURAL` or `BASELINE`.
+
+- The `exactMatch` will enforce the result to include only the languages that match the exact values of the requested languages.
+
+- There could be multiple target languages requested, thus the endpoint should return all translation engines for the supported ones.
+
+- The response would look like this:
+
+```json
+{
+ "items": [
+ {
+ "id": "en_fr_nmt",
+ "model": "nmt",
+ "name": "nmt",
+ "engineSourceLanguage": "en",
+ "engineTargetLanguage": "fr",
+ "matchingSourceLanguage": "en-US",
+ "matchingTargetLanguages": [
+ "fr-FR"
+ ]
+ },
+ {
+ "id": "en_ro_nmt",
+ "model": "nmt",
+ "name": "nmt",
+ "engineSourceLanguage": "en",
+ "engineTargetLanguage": "ro",
+ "matchingSourceLanguage": "en-US",
+ "matchingTargetLanguages": [
+ "ro-RO",
+ "ro-MD"
+ ]
+ }
+ ],
+ "itemCount": 2
+}
+```
+
+- `nmt` stands for "NEURAL MACHINE TRANSLATION"
+
+#### Endpoint usage
+
+This endpoint is going to be used when creating a new **Translation Engine** resource as shown below:
+
+
+
+The **Machine Translation models** are provided by the app via the `lc.mtprovider.engines` endpoint.
+
+The blueprints contain placeholders from where you can start implementing the endpoint's functionality:
+- [.NET blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppBlueprint/Rws.LC.AppBlueprint/Controllers/TranslationController.cs#L52)
+- [Java blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppBlueprint/src/main/java/com/rws/lt/lc/blueprint/web/TranslationEnginesController.java#L21)
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/GetMachineTranslationProviderEngines) for further details.
+
+### Translate Endpoint
+
+ The `lc.mtprovider.translate` endpoint translates the content, namely the text provided in the format specified in the descriptor (_html_ of _bcm_).
+
+ Example:
+
+```json
+POST /v1/translate
+
+{
+ "contents": [
+ "
Here’a a smiley face
",
+ "
Here’s a table:
"
+ ],
+ "engineId": "en_ro_nmt"
+}
+```
+
+- The `engineId` is the identifier of the engine used to translate the `contents`.
+
+- The response would look like this:
+
+```json
+{
+ "translations": [
+ "
Iată un chip zâmbet
",
+ "
Iată un tabel:
"
+ ]
+}
+```
+
+> `
..
` might cause problems for some engines. You can parse them out before sending them to the translation service if the order of the segments can be guaranteed. Once the translated segments are available, these need to be added back when sending the response.
+
+#### Endpoint usage
+
+To test the endpoint, first, you will need a workflow that contains the **Machine Translation** automatic task and the **Translation** human task. For example:
+
+
+
+Using that **workflow** and the **translation engine** created in the previous step, you can start a new project like this:
+
+
+
+When the project reaches **Translation**, you can open it in the **Online Editor** and check the target segments. This is where you should find the translations performed by your app in the **Machine Translation** step. You can also search for Lookups to obtain alternative translations. This will invoke again the `lc.mtprovider.translate` endpoint.
+
+
+
+You can find more details on how to use an MT app in the [consumer guide](../consumer/MT-App-consumer-guide.md).
+
+The blueprints contain placeholders from where you can start implementing the endpoint's functionality:
+
+- [.NET blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppBlueprint/Rws.LC.AppBlueprint/Controllers/TranslationController.cs#L35)
+- [Java blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppBlueprint/src/main/java/com/rws/lt/lc/blueprint/web/TranslateController.java#L22)
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/MachineTranslationProviderTranslateBCM) for further details.
diff --git a/articles/Extensibility/docs/development/Multi-Region.md b/articles/Extensibility/docs/development/Multi-Region.md
new file mode 100644
index 0000000..fc3dd7d
--- /dev/null
+++ b/articles/Extensibility/docs/development/Multi-Region.md
@@ -0,0 +1,164 @@
+---
+stoplight-id: 4x29bwcvq2f84
+tags: [Development]
+---
+
+# Multi-Region
+
+To fulfill the requirements of our customers, Trados Enterprise allows multi-region deployments of your app.
+
+To enable multi-region on your app you must provide regional instances of your app and include their `regionalBaseUrls` in your [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor).
+
+> [!NOTE]
+> Multi-Region is only supported on apps starting with `decriptorVersion: 1.4`
+
+> [!WARNING]
+> Please note that the responsibility for ensuring region-specific URLs lies with the developer. The URLs should accurately reflect the physical location of the instances.
+
+Currently, the supported regions are Europe(`eu`) and Canada(`ca`). Depending on where your app is deployed you can choose either one or both of them. This will tell Trados what endpoints to invoke based on where the consumer tenant is living.
+
+> [!WARNING]
+> All instances, in all regions should provide the exact same descriptor.
+
+## Installing an App with Multi-Region support
+
+When a consumer installs an app, if `regionalBaseUrls` is present and same region as consumer's is available, that region will be used.
+
+If your app does not provide the region where the consumer tenant belongs, the consumer will be notified before installing the app that the global region (`baseUrl`) will be used instead.
+
+
+
+> [!WARNING]
+> Once installed globally, if the app adds support for a new region, the consumers will have to reinstall it to change the region.
+
+The `INSTALLED` lifecycle event now includes the region information for the account where the app is installed so you can save it in the database and use it to identify to which regions calls should be made (for ex. which region/url to use for Public API). That is already implemented in the provided [Java](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/javaAppBlueprint) and [.NET](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/dotNetAppBlueprint) blueprints.
+
+## Base URL vs Multi-Region Base URLs
+
+The `baseUrl` property from [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) remains mandatory even if you add the `regionalBaseUrls` property(which is optional).
+
+> [!WARNING]
+> The `baseUrl` in your app should stay fixed and not change based on region. When an App is registered, `baseUrl` from that initial descriptor is used for setting audience for all future authentication requests, independent of regions (it is possible to change it later, see [Changing Base URL](App-Descriptor.md#changing-base-url).
+
+Your "multi-region descriptor" should look something like this:
+```json
+{
+ // baseUrl - also treated as global path
+ "baseUrl": "foo.com/app/v1"
+ "regionalBaseUrls": {
+ "eu": "eu.foo.com/app/v1",
+ "ca": "ca.foo.com/app/v1"
+ }
+ //..
+}
+```
+
+> [!NOTE]
+> It is also acceptable to have the same URL in `baseUrl` as for one of regions in your `regionalBaseUrls` property.
+
+The `baseUrl` is treated as a global region URL and is still used in the following scenarios even if `regionalBaseUrls` is also defined:
+
+1. Health checks - the `/health` endpoint that is periodically invoked to check the health status of your app
+2. Version checks - the `/descriptor` endpoint that is periodically invoked to check for new versions(by the `version` property).
+ > [!NOTE]
+ > It is the developer's responsibility to keep the version of the regional instances in sync.
+3. `UPDATED` lifecycle event - explained below in the [Special Case](#special-case) section.
+
+The regional URLs from `regionalBaseUrl` are used in the following scenarios:
+
+1. `REGISTERED`/`UNREGISTERED` lifecycle events - each regional URL is invoked and `baseUrl`. If `baseUrl` is same as one of the regional URLs, the events will be sent only once for that URL, to avoid duplicating them.
+2. Tenant-based requests(if install was done with a region and not a `baseUrl` - region was available at the time of install):
+ 1. `INSTALLED`/`UNINSTALLED` lifecycle events
+ 2. GET/Update/Validate configuration
+ 3. Webhooks - if your app supports webhooks they will be sent to your regional URLs
+ 4. Extension endpoints
+
+### Examples
+
+If your app offers only a `baseUrl` with no `regionalBaseUrls`, for ex:
+```json
+...
+"baseUrl": "foo.com/app/v1"
+...
+```
+When someone will try to install it, they will see a popup informing them that the app does not provide data residency in the same region as them and will ask them to confirm if they want to proceed with installation.
+
+Let's see another example where only one region is specified:
+```json
+...
+"baseUrl": "foo.com/app/v1",
+"regionalBaseUrls": {
+ "ca": "ca.foo.com/app/v1"
+}
+...
+```
+If a user in Canada region tries to install the App, the installation will go per usual. If a user in Europe, tries to install it, the confirmation popup will show up because Europe is not specified explicitly.
+
+For the case were all currently supported regions are specified:
+```json
+...
+"baseUrl": "foo.com/app/v1"
+"regionalBaseUrls": {
+ "eu": "eu.foo.com/app/v1",
+ "ca": "ca.foo.com/app/v1"
+}
+...
+```
+When someone installs the app from Canada region or from Europe region, the installation will proceed as usual with no popups. If in the future a new region is introduced, but the app is not updated, users in the new region will be able to install the app but they will be met with the confirmation popup.
+
+`baseUrl` can be any valid url where calls will be processed as per documentation. Any of the following are valid:
+```json
+...
+"baseUrl": "foo.com/app/v1"
+"regionalBaseUrls": {
+ "eu": "eu.foo.com/app/v1",
+ "ca": "ca.foo.com/app/v1"
+}
+...
+```
+```json
+...
+"baseUrl": "eu.foo.com/app/v1"
+"regionalBaseUrls": {
+ "eu": "eu.foo.com/app/v1",
+ "ca": "ca.foo.com/app/v1"
+}
+...
+```
+```json
+...
+"baseUrl": "ca.foo.com/app/v1"
+"regionalBaseUrls": {
+ "eu": "eu.foo.com/app/v1",
+ "ca": "ca.foo.com/app/v1"
+}
+...
+```
+
+## Multi-Region on Fresh Apps
+
+Registering a new app that comes from the start with `regionalBaseUrls` will trigger the [REGISTERED event](./Lifecycle.md#registered-event) notifications for each regional base URL as well as for `baseUrl` if not already present in the `regionalBaseUrls`. The same pair of credentials will be sent to each URL.
+
+## Multi-Region on Existing Apps
+
+If your app has been registered without the `regionalBaseUrls` property it means it was only available globally via the `baseUrl` property.
+
+To add regional support you will have to include `regionalBaseUrls` in your descriptor. When Trados detects the new version it will sent the [REGISTERED event](./Lifecycle.md#registered-event) only to the regional URLs that have been added in that new version.
+
+The same pair of credentials that were initially sent to the `baseUrl` will also be sent to the regional URLs. It is necessary that all your app deployments know to handle the event and store the received credentials securely.
+
+### Special Case
+
+This section is for old add-ons(`decriptorVersion:1.3`) that have to be migrated to apps(`decriptorVersion:1.4`) and also want to support multi-region on the new version.
+
+As described in the [migration guide](./Add-On-To-App-Migration.md) when a descriptor with `decriptorVersion:1.4` is detected, Trados will send the `UPDATED` event with a new pair of credentials. This event will be sent globally(only to the `baseUrl`) as before.
+
+After the `UPDATED` event was successfully received by the app, Trados will also send the `REGISTERED` event for each of the regional base URLs with the same pair of credentials from the previously sent `UPDATED` event.
+
+## Recommendations
+
+To comply with data residency rules, make sure you provide instances for all supported regions, and your instances are physically in the specified region and there communication channel does not cross the region borders.
+
+Don't hard code the regions in your code. Make sure your code is flexible and can handle any new region. That way you will future proof your app as we are adding new regions.
+
+Decide on a primary region and set the `baseUrl` to that region url. That should simplify your deployment and configuration.
diff --git a/articles/Extensibility/docs/development/Preview-App-development-guide.md b/articles/Extensibility/docs/development/Preview-App-development-guide.md
new file mode 100644
index 0000000..49bc2a7
--- /dev/null
+++ b/articles/Extensibility/docs/development/Preview-App-development-guide.md
@@ -0,0 +1,377 @@
+---
+tags: [Development]
+stoplight-id: i7ib8ruwpxdxr
+---
+
+
+# Preview Provider
+
+## Introduction
+
+Preview apps offer the possibility to use external preview providers within the Trados Enterprise platform.
+
+The type of preview generated is known as "Dynamic Preview" as it can dynamically adjust depending on choices the user might make in the browser, for instance, selecting different preview sections or views from the rendered preview. The extension acts as a webserver which implements custom endpoints to serve the content to the browser. This content can be anything which the browser is able to parse and display accordingly.
+
+To build a new preview app we recommend to start by using the provided [app blueprints](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints).
+
+## Preview App Extension
+
+A preview app needs to define at least one preview extension within its [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor).
+For example:
+
+```json
+{
+ ...
+ "extensions": [
+ {
+ "extensionPointId": "lc.previewprovider",
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "extensionPointVersion": "string",
+ "configuration": {
+ "endpoints": {
+ "lc.preview.startpreview": "string",
+ "lc.preview.refreshpreview": "string",
+ "lc.preview.updatesegment": "string",
+ "lc.preview.endpreview": "string"
+ },
+ "supportedFileTypes": "html",
+ "requiredInputFiles": {
+ "bilingualDocument": true,
+ "previewPackageTemplate": true,
+ "nativeFile": true,
+ "nativeAnnotatedFile": true
+ },
+ "outputType": "previewPackage"
+ }
+}
+ ]
+ ...
+}
+```
+
+- `id` - unique extension identifier provided by the app Developer.
+- `name` - provide a friendly and unique name. It might be shown to the end user, and may be useful to help the user distinguish between multiple extensions.
+- `extensionPointVersion` - the version of the extension point that is implemented in the Extension.
+- `extensionPointId` - the extension point identifier corresponding to this extensionType: **lc.previewprovider**.
+- `description` - the preview extension description
+- `configuration` - the extension configuration.
+ - `endpoints` - the required endpoints for the preview extension, should be relative to your `baseUrl`.
+ - `lc.previewprovider.startpreview` - the endpoint used to start the preview generation. For ex: `/start-preview`.
+ - `lc.previewprovider.refreshpreview` - the endpoint used to refresh the existing preview session. For ex: `refresh-preview`.
+ - `lc.previewprovider.updatesegment` - the endpoint used to update a segment based on a BCM document fragment. For ex: `update-segment`.
+ - `lc.previewprovider.endpreview` - the endpoint used to clean up any state associated with a given preview session. For ex: `end-preview`.
+ - `supportedFileTypes` - A list of FileTypeDefinitionIds which this app may be associated with
+ - `requiredInputFiles` - provides details about which types of input files this extension will require for generating a preview.
+ - `bilingualDocument` - request an endpoint for downloading a BCM document.
+ - `previewPackageTemplate` - request an endpoint for downloading a preview Package Template.
+ - `nativeFile` - request an endpoint for downloading a native file.
+ - `nativeAnnotatedFile` - request an endpoint for downloading a native annotated file.
+ - `outputType` - Indicates which type of output is generated by the extension. For v1, this can be "previewPackage" for package-based previews or "previewUrl" for dynamic URL-based previews.
+
+### Preview App Endpoints
+
+#### StartPreview
+The _startPreview_ endpoint initiates a background preview generation session
+and returns after creating the background worker which generates the actual preview. The result is sent via calling the URL set in the `callbackUrl` field. An important field is the `previewSessionId` which indicates the session this preview is associated with.
+
+If the app needs to store any state, it should associate it with this identifier. The very first call for a given session should always be _startPreview_. If other endpoints are called before this, they should return an error.
+
+If the app is generating a previewPackage or standalone HTML result, it should be uploaded via the URL defined in the `previewResultFileUrl` field.
+The resulting resource identifier returned from this call should be set in the `previewResult` field of the callback response.
+
+For dynamic previews (outputType: "previewUrl"), the preview content is served by the app via one or more endpoints the app implements. The content can be any format, as long as the browser hosting the preview can parse and display that content. This includes HTML, PDF, streamed video etc. The resulting URL returned from this call should be set in the `previewResult` field of the callback response.
+
+ Example:
+```html
+POST https://your-app.com/start-preview
+```
+
+- The request is as follows:
+
+```json
+{
+ "previewSessionId": "string",
+ "fileInformation": {
+ "name": "string",
+ "sourceLanguage": "string",
+ "targetLanguage": "string"
+ },
+ "inputFiles": {
+ "bilingualDocumentUrl": "string",
+ "previewPackageTemplateUrl": "string",
+ "nativeFileUrl": "string",
+ "nativeAnnotatedFileUrl": "string"
+ },
+ "previewResultFileUrl": "string",
+ "callbackUrl": "string",
+ "scope": "source"
+}
+```
+- The response after setting up the background worker, would look like this:
+```json
+{
+ "errorCode": "string",
+ "message": "string",
+ "details": [
+ {
+ "name": "string",
+ "code": "string",
+ "value": "string"
+ }
+ ]
+}
+```
+
+- The final result, which is sent on the callback, is shown below:
+
+```json
+{
+ "previewSessionId": "string",
+ "previewResult": "string",
+ "errors": [
+ {
+ "errorCode": "string",
+ "message": "string",
+ "details": [
+ {
+ "name": "string",
+ "code": "string",
+ "value": "string"
+ }
+ ]
+ }
+ ]
+}
+```
+
+Endpoint usage:
+
+This endpoint is used to initiate a preview session on the app. When this endpoint is called, the app should generate the initial preview and associate it (internally, if any state is kept) - with the `previewSessionId`.
+
+This should be the first endpoint called for any given session - if another endpoint is called for a given session ID before this one, an error should be returned.
+
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/StartPreview) for further details.
+
+#### RefreshPreview
+The _refreshPreview_ endpoint refreshes an existing preview. The mechanism for this in entirely up to the Extension implementation in that it might keep state from the initial preview generation from _startPreview_ in order to speed up the refresh.
+
+The request and responses (REST and Callback) are identical to the _startPreview_ endpoint.
+
+ Example:
+```html
+POST https://your-app.com/refresh-preview
+```
+
+Endpoint usage:
+This endpoint is called when a preview refresh is requested by the user. Any state the app holds from the initial preview generation may be used to speed up the refresh.
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/RefreshPreview) for further details.
+
+#### UpdateSegment
+The _updateSegment_ endpoint accepts a list of BCM document fragments along with their associated segment IDs. The Extension will generate and return an HTML rendered fragment for each BCM document fragment sent in this manner.
+
+Example:
+```html
+POST https://your-app.com/update-segment
+```
+
+- The request is as follows:
+
+```json
+{
+ "previewSessionId": "string",
+ "segments": [
+ {
+ "segmentId": "string",
+ "fragment": {}
+ }
+ ],
+ "fileInformation": {
+ "name": "string",
+ "sourceLanguage": "string",
+ "targetLanguage": "string"
+ },
+ "scope": "source"
+}
+```
+- `previewSessionId` - unique ID of current preview session.
+- `segments` - an array of segments with the following details:
+ - `segmentId` - ID of segment being rendered.
+ - `fragment` - BCM document JSON fragment.
+- `fileInformation` - provides information relating to the file for which the rendered HTML is being generated.
+- `scope` - indicates whether the generation is happening for source or target content.
+
+- The response would look like this:
+```json
+{
+ "previewSessionId": "string",
+ "renderedTranslations": [
+ {
+ "html": "string",
+ "segmentId": "string",
+ "errorCode": "string"
+ }
+ ]
+}
+```
+- `previewSessionId` - unique ID of current preview session.
+- `renderedTranslations` - an array of rendered translations with the following details:
+ - `html` - rendered HTML content for this segment.
+ - `segmentId` - ID of this segment.
+ - `errorCode` - Error code for this segment (App/Extension specific).
+
+Endpoint usage:
+This endpoint is called when the user is updating one or more segments in the Editor. For each segment, the extension will render an equivalent HTML fragment based on the input BCM document fragment.
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/UpdateSegment) for further details.
+
+#### EndPreview
+The _endPreview_ endpoint is called when a given preview session associated with the previewSessionId is finished. This is called so that the app may perform any required cleanup.
+
+Example:
+```html
+POST https://your-app.com/end-preview
+```
+
+```json
+{
+ "previewSessionId": "string"
+}
+```
+
+Endpoint usage:
+Called to indicate a preview session has terminated. Any required cleanup should be performed by the app.
+
+Please refer to the endpoint's [documentation](../../api/Extensibility-API.v1-fv.html#/operations/EndPreview) for further details.
+
+### Javascript Communication Protocol
+
+The Online Editor Container communicates with the Preview Viewer iframe using the Javascript postMessage mechanism. The API is detailed below:
+
+```javascript
+"use strict";
+
+/* Communication Protocol between the RWS Online Editor and the preview loaded into it.
+ *
+ * Based on passing global events back and forth (events on the window object).
+ * Used for:
+ *
+ * - navigation from one segment to the other (either happening on the editor and
+ * getting propagated to the preview, or happening on the preview - by clicking
+ * a segment - and getting propagated to the editor)
+ *
+ * - segment updates: when the translation for a segment changes, the segment
+ * update flow will yield some piece of string (usually html content) that
+ * will be sent to the preview currently being loaded in the editor
+ *
+ * - showing messages (could not navigate to the segment currently selected
+ * in editor / cannot update the translation for certain segment)
+ */
+
+ // IE compatibility
+ Element.prototype.remove = function () {
+ this.parentElement.removeChild(this);
+}
+
+if (!window.sdlPreviewScriptIncludeGuard) {
+ // when the preview package gets inlined into a single html file, the script can
+ // get included multiple times; we use this guard to only subscribe to the events
+ // once
+ window.sdlPreviewScriptIncludeGuard = true;
+
+ //state
+ var selectedSegmentId = "";
+ var segmentIdToSigCache = {};
+ var initialized = false;
+
+ // names of the events
+ var PREVIEW_SEGMENT_SELECTED = "Preview:segmentSelected";
+ var PREVIEW_SHOW_MESSAGE = "Preview:showMessage";
+ var UE_SEGMENT_SELECTED = "UE:segmentSelected";
+ var UE_UPDATE_SEGMENT = "UE:updateSegment";
+
+ document.addEventListener("DOMContentLoaded", function (event) {
+ /* preparations can be done here */
+ });
+
+ window.addEventListener(UE_SEGMENT_SELECTED, function (event) {
+ // event.detail will contain the id of the segment we need to navigate to
+ // the segment with this id can be highlighted and scrolled into view
+
+ // if the segment cannot be highlighted on the preview:
+ reportError("CannotNavigateToSegment");
+ });
+
+ window.addEventListener(UE_UPDATE_SEGMENT, function(event) {
+ // the id of the segment being updated
+ var segmentId = event.detail.segmentId;
+
+ // the string (html snippet) returned by the segment updater
+ var segmentSnippet = event.detail.snippet;
+
+ /* the contents of the corresponding page element can be changed
+ * here according to the snippet
+ */
+
+ // if the update cannot be done:
+ reportError("PreviewCannotUpdate");
+ });
+}
+
+function reportError(type) {
+ // types currently being used are "CannotNavigateToSegment" and "PreviewCannotUpdate"
+ // TBD if we can support custom messages being sent in the detail attribute here
+
+ window.dispatchEvent(new CustomEvent(
+ PREVIEW_SHOW_MESSAGE,
+ { detail: type }
+ ));
+}
+
+function somethingWasClicked() {
+ // can be handler of onclick on page elements corresponding to segments
+
+ var previousSelection = "...";
+ var segmentId = "...";
+
+ if (segmentId !== previousSelection) {
+ window.dispatchEvent(new CustomEvent(
+ PREVIEW_SEGMENT_SELECTED,
+ { detail: segmentId } // this informs the editor which segment it should navigate to
+ ));
+ }
+}
+```
+
+For dynamic previews, a more comprehensive Javascript API is available that handles communication via postMessage between the iframe and the Online Editor. This includes:
+- Navigation between segments
+- Segment updates with translation changes
+- Error messaging
+- Scroll synchronization for side-by-side preview
+- Segment highlighting and selection
+
+### Session Management and Tenant Separation
+It is up to the app to manage any session state internally and have an expiry mechanism for this.
+Also, any data which is tenant specific needs to be kept separate from any other data and the app also needs to manage tenant separation concerns internally.
+
+### Input Files
+The preview provider works with various types of input files:
+- **PreviewPackageTemplate** - a zip package containing content used in preview generation (XML, HTML, images, CSS, XSLT, Javascript etc.)
+- **Native File** - the native format being translated or previewed (Word, Excel, XML documents etc.)
+- **Annotated Native File** - a native file annotated with special characters encoding segment identifiers and boundaries
+
+### Dynamic Preview Concepts (for outputType: "previewUrl")
+When implementing dynamic previews:
+- The app acts as a web server implementing custom endpoints
+- TLS (Transport Layer Security) must be enabled on all custom endpoints
+- Authorization via hard-to-guess access tokens with TTL support
+- Content can be dynamically updated based on user selections
+- Support for different renderings or views of the same BCM document content
+
+The URL format for dynamic preview endpoints:
+```
+https://my.extension/custom-endpoint?sessionId={sessionId}&tenant={tenantId}&accessToken={hard-to-guess-access-token}&page={pageId}
+```
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Request-Authentication.md b/articles/Extensibility/docs/development/Request-Authentication.md
new file mode 100644
index 0000000..9425ea8
--- /dev/null
+++ b/articles/Extensibility/docs/development/Request-Authentication.md
@@ -0,0 +1,91 @@
+# Request Authentication
+
+Requests made from Trados to the app are authenticated, except for some public endpoints on the app. Getting the current account identity is explained in this article in the [**Trados Claims** section](#trados-claims).
+
+## Endpoints
+
+All but a few of the endpoints are required to check for valid Authentication. The API documentation specifies for each endpoint if authentication is required.
+
+Trados might send the Authorization header even on the endpoints that do not need authentication, but the app is not required to validate them. If the header is sent, the app should either ignore it or validate it. But if the token is not valid, then this should result in a 401/403 result.
+
+> [!NOTE]
+> Note: the provided blueprints (both Java and .NET Core) have authentication implemented and working out of the box. You can skip the rest of this document unless you're interested in the technical details.
+
+## Authorization header
+
+The HTTPS requests are all authenticated using the `x-lc-signature` header using a JWS token. For example:
+
+```
+x-lc-signature:
+```
+
+## JSON Web Signature token
+
+Trados follows the JWS RFCs [\[RFC 7797\]](https://datatracker.ietf.org/doc/html/rfc7797) and [\[RFC 7515\]](https://datatracker.ietf.org/doc/html/rfc7515) for defining the structure of the JSON Web Signature token that contains the signature that validates the authenticity of the request.
+
+If you're already familiar with JWT tokens, you can treat the JWS as a JWT, with the main difference being the token-body component, which is not part of the token (in our Trados implementation) - it is replaced with the hash signature of the request body. All claims are sent in the JWS header.
+
+### JWS validation
+
+The JWS token consists of 3 parts: `..` The 3 parts are Base64url encoded and separated with a dot: '.'. The JWS token that is received in the `x-lc-signature` header has only the header and signature components, with the body missing (`..`).
+
+`` is omitted from the received JWS, following the RFC 7515 - Detached content approach. It should be calculated, when received, on the app side:
+```
+ = Base64url(SHA256(HTTP Payload))
+```
+
+If the request does not contain a body (ex. in the case of GET requests), then it's calculated as an empty string `''`. In that case `` can be replaced with the constant: `47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU` which is equivalent to `Base64url(SHA256(''))`.
+
+Once the `` is calculated, the JWS token should be considered in its entirety as `..`.
+
+The `` on the received JWS token needs to be validated. The validation is done using the public keys that are available at `https://lc-api.sdl.com/public-api/v1/.well-known/jwks.json` (this endpoint is public and does not require authentication).
+
+Since the JWS body is the hash of the HTTP request payload, the JWS token will have all the claims defined in the header segment ``.
+
+JWS `kid` claim is used to identify the public key that the JWS was signed with.
+
+Signing will be done using the SHA256withRSA algorithm which is standard for JWS (`"alg":"RS256"`). But since algorithms change, you should not hard code the algorithms, but always rely on the `alg` claim to identify the signing algorithm.
+
+Once the signature was validated, you should also validate the other claims:
+
+- `iss` - the issuer of the token. Must be `https://languagecloud.rws.com/`. It is required.
+- `aud` - the audience should match `baseUrl` from the descriptor. This ensures that the token was generated for that particular app. It is required.
+- `exp` - expiry time of the token, expired tokens should not be accepted. It is required.
+- `iat` - issued at time. Tokens issued in the future should not be allowed. It is optional and should be validated only if present.
+
+Clock skew should be taken into consideration when validating time claims. A few seconds (up to 60) should be added to validation limits. For example for `iat` claim, it should be checked that it's not issued before `now() - clockSkew`, otherwise with under 1-second clock differences there might be cases where `iat` can be in the future because the receiving server clock is 1 second behind the Trados server, and the token will not validate.
+
+#### Validating multiple audiences
+
+There will always be a single `aud` claim in the JWS. But in the rare case when an App changes `baseUrl`, the received `aud` will be either the old or new `baseUrl`. All operations for accounts that did not yet update to the version with the new `baseUrl` will send `aud` claim with the old `baseUrl`.
+
+The provided blueprints and samples by default handle a single `baseUrl`, and will fail with authentication issues in such a scenario.
+
+In .NET, validating `aud` against multiple audiences is fairly simple. In `appsettings.json` add a key for `previousBaseUrl` set it to the value of previous `baseUrl`. In `Startup.cs` find `services.AddAuthentication` and update it to looks similar to:
+
+```csharp
+services.AddAuthentication(JwsDefaults.AuthenticationScheme)
+ .AddJws(options =>
+ {
+ options.JwksUri = Configuration["Authorization:JwksUri"];
+ options.TokenValidationParameters.ValidIssuer = Configuration["Authorization:Issuer"];
+ options.TokenValidationParameters.ValidAudiences = new[] {
+ Configuration["baseUrl"],
+ Configuration["previousBaseUrl"]
+ };
+ });
+```
+
+In Java, this can be accomplished by adding multiple values, separated by commas, to the `authentication.audience` parameter in the [application.yml](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppBlueprint/src/main/resources/application.yml#L61) file. For example:
+
+```yaml
+authentication:
+ ...
+ audience: https://my.base.url,https://my.previous.base.url
+```
+
+### Trados Claims
+
+Trados can send any number of custom claims (in the JWS header segment), to provide additional information as to the current identity.
+
+`aid` is used for identifying the current Account(known as Tenant). This should be used for any operations that perform account-related operations. For example: saving the configuration to a database should always be tied to an account.
diff --git a/articles/Extensibility/docs/development/Technical-Requirements-And-Best-Practices.md b/articles/Extensibility/docs/development/Technical-Requirements-And-Best-Practices.md
new file mode 100644
index 0000000..0f1e89f
--- /dev/null
+++ b/articles/Extensibility/docs/development/Technical-Requirements-And-Best-Practices.md
@@ -0,0 +1,70 @@
+# Technical Requirements And Best Practices
+
+## Technical requirements for Apps
+
+Most technical requirements are driven by the app's developer. For example, CPU/Memory requirements should be decided by the developer after taking into consideration the particular functionality of the app and its expected load.
+
+For reference, a typical machine translation app built on the .NET Core Blueprint, which adapts a third party translation engine, with 250,000 transactions per month, only requires very minimal hardware resources, with 0.1 CPU and 500 MB RAM.
+
+But there are certain aspects that still need to be covered to ensure secure and resilient operations.
+
+## Framework
+
+Apps can be developed using any framework, but we provide two blueprints to help you get started: one for .NET Core 8 and the other for Java.
+
+## Redundancy
+
+A load balanced, two instance deployment is recommended to ensure there are no interruptions in operation in case of failures, or more importantly, no downtime when a new version is deployed (by using rolling deployments).
+
+This recommended setup can be easily achieved if the application is deployed on a cloud platform.
+
+## Security
+All communication should be secured against interfering and eavesdropping. This includes the communication between the Trados platform and the App, and also between the app and the resources it uses: third party Machine Translation Engines, databases and other resources.
+
+Trados uses two mechanisms to secure the apps communication:
+- HTTPS support is mandatory, and Trados will not communicate with the app over an unsecured HTTP channel, or via a channel with expired or invalid certificates.
+- The app can also validate that the caller is indeed Trados, by verifying the signature in each call with the [Public Key](https://languagecloud.sdl.com/lc/api-docs/8c6f7b35af0ea-list-public-keys) available from Trados on an HTTPS endpoint.
+
+An additional security mechanism used by Trados is signing the request body. This provides an extra layer of validation, but it can also be used in case the application gets compromised, and an analysis is required to identify which messages are authentic and which aren't. For that, all incoming messages need to be logged or audited in some form.
+
+By following these guidelines, app developers can ensure that their code is secure and resistant to attacks, protecting sensitive data and maintaining the confidentiality, integrity, and availability of their applications, while also staying aware of and addressing any potential vulnerabilities in their dependencies:
+
+- Input Validation: Always validate user inputs to ensure they are within the expected range and format. This helps to prevent injection attacks such as SQL injection or Cross-Site Scripting (XSS).
+- Secure Configuration: Configure your app securely by avoiding default settings and keeping all passwords and sensitive information out of code.
+- Secure Coding Practices: Follow secure coding practices such as avoiding hardcoded passwords, using secure coding patterns and libraries, and avoiding dynamic code execution.
+- Access Control: Ensure that access controls are in place to prevent unauthorized access to sensitive data or functions within the application.
+- Error Handling: Implement proper error handling to prevent sensitive information from being exposed to attackers.
+- Manage Vulnerable Dependencies: Keep track of the dependencies used in your application and regularly check for any known vulnerabilities in those dependencies. Update to the latest version of the dependency as soon as possible to reduce the risk of exploitation.
+
+## Logging
+
+Logging is required for tracking the flow of operations and for debugging any possible issues. Logging is already set up for both blueprints, but you need to adjust the template of the logs and their destinations.
+
+Important components in the logs, already present in the blueprints, include:
+- timestamp - this should have a timezone, to avoid any confusion of whether it's local time or UTC.
+- trace id - each request sent from Trados contains a trace id which can be used to track a complete flow. This is also propagated in the code from the moment a request is performed until a response is returned.
+- thread id
+- host/node name - this depends on your infrastructure setup, and we recommend having it logged, especially if you have more than one instance running.
+- account id
+- message - an informative description of what is happening
+- error and stack trace
+
+Do not log sensitive information in the logs, like personal identification information, API keys, incoming authentication details or signatures.
+
+## Metrics
+
+Metrics help answer questions like:
+- Usage - how many/how much?
+- Hardware requirements - are the currently allocated resources enough? Do we need to scale up or can we scale down to save on running costs?
+
+This is not a strict requirement, but it is strongly recommended to have some form of metrics set up. This should be set up in such a way to enable you to:
+- Track the number of failed request/errors.
+- Track the total number of transactions.
+- Track the timing of the transactions/requests (this can be addressed by various metrics like `max`, `min`, `median`, `percentile`).
+- Monitor CPU and Memory utilization. This should be used to correlate transactions with resource usage.
+
+## Error Responses
+
+It's important to follow the specification for the endpoints when it comes to returning error responses. Each endpoint defines a set of expected error responses and the error response model. Implementing the contract correctly allows Trados to parse the response correctly and, in some situations, to handle the error and make decisions on it.
+
+Endpoints can have a set of predefined error codes that Trados can interpret. One such example would be the `invalidConfiguration`. Error responses can even pinpoint further the source of the problem, in the `details` array that might indicate, for example, the actual field with the incorrect value, along with a corresponding code, for example, `invalidValue` or `nullValue`.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Tehnical-Requirements-And-Best-Practices.md b/articles/Extensibility/docs/development/Tehnical-Requirements-And-Best-Practices.md
new file mode 100644
index 0000000..0f1e89f
--- /dev/null
+++ b/articles/Extensibility/docs/development/Tehnical-Requirements-And-Best-Practices.md
@@ -0,0 +1,70 @@
+# Technical Requirements And Best Practices
+
+## Technical requirements for Apps
+
+Most technical requirements are driven by the app's developer. For example, CPU/Memory requirements should be decided by the developer after taking into consideration the particular functionality of the app and its expected load.
+
+For reference, a typical machine translation app built on the .NET Core Blueprint, which adapts a third party translation engine, with 250,000 transactions per month, only requires very minimal hardware resources, with 0.1 CPU and 500 MB RAM.
+
+But there are certain aspects that still need to be covered to ensure secure and resilient operations.
+
+## Framework
+
+Apps can be developed using any framework, but we provide two blueprints to help you get started: one for .NET Core 8 and the other for Java.
+
+## Redundancy
+
+A load balanced, two instance deployment is recommended to ensure there are no interruptions in operation in case of failures, or more importantly, no downtime when a new version is deployed (by using rolling deployments).
+
+This recommended setup can be easily achieved if the application is deployed on a cloud platform.
+
+## Security
+All communication should be secured against interfering and eavesdropping. This includes the communication between the Trados platform and the App, and also between the app and the resources it uses: third party Machine Translation Engines, databases and other resources.
+
+Trados uses two mechanisms to secure the apps communication:
+- HTTPS support is mandatory, and Trados will not communicate with the app over an unsecured HTTP channel, or via a channel with expired or invalid certificates.
+- The app can also validate that the caller is indeed Trados, by verifying the signature in each call with the [Public Key](https://languagecloud.sdl.com/lc/api-docs/8c6f7b35af0ea-list-public-keys) available from Trados on an HTTPS endpoint.
+
+An additional security mechanism used by Trados is signing the request body. This provides an extra layer of validation, but it can also be used in case the application gets compromised, and an analysis is required to identify which messages are authentic and which aren't. For that, all incoming messages need to be logged or audited in some form.
+
+By following these guidelines, app developers can ensure that their code is secure and resistant to attacks, protecting sensitive data and maintaining the confidentiality, integrity, and availability of their applications, while also staying aware of and addressing any potential vulnerabilities in their dependencies:
+
+- Input Validation: Always validate user inputs to ensure they are within the expected range and format. This helps to prevent injection attacks such as SQL injection or Cross-Site Scripting (XSS).
+- Secure Configuration: Configure your app securely by avoiding default settings and keeping all passwords and sensitive information out of code.
+- Secure Coding Practices: Follow secure coding practices such as avoiding hardcoded passwords, using secure coding patterns and libraries, and avoiding dynamic code execution.
+- Access Control: Ensure that access controls are in place to prevent unauthorized access to sensitive data or functions within the application.
+- Error Handling: Implement proper error handling to prevent sensitive information from being exposed to attackers.
+- Manage Vulnerable Dependencies: Keep track of the dependencies used in your application and regularly check for any known vulnerabilities in those dependencies. Update to the latest version of the dependency as soon as possible to reduce the risk of exploitation.
+
+## Logging
+
+Logging is required for tracking the flow of operations and for debugging any possible issues. Logging is already set up for both blueprints, but you need to adjust the template of the logs and their destinations.
+
+Important components in the logs, already present in the blueprints, include:
+- timestamp - this should have a timezone, to avoid any confusion of whether it's local time or UTC.
+- trace id - each request sent from Trados contains a trace id which can be used to track a complete flow. This is also propagated in the code from the moment a request is performed until a response is returned.
+- thread id
+- host/node name - this depends on your infrastructure setup, and we recommend having it logged, especially if you have more than one instance running.
+- account id
+- message - an informative description of what is happening
+- error and stack trace
+
+Do not log sensitive information in the logs, like personal identification information, API keys, incoming authentication details or signatures.
+
+## Metrics
+
+Metrics help answer questions like:
+- Usage - how many/how much?
+- Hardware requirements - are the currently allocated resources enough? Do we need to scale up or can we scale down to save on running costs?
+
+This is not a strict requirement, but it is strongly recommended to have some form of metrics set up. This should be set up in such a way to enable you to:
+- Track the number of failed request/errors.
+- Track the total number of transactions.
+- Track the timing of the transactions/requests (this can be addressed by various metrics like `max`, `min`, `median`, `percentile`).
+- Monitor CPU and Memory utilization. This should be used to correlate transactions with resource usage.
+
+## Error Responses
+
+It's important to follow the specification for the endpoints when it comes to returning error responses. Each endpoint defines a set of expected error responses and the error response model. Implementing the contract correctly allows Trados to parse the response correctly and, in some situations, to handle the error and make decisions on it.
+
+Endpoints can have a set of predefined error codes that Trados can interpret. One such example would be the `invalidConfiguration`. Error responses can even pinpoint further the source of the problem, in the `details` array that might indicate, for example, the actual field with the incorrect value, along with a corresponding code, for example, `invalidValue` or `nullValue`.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Trados-Cloud-API.md b/articles/Extensibility/docs/development/Trados-Cloud-API.md
new file mode 100644
index 0000000..4e6b403
--- /dev/null
+++ b/articles/Extensibility/docs/development/Trados-Cloud-API.md
@@ -0,0 +1,40 @@
+---
+stoplight-id: ca24im2xg3ra8
+---
+
+# Trados Cloud Platform API
+
+Communication to Trados Cloud Platform API is also authenticated and the process is described in the [Trados Cloud Platform API documentation](https://languagecloud.sdl.com/lc/api-docs).
+
+## Credentials
+
+When an app is registered, credentials (`clientId` and `clientSecret`) are sent to the app with the `REGISTERED` lifecycle event on the [App Lifecycle endpoint](../../api/Extensibility-API.v1-fv.html#/operations/Lifecycle).
+
+An example payload:
+
+```json
+{
+ "id": "REGISTERED",
+ "timestamp": "2019-08-24T14:15:22Z",
+ "data": {
+ "clientCredentials": {
+ "clientId": "",
+ "clientSecret": ""
+ }
+ }
+}
+```
+
+Here `clientId` and `clientSecret` represent the credentials for the Trados Cloud Platform API and can be used for getting a token for communicating with the Trados Cloud Platform API, as described by the [Trados Cloud Platform API documentation](https://languagecloud.sdl.com/lc/api-docs/ZG9jOjExMDcyMQ-authentication).
+
+When an app is installed on an account, a service user will be created in Trados and an event will be sent on the [App Lifecycle endpoint](../../api/Extensibility-API.v1-fv.html#/operations/Lifecycle) with event `id` being `INSTALLED`.
+
+Account ID should always be used from the request authentication header token. This is built in in the provided blueprints.
+
+## Scopes
+
+Access to the Trados Cloud Platform API is not allowed implicitly from the app. In order for the Trados Cloud Platform API credentials to have the permissions to read or edit data in Trados, the desired scopes must be listed in the app's `scopes` property in the descriptor.
+
+Scopes that can be viewed as a list of permissions that need to be granted to the service user (and are shown to and approved by the administrator who installs the app on the account).
+
+For example, to request the permission to edit data on an account, the `TENANT` scope must be specified in the `scopes` in the descriptor. For read only access, `TENANT_READ` is enough. The scopes are cumulative, so if you specify `TENANT`, you don't have to specify `TENANT_READ`.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/UI-App-custom-elements-locations.md b/articles/Extensibility/docs/development/UI-App-custom-elements-locations.md
new file mode 100644
index 0000000..b0a5e82
--- /dev/null
+++ b/articles/Extensibility/docs/development/UI-App-custom-elements-locations.md
@@ -0,0 +1,283 @@
+---
+stoplight-id: gwyrrbtyn4j2i
+tags: [Development]
+---
+
+# Custom Elements and Locations
+
+The platform supports the addition of various UI elements, including **buttons** (generic, link, and dropdown) and **panels** (generic, sidebar, and tab).
+These elements can be incorporated into specific sections of the user interface in the **Inbox, Orders, Projects and Reports** areas.
+
+
+
+\* The `sidebarBox` element targeting the `project-details-dashboard-sidebar` location key is also displayed in the Projects list view when a project in the list is selected.
diff --git a/articles/Extensibility/docs/development/UI-App-development-guide.md b/articles/Extensibility/docs/development/UI-App-development-guide.md
new file mode 100644
index 0000000..1b3ba36
--- /dev/null
+++ b/articles/Extensibility/docs/development/UI-App-development-guide.md
@@ -0,0 +1,247 @@
+---
+stoplight-id: f15btr2xmf7u9
+tags: [Development]
+---
+
+# User Interface App Development Guide
+
+UI extensions offer the possibility to add custom user interface elements and functionality. Custom [buttons and panels can be added to specific places](UI-App-custom-elements-locations.md) within the user interface.
+
+> [!CAUTION]
+> #### This feature is currently in BETA.
+> Please note that in a future phase, we will introduce significant changes as we move towards the official release:
+> * The current implementation utilizes the authorization token of the logged-in Trados user for the Trados Cloud Platform API and the app's own API calls. In a future update, a different authorization token will be introduced for these operation.
+> * As a result, access to the Trados Cloud Platform API functionality of a UI extension app will be governed not only by the Trados user's permissions but also by the app's [scopes](App-Descriptor.md#scopes).
+> * A UI extension's JavaScript file will be loaded in an isolated context, independent from Trados.
+> * The communication model between App UI and Backend will change in the final version and will have to be redesigned.
+
+A UI extension is defined in the app [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) in the `extensions` array.
+
+```json
+{
+ ...
+ "extensions": [
+ {
+ "extensionPointId": "lc.ui",
+ "id": "SAMPLE_UI_EXTENSION_ID",
+ "name": "SAMPLE_UI_EXTENSION_NAME",
+ "description": "SAMPLE_UI_EXTENSION_DESCRIPTION",
+ "extensionPointVersion": "1.0",
+ "configuration": {
+ "scriptPath": "/PATH/TO/JAVASCRIPT/FILE.JS",
+ "endpoints": {}
+ }
+ }
+ ]
+ ...
+}
+```
+
+The `extensionPointId` is always **"lc.ui"**.
+
+The `configuration`'s `scriptPath` is the path of the JavaScript file which will be loaded in the Trados user interface. The path is relative to the `basePath` in the [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor). This JavaScript file contains the code describing the custom elements that will be added to the user interface and their functionality.
+
+## Prerequisites
+
+**Node.js**
+
+If you don't already have Node.js installed, you can download the most recent LTS (Long-Term Support) version of Node.js from [nodejs.org](https://nodejs.org/en/download).
+
+### Dependencies
+
+- [@trados/trados-ui-extensibility](https://www.npmjs.com/package/@trados/trados-ui-extensibility) v0.1.5
+ - [GitHub repository](https://github.com/RWS/trados-ui-extensibility)
+ - [GitHub wiki](https://github.com/RWS/trados-ui-extensibility/wiki)
+
+### Development dependencies
+
+- [ts-loader](https://www.npmjs.com/package/ts-loader)
+- [webpack](https://npmjs.com/package/webpack)
+- [webpack-cli](https://www.npmjs.com/package/webpack-cli)
+
+## Getting started
+
+> [!NOTE]
+> Make sure you are familiar with Trados app development and testing presented in the [Getting Started with Blueprints](blueprints/Getting-Started.md) and [Testing](blueprints/Testing.md) articles.
+
+1. Download the [.NET sample app which contains a UI extension](https://github.com/RWS/language-cloud-extensibility/tree/main/samples/dotnet/UISampleApp).
+ - The sample can be run out of the box with the same requirements as for the blueprint, a local Mongo database. For different setups please see the [blueprint](blueprints/Dot-Net-Blueprint.md) and [testing](blueprints/Testing.md) articles as you'll need to adjust your configuration.
+2. Open the sample app solution in your IDE of choice.
+3. Follow the steps presented in the [Getting Started with Blueprints](blueprints/Getting-Started.md) and [Testing](blueprints/Testing.md) articles to get your app running, then [register](../appManagement/Registering.md) and [install](../appManagement/Installing.md) it.
+4. Open Trados in a browser and go to the Projects section. Notice some custom elements were added by the sample app's UI extension.
+5. To alter the UI extension, make your changes in the [Rws.LC.UISampleApp/Resources/frontend](https://github.com/RWS/language-cloud-extensibility/tree/main/samples/dotnet/UISampleApp/Rws.LC.UISampleApp/Resources/frontend) folder, then open a terminal from the `Rws.LC.UISampleApp/Resources/frontend` location.
+6. Install the dependencies for your UI extension by running this command:
+ ```
+ npm install
+ ```
+7. Build the UI extension to output the Javascript file that will be loaded by Trados for your UI extension:
+ ```
+ npm run build
+ ```
+
+ You can also build the UI extension using development mode:
+
+ ```
+ npm run build-dev
+ ```
+
+ - The `build` (or `build-dev`) command will create a `my-ui-extension-script.js` file in `Rws.LC.UISampleApp/Resources/frontend/dist/`. This is the path you need to use in the [descriptor](../../api/Extensibility-API.v1-fv.html#/operations/descriptor) for your extension's configuration `scriptPath`, for example `Rws.LC.UISampleApp/Resources/frontend/dist/my-ui-extension-script.js`.
+
+ - You can change the `my-ui-extension-script.js` file name by editing
+ - the `module.exports`' `output.filename` property in `Rws.LC.UISampleApp/Resources/frontend/webpack.config.js` and
+ - the extension's configuration `scriptPath` field.
+ > [!NOTE]
+ > If your app is already registered, after changing the extension's configuration `scriptPath` field you need to [update](../appManagement/Updating.md) your app to a new version.
+
+ - Once you have built your new JavaScript file, refresh the Trados browser tab to see your changes.
+
+## Sample app UI code overview
+Open the [sample app which contains a UI extension](https://github.com/RWS/language-cloud-extensibility/tree/main/samples/dotnet/UISampleApp/) in your IDE. Open the [index.ts](https://github.com/RWS/language-cloud-extensibility/blob/main/samples/dotnet/UISampleApp/Rws.LC.UISampleApp/Resources/frontend/index.ts) file.
+
+```typescript
+import {
+ trados,
+ ExtensionElement,
+ ExtensibilityEventDetail
+} from "@trados/trados-ui-extensibility";
+```
+The [`trados`](https://github.com/RWS/trados-ui-extensibility/wiki/Variable.trados) import is the main import in your UI extension and allows you to use the available extensibility functionality. The [`ExtensionElement`](https://github.com/RWS/trados-ui-extensibility/wiki/Type.ExtensionElement) and [`ExtensibilityEventDetail`](https://github.com/RWS/trados-ui-extensibility/wiki/Type.ExtensibilityEventDetail) imports are TypeScript types.
+
+Your UI extension adds custom elements to the Trados UI. Define them in an array of type [`ExtensionElement`](https://github.com/RWS/trados-ui-extensibility/wiki/Type.ExtensionElement).
+```typescript
+const elements: ExtensionElement[] = [
+ {
+ elementId: "myCustomButton",
+ location: "project-details-toolbar",
+ text: "My Custom Button",
+ type: "button",
+ actions: [
+ {
+ eventType: "onclick",
+ eventHandler: (detail: ExtensibilityEventDetail) => {
+ console.log("My custom button was clicked", detail.project);
+ },
+ payload: ["project"]
+ }
+ ]
+ }
+];
+```
+Each custom element has an `elementId`, a `type`, and a `location`. Each element in your extension must have a unique `elementId`. The `type` and `location` properties can only have values described in [Custom elements and locations](UI-App-custom-elements-locations.md). Other properties depend on the custom element's `type`. For example, the `menu` property is only available for the `button` element type and indicates the button has a dropdown menu.
+
+Custom elements can have an `actions` property, which is an array of objects describing the behavior of the custom element in the case of specific events. The supported values for an `action`'s `eventType` are:
+* `onrender` for all element types and
+* `onclick` which is specific to `button` elements.
+
+An `action`'s `payload` property indicates the data portions available in the Trados UI that will be send inside the event detail to be consumed by the event handler function.
+
+In the code snippet above, the `onclick` event is handled by the `eventHandler` function which has a single argument called `detail`. Since this `action`'s `payload` is an array containing the `project` data selector key, the `eventHandler`'s `detail` argument will also contain a `project` field representing the current project object in the Trados UI.
+
+After you have defined the custom elements your UI extension will add to the Trados UI in the `elements` array, you must enable communication between your UI extension and Trados UI by calling the `trados.onReady` function.
+
+```typescript
+trados.onReady(elements, () => {
+ console.log("Communication with Trados UI enabled");
+});
+```
+The `onReady` function inside the `trados` object has two arguments: the `elements` array describing all custom elements your UI extension adds to the Trados UI, and a callback function that is called once your UI extension's script is loaded in the browser and communication with Trados UI is available.
+
+### Calling your own app's API
+In the sample app code, open the index.ts file and find the element with id `callAppApiButton`. The `actions` field has the `callAppApiButtonClicked` eventHandler. Go to this function's implementation in `handlers/buttonsHandlers.ts` and notice the `trados.callAppApi` function being called:
+
+```typescript
+trados.callAppApi({
+ url: `api/greeting/`,
+ method: "GET"
+})
+```
+
+The object passed as argument has the `url` property set to `api/greeting` which is the route of the endpoint implemented in `GreetingController.cs` in the `Controllers` folder. The second property is the `method` set to `GET`. The argument object has two mandatory properties, `url` and `method`, and can have other properties depending on your use case, such as `params`, `formData`, `body`, `headers`.
+
+The `callAppApi` function returns a `Promise`, so you can use `then`/`catch` to handle the API call's response.
+
+### Calling the Trados Cloud Platform API
+In the sample app code, open the index.ts file and find the element with id `callPublicApiButton`. The `actions` field is an array of two items, one handling the `onrender` event and the other handling the `onclick` event. Go to the `callPublicApiButtonClicked` function's implementation in `handlers/buttonsHandlers.ts` and notice the `tradosProjectTemplateApi` function being called:
+
+```typescript
+tradosProjectTemplateApi()
+ .getProjectTemplate({
+ projectTemplateId: projectTemplateId,
+ ...trados.getRegistrationResult()
+ })
+```
+
+Each Trados Cloud Platform API needs to be imported separately from `@trados/trados-ui-extensibility` and is represented by a function. In this example, the `tradosProjectTemplateApi` function is imported and called to initialize the API. The next function call, `getProjectTemplate`, is the call to a specific endpoint from the `tradosProjectTemplateApi`.
+
+The `projectTemplateId` is the mandatory field needed for the `getProjectTemplate` API endpoint call. Notice the `...trados.getRegistrationResult()` passed inside the argument. This extends the argument object with additional mandatory fields like the account identifier and authorization token.
+
+For each Trados Cloud Platform API, all endpoint functions function return a `Promise`, so you can use `then`/`catch` to handle the API call's response.
+
+### Using data available in the Trados UI
+In the sample app code, open the index.ts file and find the element with id `myGetUiDataButton`. The `actions` field has the `myGetUiDataButtonClicked` eventHandler. Go to this function's implementation in `handlers/buttonsHandlers.ts` and notice the `trados.getLocalData` function being called:
+
+```typescript
+trados.getLocalData(trados.contexts.projects, trados.dataSelectors.selectedProjects)
+```
+
+The `getLocalData` function provides access to portions of data currently available in the Trados UI.
+
+The first argument is the `trados.contexts.projects`. This indicates in which main section of the application the needed data resides.
+
+The second argument is the data portion selector, in this example `trados.dataSelectors.selectedProjects`. This will provide the array of `Project` objects selected by the user in the Projects list view.
+
+The `getLocalData` function returns a `Promise`, so you can use `then`/`catch` to handle the success or failure of the data retrieval.
+
+### Changing a custom element
+In the sample app code, open the index.ts file and find the element with id `myDropdownButton`. Notice that it has a `menu` property which is an array describing the dropdown menu options of the button. Besides the `icon` and `text` properties, each menu option has a `value` set to an arbitrary string.
+Scroll down to the button's `actions` property and notice the `onclick` `eventHandler` function. It contains a `switch` statement parsing the `value` received from the `onclick` event's detail object. When a user clicks a dropdown menu option, its `value` is passed to the `eventHandler`. Every dropdown menu option in `myDropdownButton` updates properties of another custom element in the UI extension, `myTargetButton`. Notice the `trados.updateELement` function being called:
+
+```typescript
+trados.updateElement("myTargetButton", { disabled: true })
+```
+
+The first argument is the `id` property of the custom element that will be updated.
+
+The second argument is an object containing the properties to update and their new values.
+
+The `id`, `type` and `location` of a custom element can not be changed. Properties that can be changed depend on the custom element's type:
+* custom elements with type `button` can have these properties changed: `disabled`, `hidden`, `icon`, `text`, `menuItems`. For each object in `menuItems` you can also change `disabled`, `hidden`, `icon`, `text`. When setting the `icon` property of a button or dropdown menu option, use string values from [Font Awesome](https://fontawesome.com/icons).
+* custom elements with type `panel`, `sidebarBox`, `tab` can only have their `text` property changes. To change the content, see **Adding content to a panel, sidebarBox or tab**.
+
+The `updateElement` function returns a `Promise`, so you can use `then`/`catch` to handle the success or failure of the update.
+
+### Navigating inside Trados UI
+In the sample app code, open the index.ts file and find the element with id `myNavigateButton`. The `actions` field has the `myNavigateButtonClicked` eventHandler. Go to this function's implementation in `handlers/buttonsHandlers.ts` and notice the `trados.navigate` function being called:
+
+```typescript
+trados.navigate(projectTemplatePath, trados.navigationTypes.route)
+```
+
+The first argument is the path to which the application will navigate. Note this is not a URL, but only the portion after `/lc/{myAccount}/` in the Trados URL. In the example, it's `resources/project-templates/${projectTemplateId}`.
+
+The second argument is optional and indicates the type of routing navigation will use, either `route` or `load`. The default is `route` and will cause Trados UI to navigate to the desired path without a page load. The `load` navigation type will cause the Trados UI to reload to the new path.
+
+### Adding content to a panel, sidebarBox or tab
+In the sample app code, open the index.ts file and find the element with id `myCustomPanel`. The `actions` field has the `myCustomPanelRendered` eventHandler. Go to this function's implementation in `handlers/panelsHandlers.ts` and notice this code line:
+
+```typescript
+const panelContentWrapper = document.getElementById(detail.domElementId);
+```
+
+The `onrender` event's handler is passed the `detail` argument which contains the `domElementId` property. This is the DOM element to which you can add HTML content using JavaScript.
+
+Note that adding `script` tags is not allowed and scripts from sources that are not white-listed in Trados are blocked. Adding `script` tags that are served from the same source as your app is also not allowed. Only the script file set in your app's descriptor will be loaded by Trados.
+
+
+### Notes
+
+> [!NOTE]
+> #### Custom elements display order
+> Within a single UI extension: custom elements in your extension that have the same `location` are displayed in the same order in which they are present in your `ExtensionElement`s array.
+>
+> With multiple UI extensions: the display order is determined by the order in which each UI extension's script file is loaded in the Trados UI.
+
+
+> [!NOTE]
+> #### Unexpected re-renders
+> A custom element's `onrender` event can be triggered multiple times depending on state changes in the Trados UI and depending on user's interactions with Trados UI. Subsequently, the corresponding `eventHandler` gets executed multiple times. You can add logic specific to you use-case to protect your UI extension against unneeded execution of `onrender` `eventHandler`.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Verification-App-development-guide.md b/articles/Extensibility/docs/development/Verification-App-development-guide.md
new file mode 100644
index 0000000..b6a79f4
--- /dev/null
+++ b/articles/Extensibility/docs/development/Verification-App-development-guide.md
@@ -0,0 +1,356 @@
+---
+stoplight-id: 9r7ku59767q11
+---
+
+
+# Verification Provider
+
+## Overview
+
+Trados provides verification functionality on translatable content (source and/or target) in several ways:
+
+- Batch Verification Task (set in project workflows)
+- Editor Document Verification Task
+- Editor Segment-level Verification operation
+
+The first two verification tasks validate the whole document, whereas the last operation, validates a single segment.
+
+For document validation, native verification is also possible. This allows for validation of a native file or a native annotated file. The difference between an annotated file and a non-annotated file is that the first allows for the generation of location information and the second does not. For native verification, a verification resource package may also be retrieved by the extension. This would contain ancillary files such as schemas, for example, in the case of XML validation.
+
+Trados supports a set of internal verifiers which are fixed in nature and the user can decide, through settings, what will be verified using these. Some of them are, for example:
+
+- QA Checker
+- Tag Verifier
+
+To allow for extending of the verification functionality, Trados supports the creation of extensible or external verifiers. These are hosted in apps which are essentially a self-contained serviced offering the verification functionality.
+
+Extensible verifiers would normally only support a small set of verification types, such as a target segment length check (against the length of the source) for example, or perhaps, a punctuation checker.
+
+There are 2 types of verification which are supported by extensibility:
+ - Bilingual Document Verification
+ - Native File Verification
+
+ With Bilingual Document Verification, the verifier has access to the BCM document and can validate each segment as required
+
+ Native File Verification validates the native source or target file. This file might also be annotated to allow for the easy determination of segment identifiers. An example of native file verification would be schema validation on an XML file. The aim of native verification is to establish if the translation process has broken any of the document structure and rendered an invalid document.
+
+Each verifier will generate a set of error or warning messages based on the type of validation they perform. The user can change validation settings in the LC UI Project Settings which will affect how or when the messages are generated. External verifiers also have the option to specify resource packages in the settings which will allow the user to upload support files required during the validation process. This option is verifier specific as not all verifiers might require a package.
+
+The user can see generated verification messages in the Editor UI and can choose to ignore certain messages by message type or individually, depending on their needs. They can subsequently un-ignore them at a later stage if desired.
+Verifiers may also provide localized messages which can be displayed in the same language the Editor UI is presenting in.
+
+Flows:
+
+
+
+
+
+#### Notes on the Flow Diagrams
+
+The ***StartVerification*** request initiates the background job on the extension. The background job will be responsible for generating the verification messages.
+
+The DownloadDependencyFiles calls to the Trados Cloud Platform API implies using various URLs to call endpoints as defined in the ***StartVerification*** request defined below. These resources can include ***Native files***, ***Native annotated files***, ***BCM documents***, ***Verification Resource Packages***, ***Language Resource Templates*** and ***Translation Engine resources***.
+
+The PublishMessages endpoint is used to publish batches of verification messages as they are generated by the extension to the Trados Cloud Platform API. See below for more details. The `publishMessageUrl` is defined in the initial ***StartVerification*** request.
+
+The PublishEndResult is a call to the `callbackUrl` which is defined in the ***StartVerification*** request. This is called to indicate that all messages have been generated by the extension. Please see below for more details.
+
+### App implementation overview
+The app receives a VerifyDocument request from Trados. The request specifies certain URLs relating the the required resources the app will need for performing its verification task in addition to callback URLs for publishing verification messages and finalizing the operation.
+
+These resources are downloaded to the app via the Trados Cloud Platform API and can be stored locally during the verification operation.
+
+When the request is received, the app responds with 201(Created) and starts a background job which will generate the verification messages. For each verification error or warning the app creates, it needs to send this back to Trados via the Trados Cloud Platform API. These messages may be grouped into batches to minimize chatty behavior between the app and the Trados Cloud Platform API.
+
+The app may also receive a request to verify a single segment. All interactions between the app and Trados Cloud Platform API are via REST calls.
+
+### API Overview
+The extensible verifier API consists of a number of endpoints - an overview of their purpose is given here:
+
+A verification extension defines the following in its descriptor:
+
+```json
+{
+ "extensionPointId": "lc.verificationprovider",
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "extensionPointVersion": "1.0",
+ "configuration": {
+ "endpoints": {
+ "lc.verification.startverification": "string",
+ "lc.verification.verifysegment": "string",
+ "lc.verification.getmessagesbyculture": "string",
+ "lc.verification.getsettingsschema": "string"
+ },
+ "validationInputType": "string",
+ }
+}
+```
+The extensionPointId must always be ***"lc.verificationprovider"***
+
+The validationInputType defines which type of validation will happen based on the input document:
+- BilingualDocument
+- NativeSource
+- NativeTarget
+- NativeAnnotatedTarget
+
+The respective download URL(s) will be provided in the *StartVerification* request and the extension must download and store these resources as required.
+
+- `endpoints` - the required endpoints for the verification extension, should be relative to your `baseUrl`.
+ - `lc.verification.startverification` - the endpoint used to start the verification operation. For ex: `/verify/document`.
+ - `lc.verification.verifysegment` - the endpoint used to verify a single segment. For ex: `/verify/segment`.
+ - `lc.verification.getmessagesbyculture` - the endpoint used to retrieve localized messages. For ex: `/messages`.
+ - `lc.verification.getsettingsschema` - the endpoint used to retrieve the settings schema. For ex: `/schemas`.
+
+There are four endpoints which the extension supports:
+
+- StartVerification
+- VerifySegment
+- GetMessagesByCulture
+- GetSettingsSchema
+
+There are described in a little more detail here:
+
+##### StartVerification
+This endpoint is called by Trados to initiate the document verification operation. Generally, a background job is started when this call is made and it returns 201(Created)
+The background job then prepares batches of verification messages which it then publishes to Trados via the Trados Cloud Platform API using the PublishMessages endpoint URL which is provided in the initial StartVerification request. Please see the API documentation for more details:
+[StartVerification](../../api/Extensibility-API.v1-fv.html#/operations/VerificationProviderStartVerification)
+
+Example:
+```html
+POST https://your-app.com/verify/document
+```
+
+The request for StartVerification is shown below:
+
+```json
+{
+ "inputResourceDetails": {
+ "nativeFileUrl": "string",
+ "bilingualDocumentUrl": "string",
+ "bilingualDocumentVersion": 0,
+ "nativeAnnotatedFileUrl": "string",
+ "languageResourceTemplateId": "string",
+ "verificationResourcePackageUrl": "string",
+ "translationProfileId": "string"
+ },
+ "callbackUrl": "string",
+ "sourceLanguage": "string",
+ "targetLanguage": "string",
+ "publishMessageUrl": "string",
+ "verifierSettings": {},
+ "sessionId": "string"
+}
+```
+`inputResourceDetails` - contains all relevant fields relating to the inputs for the verification operation - this includes:
+
+`nativeFileUrl` - a download URL for retrieving the native file. This is only used in the context of native file verification such as XML schema validation
+
+`bilingualDocumentUrl` - a download URL for retrieving the bilingual document (BCM) - this is used in the context of document validation
+
+`bilingualDocumentVersion` - the version of the document which is to be used for validation
+
+`nativeAnnotatedFileUrl` - a download URL for retrieving the native annotated file. This is only used in the context for native file verification where annotated information is also required. This annotated information can be used to determine segment IDs which would be used in reporting the error location
+
+`languageResourceTemplateId` - Id used when retrieving a Language Resource Template. Certain validations might require access to this.
+
+`verificationResourcePackageUrl` - a download URL for retrieving the verification resource package. This would be used in the context of native file validation, for instance, where a schema and any ancillary files might be needed for XML validation.
+
+`translationProfileId` - this ID can be used to retrieve TranslationEngine resources. An example of its use might be for a terminology verifier.
+
+`callbackUrl` - this endpoint is called when the validation operation is completed.
+
+`sourceLanguage` - source language code
+
+`targetLanguage` - target language code
+
+`publishMessageUrl` - endpoint called to publish batches of verification messages to the Trados Cloud Platform API
+
+`verifierSettings` - a JSON object representing any settings for this extension - these are extension specific and are defined in a JSON schema as detailed below
+
+`sessionId` - a unique ID associated with this particular verification request
+
+##### PublishMessages Body
+The PublishMessage endpoint should be called with batches of verification messages, as they are generated by the background job. The model used for defining these batches is shown below:
+
+```json
+{
+ "messages": [
+ {
+ "id": 1,
+ "messageType": "string",
+ "verifier": "string",
+ "level": "string",
+ "segmentId": "string",
+ "tagId": "string",
+ "isSource": "bool",
+ "messageArguments": [
+ "string"
+ ],
+ "segmentLocation": {
+ "fileId": "string",
+ "paragraphUnitId": "string",
+ "segmentNumber": "string"
+ },
+ "messageLocation": {
+ "fromLocation": 0,
+ "toLocation": 0
+ }
+ }
+ ],
+ "sessionId": "string"
+}
+```
+
+`messages` - an array of messages
+
+Each message contains the following fields:
+
+`id` - a one-based index of the message generated by the extension. The first message should have an id of '1' and subsequent messages should be consecutively numbered 2,3,4 etc...
+
+`messageType` - the message type identifier. This should be a string ID which is pre-pended with the extension ID
+
+`verifier` - this will be the same as the extension ID
+
+`level` - error level of this message
+
+`segmentId` - the segment ID in which the error occurs
+
+`tagId` - the id of the tag which the error relates to
+
+`isSource` - a boolean indicating if the error/warning relates to the source or target
+
+`messageArguments` - an array of the arguments for the relevant message defined for this messageType. The message is usually stored as a resource with placeholders in the extension and is returned by the ***GetMessagesByCulture*** endpoint described below - for each placeholder in the message, an argument should exist in this array
+
+`segmentLocation` - the location of the segment
+
+`messageLocation` - the offsets within the segment representing the error span
+
+##### VerifySegment
+This endpoint is called by Trados to validate an individual segment. This endpoint responds with a collection of messages which relate to any issues found for this segment. Please see the API documentation for more details:
+[VerifySegment](../../api/Extensibility-API.v1-fv.html#/operations/VerificationProviderVerifySegment)
+
+Example:
+```html
+POST https://your-app.com/verify/segment
+```
+
+The request is structured as follows:
+
+```json
+{
+ "fragment": {},
+ "languageResourceTemplateId": "4db79181-4ff4-4d01-8e33-44e7520ac6a6",
+ "translationProfileId": "string",
+ "verifierSettings": {},
+ "sourceLanguage": "string",
+ "targetLanguage": "string",
+ "segmentLocation": {
+ "fileId": "string",
+ "paragraphUnitId": "string",
+ "segmentNumber": "string"
+ }
+}
+```
+
+`fragment` - a json object containing a BCM fragment
+`languageResourceTemplateId` - Id of the language resource template to be requested for this session
+`translationProfileId` - Id used to retrieve translation engine resources
+`verifierSettings` - a json object containing the settings to be applied during the segment validation operation
+`sourceLanguage` - the source language code
+`targetLanguage` - the target language code
+`segmentLocation` - location details of the segment - these are:
+`fileId` - id of file
+`paragraphUnitId` - id of paragraph unit in file
+`segmentNumber` - the segment number within the paragraph (source/target)
+
+##### GetMessagesByCulture
+This endpoint is called by Trados to retrieve localized resources for the messages. The culture is specified in the call as a URL parameter. The app can support localized resources for various languages which will allow the messages to be displayed in the native language of the user in the UI. Please see the API documentation for more details:
+[GetMessagesByCulture](../../api/Extensibility-API.v1-fv.html#/operations/VerificationProviderGetMessagesByCulture)
+
+Example:
+```html
+GET https://your-app.com/messages/es-ES
+```
+
+##### GetSettingsSchema
+This endpoint is called by Trados to retrieve the schema related to any settings which the extension supports. **A note on schemas - once you define your settings schema for the extension, it should only be modified in a backwards compatible way, i.e. only adding of extra fields is allowed, not removing or renaming existing fields.** Please see the API documentation for more details:
+[GetSettingsSchema](../../api/Extensibility-API.v1-fv.html#/operations/VerificationProviderGetSettingsSchema)
+
+Example:
+```html
+GET https://your-app.com/schemas
+```
+
+An example schema is shown below:
+```json
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://rws.com/verification-sample-extension-settings.schema.json",
+ "title": "Length-check Verifier",
+ "description": "Validates if the target segment length exceeds the source segment length by a given amount.",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "default": true
+ },
+ "verificationResourcePackage": {
+ "type": "object",
+ "properties": {
+ "platformSettingType": {
+ "type": "string",
+ "enum": [
+ "file"
+ ]
+ },
+ "platformSettingValue": {
+ "type": "string"
+ }
+ }
+ },
+ "dateTest": {
+ "type": "string",
+ "format": "date"
+ },
+ "dateTimeTest": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "lengthCheckCharacterLimit": {
+ "type": "integer",
+ "default": 20,
+ "minimum": 1,
+ "maximum": 1000
+ },
+ "numberTest": {
+ "type": "number",
+ "default": 10,
+ "minimum": 1,
+ "maximum": 1000
+ },
+ "stringTest": {
+ "type": "string",
+ "default": "testSetting",
+ "minLength": 10,
+ "maxLength": 100
+ },
+ "gender": {
+ "type": "string",
+ "enum": [ "Female", "Male" ]
+ }
+ },
+
+ "required": [
+ "enabled",
+ "dateTimeTest",
+ "gender",
+ "lengthCheckCharacterLimit"
+ ]
+}
+
+```
+
+### Relevant IDs which need to be passed from requests to responses
+The only ID which is passed through from the request to response is the sessionId. This is used in the ***StartVerification*** request and sent back in the ***PublishMessage*** request.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/Webhooks.md b/articles/Extensibility/docs/development/Webhooks.md
new file mode 100644
index 0000000..38fdf6d
--- /dev/null
+++ b/articles/Extensibility/docs/development/Webhooks.md
@@ -0,0 +1,61 @@
+---
+stoplight-id: vh5fg9b14gm43
+---
+
+
+# Webhooks
+
+Apps can specify a list of webhooks that will be registered automatically when the app is installed on an account. That allows the app to specify a list of webhooks and consume them, allowing for asynchronous scenarios where the app can wait for events instead of polling constantly to check for a particular event or state improving performance both for the app and for Trados.
+
+## Constraints
+
+Not all accounts have webhooks enabled. Installing of the app requiring webhooks will be disabled (grayed out in UI) on accounts that don't have webhooks enabled.
+
+> [!WARNING]
+> Webhooks require one of the following [scopes](./Trados-Cloud-API.md#scopes) to be delivered: `TENANT` or `TENANT_READ`.
+
+## Setup
+
+The required list of webhooks must be specified in the descriptor in the `webhooks` property.
+
+`webhooks` is an array of URLs and corresponding event types. You can specify a single URL for all webhook event types, or one URL for each event type, or any combination. This is done for maximum flexibility so you can decide if you want to ingest all webhooks through a single endpoint or have multiple endpoints maybe by event type or category, etc.
+
+`url` can be an absolute URL or a path relative to `basePath`.
+
+Example of a `webhooks` property in the app descriptor:
+```json
+{
+ ...
+ "webhooks": [
+ {
+ "url": "/webhooks-endpoint",
+ "evenTypes": [
+ {
+ "eventType": "PROJECT.TASK.ACCEPTED"
+ },
+ {
+ "eventType": "PROJECT.TASK.CREATED"
+ }
+ ]
+ }
+ ]
+ ...
+}
+```
+That example will subscribe to `PROJECT.TASK.ACCEPTED` and `PROJECT.TASK.CREATED` events and will receive these events on the `/webhooks-endpoint` URL.
+
+## Webhook events and payloads
+
+Webhooks for apps are sent in a batched format.
+
+The webhook payload description can be found in our [Trados Cloud Platform API documentation](https://eu.cloud.trados.com/lc/api-docs/batched-webhooks).
+
+Webhooks are grouped in batches by callback URL, so it is likely that events from different tenants will be included in the same batch. It is the responsability of the app developer to handle the events from the batch accordingly to their `accountId` from the event body.
+
+> [!NOTE]
+> **Note:** For *Webhook Authenticity*, ignore the described behavior in the above link and only consider the following chapter about *Signature Validation*.
+
+
+## Signature Validation
+
+Unlike webhooks created in the UI through the Applications, webhooks that are declared in the descriptor are received using app signature. The endpoint that receives the webhook should treat these as signed with JWS, just as any other endpoint in the app. See [Request Authentication](Request-Authentication.md) page for more details.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/blueprints/Dot-Net-Blueprint.md b/articles/Extensibility/docs/development/blueprints/Dot-Net-Blueprint.md
new file mode 100644
index 0000000..36138e5
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Dot-Net-Blueprint.md
@@ -0,0 +1,151 @@
+# .NET Blueprint
+
+Our .NET blueprint uses .NET 6.0, it can be run out of the box and it can even be registered in Trados immediately, although it will not provide any functional extensions.
+
+The only dependencies are on MongoDB and the NLog nugets.
+
+## Getting the blueprint
+
+The blueprint is available in our GitHub repository: [https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/dotNetAppBlueprint](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/dotNetAppBlueprint)
+
+## Solution structure
+
+To explain the code structure for the blueprint we can have an overview look in the Solution Explorer:
+
+
+
+The following areas are important for developers:
+* **Controllers**: it covers the standard endpoints and also placeholders for the Extension specific controllers.
+* **DAL**: it contains complete functionality for account management backed by MongoDB.
+* **Exceptions**: it's used for returning errors to Trados.
+* **Models**: it has the pre-built classes for all models from the contract.
+* **Services** is where the main functionality can be concentrated. You can use it as a thin business layer.
+* **appsettings.json** is where all your configurations go.
+* **descriptor.json** is the file that describes the app functionality according to the contract.
+* **Dockerfile**: it is used for debugging within the Docker containers.
+
+## First steps
+
+Rename the solution and the project files, and then rename the namespaces to make them your own.
+
+Run it and ensure there are no problems before continuing with your customization.
+
+Go through all the files and take note of placeholders - methods without implementation, or comments saying, for example, "*implementation needed*" . The blueprint is a placeholder with as much plumbing in place as possible, but it still needs filling with your details.
+
+Depending on the extensions you are building, you may want to add one or more 'Service' classes that will have your business code.
+
+Some files are there as an example and if you don't need them, feel free to remove them. For example, there are two extension files: the `AutomaticTaskController.cs` and the `TranslationController.cs`. Most apps will implement only one extension type, so you may want to keep one and remove the other.
+
+### appsettings.json
+
+The default configuration for ASP.NET Core. The blueprint provides a very minimalist file:
+
+```json
+{
+ "Logging": {
+ "LogLevel": {
+ //"Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+
+ "Authorization": {
+ "JwksUri": "https://lc-api.sdl.com/public-api/v1/.well-known/jwks.json",
+ "Issuer": "https://languagecloud.rws.com/"
+ },
+
+ "baseUrl": "TODO: replace with a proper URL",
+
+ "AllowedHosts": "*",
+ "documentationUrl": "docUrl",
+ "MongoDb": {
+ "Connection": "mongodb://localhost:27017",
+ "Name": "lc-blueprint-app"
+ }
+}
+```
+
+The `Logging` section instructs ASP.NET on what logs to produce. Note that NLog will receive the filtered logs and then also apply its filters.
+
+The `Authorization` section provides the settings required by the app to authorize the requests from Trados.
+
+The `baseUrl` is used to populate the property with the same name from the descriptor.
+
+The `AllowedHosts` is a CORS configuration. By setting it to `*` we allow Trados to call and render the response in the UI. This is a future-proof configuration.
+
+The `documentationUrl` specifies the URL where to redirect for the full documentation. You need to specify a valid URL here. Alternatively you can return a full HTML page in the `Documentation()` action within the `StandardController` instead of using redirection.
+
+The `MongoDb` provides the connection string for MongoDB and also the database name. The database will be automatically created and doesn't need to be provisioned upfront. If you decide to go with another database, you can remove it.
+
+### descriptor.json
+
+This file will be returned from the `/descriptor` endpoint as described in the API Contract. It is used to describe the functionality of the app, inform Trados of all the paths to the endpoints, provide names, descriptions, and also instruct what configuration settings are required from the user when it's installed.
+
+### Database
+
+The blueprint is using MongoDB as a database engine. This is not a requirement and it can be substituted for any database. There is the `IRepository` interface that can be implemented with another concrete class that supports another database engine.
+
+
+
+POCO classes in the Entities folder might need adjustments as these are tailored for MongoDB.
+
+The next step would be to update the `Startup.cs` to change the service for `IRepository` to the new concrete class. Or if the Repository class is rewritten, no changes would be needed here.
+
+The health checks also need to be updated against the new database engine.
+
+### Authentication and Authorization
+
+Most endpoints in the app need to be secured. The API Contract specifies which endpoints are secured and which are not. For example, `/descriptor` endpoint should not be secured as this is not sensitive information but it is valuable for manually invoking the endpoint and checking that the correct descriptor is returned.
+
+The `[Authorize]` attribute is already placed on all the required standard endpoints (action methods, in the `StandardController.cs` file). All the infrastructure code is already in place, and no other configuration is required.
+
+When implementing extension endpoints, since all extension endpoints need to be secured, you must make sure to place the `[Authorize]` attribute on all action methods (note that this is already done in the `AutomaticTaskController.cs` and the `TranslationController.cs`).
+
+### Context
+
+Since the apps can be used on multiple accounts it's important to understand for which account the current call is being executed to get either Service User credentials or configuration settings.
+
+To get the current account you can use the `GetTenantId` extension method (from the Helpers folder) that is executed over the HttpContext object. This can be done in the Controller Action methods like this:
+
+```csharp
+string tenantId = this.HttpContext.GetTenantId();
+```
+
+If you need access to the identifier from other classes, you can either pass the identifier as a parameter in the request chain or access HttpContext through other mechanisms that are available in ASP.NET Core: [Access HttpContext in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0).
+
+The blueprint provides access to Configuration data and Account Information out of the box. If you need more data to be stored, you can extend the Repository.
+
+Access to account data is available by injecting the `IRepository` interface and using one of the available methods, for example:
+```csharp
+Task GetAccountInfoByTenantId(string tenantId);
+```
+
+This will provide access to both the `ConfigurationValues` as well as the `ClientCredentials`. The `ClientCredentials` type provides the `ClientId` and `ClientSecret` that are used for making calls to the RWS Language Cloud API.
+
+### Logs
+
+The blueprint is configured to use out of the box the standard [Logging in .NET Core and ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-6.0) approach configured with NLog to log to console. It will write only Info level logs by default. This can be changed in the nlog.config by changing from `Info` to `Warn`:
+
+```xml
+
+```
+
+Note that you can also set the `LOG_LEVEL` environment variable to set to your desired minimum logging level. This works great when you need to change the logging level in a Docker container, you just send the environment settings when you start the container.
+
+Moreover, logging to files can easily be enabled from `nlog.config` by uncommenting the `logFile` target:
+```xml
+
+```
+
+### Health checks
+
+Trados will make sure that the app is up and running by making requests to the `/health` endpoint. The blueprint provides a default implementation where it checks that MongoDB is available. Additional changes can be implemented.
+
+The blueprint implements the ASP.NET Core Health Check. For more details check: [Health checks in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-6.0).
+
+### Error reporting
+
+When you need to return an error to Trados, it's enough to raise an Exception of type AppException. The various constructor overloads allow for customization of the response. The plumbing in the blueprint will take care to transform the exception into an error payload according to the contract.
+
+Make sure to follow the contract specifications to send error codes that Trados can interpret. You are not limited to, and can send any codes, but that would mean that special cases will not be treated.
diff --git a/articles/Extensibility/docs/development/blueprints/Dot-Net-Migration-Blueprint.md b/articles/Extensibility/docs/development/blueprints/Dot-Net-Migration-Blueprint.md
new file mode 100644
index 0000000..caa6a2d
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Dot-Net-Migration-Blueprint.md
@@ -0,0 +1,70 @@
+# .NET Migration Blueprint
+
+This blueprint should be used exclusively to upgrade your existing .NET add-on to an app while maintaining the compatibility with the old add-on installs.
+
+The migration blueprint can be found [here](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/dotNetAppMigrationBlueprint).
+
+There are a couple of main points to consider when doing the upgrade:
+
+## Descriptor Changes
+
+### Descriptor Version
+
+First and foremost you'll need to change the `descriptorVersion` field to `1.4` in the descriptor JSON. This is the version that tells Trados Enterprise that your add-on has became an app and needs to be handled accordingly.
+
+> [!NOTE]
+> In addition to `descriptorVersion`, the `version` field also needs to be updated to signal Trados Enterprise that there's a new descriptor available, as per usual.
+
+### App Lifecycle Endpoint
+
+The old `addonLifecycle` standard endpoint needs to be replaced with the `appLifecycle` [endpoint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/descriptor.json#L56) but at the same time the old [route](https://github.com/RWS/language-cloud-extensibility/blob/app_updates/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Controllers/StandardController.cs#L128-L129) must be kept along the new route for backwards compatibility.
+
+## New Lifecycle Events
+
+Some lifecycle events have been renamed while others have been added.
+
+### INSTALLED
+
+The `ACTIVATED` event is now called `INSTALLED`. To ensure backwards compatibility with the old form, the migration blueprint knows to handle [both](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Controllers/StandardController.cs#L155-L156).
+
+### UNINSTALLED
+
+Similarly to the `ACTIVATED` event, the `DEACTIVATED` event is now called `UNINSTALLED`. Once again, the migration blueprint supports [both](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Controllers/StandardController.cs#L161-L162).
+
+### UPDATED
+
+To explain the purpose of the `UPDATED` event we have to reflect on the `REGISTERED` changes.
+
+Previously, Trados Enterprise was providing different pairs of credentials for each tenant that was installing the add-on. An app is now provided with a single pair of credentials just once, at registration.
+
+Since, your app has already been registered as an add-on, the `REGISTERED` event will no longer be sent so Trados Enterprise will provide the credentials in the same manner but via the new `UPDATED` event.
+
+The `UPDATED` event is sent by Trados Enterprise when the `descriptorVersion: 1.4` is detected. When this event is invoked, the app(former add-on) needs to save the received pair of credentials(clientId/clientSecret) per registration and discard the old credentials saved per tenant installs.
+
+## Trados Cloud Platform API Authentication
+
+If your add-on was integrating with Trados Cloud Platform API, the credentials used to authenticate came from the tenant installation(`Accounts` collection).
+
+With the new approach the credentials should now be retrieved from the app registration(`AppRegistration` collection). To access the registration credentials you can call the `Rws.LC.AppBlueprint.Interfaces.GetRegistrationInfo` [method](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Interfaces/IAppRegistrationRepository.cs#L19).
+
+For eg:
+```csharp
+AppRegistrationEntity appRegistration = await _appRegistrationRepository.GetRegistrationInfo().ConfigureAwait(false);
+ClientCredentialsEntity clientCredentials = appRegistration.ClientCredentials;
+```
+
+For more details see the [Trados Cloud Platform API guide](../Trados-Cloud-API.md#credentials).
+
+## Summary
+
+To help you quickly implement the migration changes we gathered below a list of files that you need to look into:
+
+- [descriptor.json](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/descriptor.json)
+- [StandardController.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Controllers/StandardController.cs)
+- [AccountService.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Services/AccountService.cs)
+- [IAccountService.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Interfaces/IAccountService.cs)
+- [RegisteredUpdatedEvent.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Models/RegisteredUpdatedEvent.cs) (formerly RegisteredEvent.cs)
+- [Repository.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/DAL/Repository.cs)
+- [IRepository.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Interfaces/IRepository.cs)
+- [AppRegistrationRepository.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/DAL/AppRegistrationRepository.cs)
+- [AppLifecycleEventEnum.cs](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppMigrationBlueprint/Rws.LC.AppBlueprint/Enums/AppLifecycleEventEnum.cs)
diff --git a/articles/Extensibility/docs/development/blueprints/Getting-Started.md b/articles/Extensibility/docs/development/blueprints/Getting-Started.md
new file mode 100644
index 0000000..e3a160e
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Getting-Started.md
@@ -0,0 +1,22 @@
+# Getting Started with Blueprints
+
+Although you can start your app development from scratch, to help developers, we provide blueprints that have all the required components already included out of the box. Blueprints are available for .NET and Java.
+
+Can you develop an app without using the blueprints? Definitely! But how nice is it to have a base app up and running within an hour, then write all that boilerplate yourself?
+
+## What the blueprints provide
+
+There is boilerplate to get an app service up and running in minutes, most notable being:
+- Authentication is already implemented.
+- Standard endpoints are implemented either completely or as stubs that need minimal code to be completed (for example: the health endpoint).
+- Models from the contract are already implemented.
+- Database integration is provided with support for MongoDB. If a different database will be used, then only changes to the Data Access Layer need to be implemented.
+- Dockerfile provided if you want to get started quickly with Docker.
+
+## Getting the blueprints
+
+The blueprints are available in our github repository: [https://github.com/RWS/language-cloud-extensibility](https://github.com/RWS/language-cloud-extensibility)
+
+## Next steps
+
+Once you decided that you want to start development using a blueprint and decided on the technology, follow the instructions on the page for that blueprint technology.
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/blueprints/Java-Blueprint.md b/articles/Extensibility/docs/development/blueprints/Java-Blueprint.md
new file mode 100644
index 0000000..645e16d
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Java-Blueprint.md
@@ -0,0 +1,174 @@
+# Java Blueprint
+
+Our Java blueprint is a Spring Boot web application built on Java 11, it can be run out of the box and it can even be registered in Trados immediately, although it will not provide any functional extensions.
+
+## Getting the blueprint
+
+The blueprint is available in our GitHub repository: [https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/javaAppBlueprint](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/javaAppBlueprint)
+
+## Project structure
+
+To explain the code structure for the blueprint we can have an overview look at the Project tree:
+
+
+
+For a developer, the following areas may be of interest:
+* **web**: this includes the controllers for standard endpoints and also placeholders for Extensions.
+* **persistence**: it contains complete functionality for account management backed by MongoDB.
+* **exception**: it's used for returning errors to Trados.
+* **transfer**: it has the pre-built classes for all the models from the contract.
+* **service**: this is where the main functionality can be concentrated. You can use it as a thin business layer.
+* **resources/application.yml** is where all your configurations go.
+* **resources/descriptor.json** is the file that describes the app functionality according to the contract.
+* **docker/Dockerfile**: it is used for debugging in Docker containers.
+
+## First steps
+
+First, let's make the blueprint yours by renaming the files and the configuration settings. A quick tip would be to search by these keywords: `blueprint`, `rws`. Some of the renaming actions you may want to consider:
+- Rename the main package `com.rws.lt.lc.blueprint`
+- Update the `pom.xml`
+ ```xml
+ com.rws.lt.lc.app.blueprint
+ lc-blueprint-app
+ 1.0-SNAPSHOT
+ jar
+ LC Blueprint App Service
+ ```
+- Rename the main class `BlueprintApplication`
+- Update the following places from `application.yml`
+ ```yml
+ application:
+ name: lc.app.blueprint
+ ...
+ spring:
+ application:
+ name: lc-blueprint-app
+ data:
+ mongodb:
+ ...
+ database: lc-blueprint-app
+ ```
+- Update `Dockerfile` if you plan to use it
+
+Run it and ensure there are no problems before you continue with your customization.
+
+Go through all the files and take note of placeholders - methods without implementation, or *TODOs*. The blueprint is a placeholder with as much plumbing in place as possible, but it still needs filling with your details.
+
+Depending on the extensions you are building, you might want to add one or more 'Service' classes that will have your business code.
+
+Some files are placed there as examples, and if you don't need them, you can remove them. For example, there is the `AutomaticTaskController.java` for the `lc.automatictask` extension or `TranslateController.java` and `TranslationEnginesController.java` for the `lc.mtprovider` extension. Most apps will implement only one extension type, so you might want to keep one and remove the other.
+
+### application.yml
+
+This is the default configuration for Spring Boot. The blueprint provides a rather simple file with various sections. The ones of interest are:
+
+```yml
+...
+# TODO: replace with a real URL
+baseUrl: "replace-me"
+...
+spring:
+ ...
+ data:
+ mongodb:
+ authentication-database: admin
+ database: lc-blueprint-app
+ uri: mongodb://localhost:27017
+ ssl-enabled: false
+ auto-index-creation: false
+...
+# Logging
+logging:
+ level:
+ com.rws: INFO
+...
+# TODO: replace with a real doc URL
+documentation.url: "replace-me"
+
+integration:
+ public-api:
+ basePublicApiV1Url: https://languagecloud.sdl.com/lc-api/public-api/v1
+ retrievePublicKeyByIdUrl: ${integration.public-api.basePublicApiV1Url}/.well-known/jwks.json/{kid}
+```
+
+The `baseUrl` above is used to populate the property with the same name from the descriptor.
+
+The `spring.data.mongodb` provides the connection string for MongoDB and also the database name. The database will be created automatically and doesn't need to be provisioned upfront. If you decide to go with another database, you can remove it.
+
+The `logging` section sets the minimum log level for Lombok.
+
+The `documentation.url` specifies the address where to redirect for a full documentation set. You need to specify a valid URL here. Alternatively, you can return a full HTML page in the `getDocumentation()` action in the `DocumentationController` instead of using redirection.
+
+The `integration.public-api` section provides the settings required by the app to authorize the requests from Trados.
+
+### descriptor.json
+
+This file will be returned from the `/descriptor` endpoint as described in the API Contract. It is used to describe the functionality of the app, inform Trados of all the paths to the endpoints, provide names and descriptions, and also instruct which configuration settings are required from the user during the installation.
+
+### Database
+
+The blueprint is using MongoDB as its database engine. This is not a requirement, and it can be substituted for any database. There is the `AccountSettingsRepository` interface that extends the `CrudRepository` from Spring. The interface methods can be replaced or implemented in a concrete class.
+
+
+
+POJO classes in the `domain` package might need adjustments as these are tailored for MongoDB.
+
+The next step would be to replace the `MongoConfiguration.java`class with a configuration class for your database.
+
+### Authentication and Authorization
+
+Most endpoints in the app need to be secured. The API Contract specifies which endpoints are secured and which are not. For example, the `/descriptor` endpoint should not be secured, as this is not sensitive information, but it is valuable for manually invoking the endpoint and checking that the correct descriptor is returned.
+
+By default, all the endpoints in the blueprint are secured except for the ones annotated with `@GenericAuthorization`. These endpoints are: `/descriptor`, `/health` and `/documentation`.
+All the infrastructure code is already in place, and no other configuration is required.
+
+When implementing extension endpoints, since all extension endpoints need to be secured, you must **NOT** annotate the action methods with `@GenericAuthorization`. You can check `AutomaticTaskController.java`, `TranslateController.java`, or `TranslationEnginesController.java` as references.
+
+### Context
+
+Since the apps can be used on multiple accounts it's important to understand for which account the current call is being executed, to get either Service User credentials or configuration settings.
+
+To get the current account, you can use the `getActiveAccountId()` method (from the `RequestLocalContext.java`) that retrieves the value from the context object which is a `ThreadLocal` map. This can be done anywhere in the code as long as you are in an HTTP context:
+
+```java
+String tenantId = RequestLocalContext.getActiveAccountId();
+```
+
+The blueprint provides access to Configuration data and Account Information out of the box. If you need more data to be stored, you can extend the Repository.
+
+Access to account data is available by injecting the `AccountSettingsRepository` interface and using one of the available methods, for example:
+```java
+AccountSettings entity = accountSettingsRepository.findAccountSettings(tenantId);
+```
+
+This will provide access to the `configurations` as well as to the `clientCredentials`. The `clientCredentials` type provides the `clientId` and `clientSecret` that are used for making calls to the Trados Cloud Platform API.
+
+### Logs
+
+The blueprint is configured to use the Lombok logging approach out of the box. It will write only INFO level logs by default. This can be changed in the `logback.xml` by changing from `INFO` to `WARN`:
+
+```xml
+
+
+
+```
+
+You can enable the `LOGGER` anywhere in the code by annotating the classes with the `@Slf4j` [annotation](https://projectlombok.org/api/lombok/extern/slf4j/Slf4j.html) from Lombok. Example of logging:
+
+```java
+LOGGER.info("getDescriptor >>");
+```
+
+Among other useful details, the logs will include by default the **tenantId** and the **traceId** which can be helpful when debugging.
+
+Note that you can also set the `logging.level.com.rws` environment variable to your desired minimum logging level. This works great when you need to change the logging level in a Docker container, as you just send the environment settings when you start the container.
+
+### Health checks
+
+Trados will make sure that the app is up and running by making requests to the `/health` endpoint. The blueprint provides a default implementation that relies on the Spring [HealthEndpoint](https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/actuate/health/HealthEndpoint.html). Additional changes can be implemented.
+
+### Error reporting
+
+When you need to return an error to Trados, it's enough to raise an Exception of type AppException. The various constructor overloads allow for customization of the response. The plumbing in the blueprint will take care to transform the exception into an error payload according to the contract.
+
+Make sure to follow the contract specifications to send error codes that Trados can interpret. You are not limited to these, and you can send any codes, but that would mean that special cases will not be addressed.
diff --git a/articles/Extensibility/docs/development/blueprints/Java-Migration-Blueprint.md b/articles/Extensibility/docs/development/blueprints/Java-Migration-Blueprint.md
new file mode 100644
index 0000000..b8ac051
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Java-Migration-Blueprint.md
@@ -0,0 +1,69 @@
+# Java Migration Blueprint
+
+This blueprint should be used exclusively to upgrade your existing Java add-on to an app while maintaining the compatibility with the old add-on installs.
+
+The migration blueprint can be found [here](https://github.com/RWS/language-cloud-extensibility/tree/main/blueprints/javaAppMigrationBlueprint).
+
+There are a couple of main points to consider when doing the upgrade:
+
+## Descriptor Changes
+
+### Descriptor Version
+
+First and foremost you'll need to change the `descriptorVersion` field to `1.4` in the descriptor JSON. This is the version that tells Trados Enterprise that your add-on has became an app and needs to be handled accordingly.
+
+> [!NOTE]
+> In addition to `descriptorVersion`, the `version` field also needs to be updated to signal Trados Enterprise that there's a new descriptor available, as per usual.
+
+### App Lifecycle Endpoint
+
+The old `addonLifecycle` standard endpoint needs to be replaced with the `appLifecycle` [endpoint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/resources/descriptor.json#L55) but at the same time the old [route](https://github.com/RWS/language-cloud-extensibility/blob/app_updates/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/web/LifecycleController.java#L22) must be kept along the new route for backwards compatibility.
+
+## New Lifecycle Events
+
+Some lifecycle events have been renamed while others have been added.
+
+### INSTALLED
+
+The `ACTIVATED` event is now called `INSTALLED`. To ensure backwards compatibility with the old form, the migration blueprint knows to handle [both](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/transfer/lifecycle/AppLifecycleEvent.java#L19-L20).
+
+### UNINSTALLED
+
+Similarly to the `ACTIVATED` event, the `DEACTIVATED` event is now called `UNINSTALLED`. Once again, the migration blueprint supports [both](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/transfer/lifecycle/AppLifecycleEvent.java#L24-L25).
+
+### UPDATED
+
+To explain the purpose of the `UPDATED` event we have to reflect on the `REGISTERED` changes.
+
+Previously, Trados Enterprise was providing different pairs of credentials for each tenant that was installing the add-on. An app is now provided with a single pair of credentials just once, at registration.
+
+Since, your app has already been registered as an add-on, the `REGISTERED` event will no longer be sent so Trados Enterprise will provide the credentials in the same manner but via the new `UPDATED` event.
+
+The `UPDATED` event is sent by Trados Enterprise when the `descriptorVersion: 1.4` is detected. When this event is invoked, the app(former add-on) needs to save the received pair of credentials(clientId/clientSecret) per registration and discard the old credentials saved per tenant installs.
+
+## Trados Cloud Platform API Authentication
+
+If your add-on was integrating with Trados Cloud Platform API, the credentials used to authenticate came from the tenant installation(`accountSettings` collection).
+
+With the new approach the credentials should now be retrieved from the app registration(`appRegistration` collection). To access the registration credentials you can call the `com.rws.lt.lc.blueprint.persistence.findFirst` [method](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/persistence/AppRegistrationRepository.java#L9).
+
+For eg:
+```java
+AppRegistration entity = appRegistrationRepository.findFirst();
+ClientCredentials clientCredentials = entity.getClientCredentials();
+```
+
+For more details see the [Trados Cloud Platform API guide](../Trados-Cloud-API.md#credentials).
+
+## Summary
+
+To help you quickly implement the migration changes we gathered below a list of files that you need to look into:
+
+- [descriptor.json](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/resources/descriptor.json)
+- [LifecycleController.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/web/LifecycleController.java)
+- [UpdatedEvent.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/transfer/lifecycle/UpdatedEvent.java)
+- [AppLifecycleEvent.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/transfer/lifecycle/AppLifecycleEvent.java)
+- [AccountSettingsService.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/service/AccountSettingsService.java)
+- [AccountSettingsAtomicRepository.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/persistence/AccountSettingsAtomicRepository.java)
+- [AccountSettingsAtomicRepositoryImpl.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/persistence/AccountSettingsAtomicRepositoryImpl.java)
+- [AccountSettingsRepository.java](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppMigrationBlueprint/src/main/java/com/rws/lt/lc/blueprint/persistence/AccountSettingsRepository.java)
diff --git a/articles/Extensibility/docs/development/blueprints/Testing-with-Docker.md b/articles/Extensibility/docs/development/blueprints/Testing-with-Docker.md
new file mode 100644
index 0000000..c9e21fa
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Testing-with-Docker.md
@@ -0,0 +1,131 @@
+# Testing with Docker
+
+This guide is mainly aimed at developers who want to deploy the app within a Docker container. Throughout the guide, we will see how we can run and test the app behavior when containerized.
+
+Before continuing here, we recommend reading the [basic testing guide](./Testing.md).
+
+The only additional prerequisite to Ngrok and MongoDB (which we mention in the basic guide) is [Docker Desktop](https://www.docker.com/products/docker-desktop). You can find a setup guide [here](https://docs.docker.com/get-docker/).
+
+> [!NOTE]
+> Please note that Docker Desktop is no longer free for large businesses.
+
+## Docker files
+
+Each of our blueprints include a `Dockerfile`:
+- [.NET blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/dotNetAppBlueprint/Rws.LC.AppBlueprint/Dockerfile)
+- [Java blueprint](https://github.com/RWS/language-cloud-extensibility/blob/main/blueprints/javaAppBlueprint/src/main/docker/Dockerfile)
+
+The `Dockerfile` contains instructions based on which Docker will build the images. No changes should be required to these files.
+
+## Configuring Mongo
+
+Before proceeding to run the app from a Docker container, there are a few configuration changes needed for MongoDB.
+
+Because a Linux Docker container can be considered as a VM, and communicating from your container to your host machine cannot be done through localhost, you need to allow MongoDB connections on your machine IP, so that the application from your container can connect to it from an "external" machine.
+
+> [!WARNING]
+> This might open your database to access from outside your machine if your firewall is not configured correctly or installed.
+
+To configure your MongoDB follow these steps:
+
+1. Open CLI and run this command:
+ ```
+ ipconfig
+ ```
+2. Copy the `IPv4 Address` IP address. Note - your IP can change depending on your network settings, and you might need to update it from time to time.
+3. Go to your MongoDB `/bin` location (usually 'C:/Program Files/MongoDB/Server/\/bin'), open `mongod.cfg` as Administrator and add the copied address to the `bindIp` configuration setting. For example:
+ ```conf
+ ...
+ net:
+ port: 27017
+ bindIp: 127.0.0.1,
+ ...
+ ```
+4. Save `mongod.cfg`
+5. From **Task Manager** navigate to the **Services** tab and search for 'MongoDB'. Right click and select **Restart**. This is needed so that the previous changes take effect.
+6. Using the same IP address, edit the blueprint's Mongo configuration settings, as follows:
+ - `appsettings.json` for the .NET blueprint
+ ```json
+ {
+ ...
+ "MongoDb": {
+ "Connection": "mongodb://:27017",
+ "Name": "lc-blueprint-app"
+ }
+ }
+ ```
+ - `application.yml` for the Java blueprint
+ ```yml
+ ...
+ spring:
+ ...
+ data:
+ mongodb:
+ ...
+ uri: mongodb://:27017
+ ...
+ ...
+ ```
+
+## Running apps in containers
+
+There may be many ways of running applications in Docker containers. Below is a suggestion for each of our blueprints (.NET and Java).
+
+### .NET blueprint
+
+The .NET blueprint comes with Visual Studio Docker Support enabled. See `Rws.LC.AppBlueprint.csproj`:
+
+```xml
+
+
+ ...
+ Linux
+
+ ...
+
+```
+
+To run the solution from a container, follow these steps:
+
+1. Open **Docker Desktop**.
+2. From Visual Studio, select the **Docker** option from the **Run** dropdown menu.
+
+ 
+
+3. When running it for the first time, it may take a while to create the image.
+4. Once it's done, the **Containers** window will open. Here you can see the details and the logs of your running containers.
+
+ 
+
+5. You can also check the container logs in **Docker Desktop**.
+
+ 
+
+6. Check that the application is running correctly by performing a `GET` request to your descriptor endpoint. For example:
+ ```
+ GET http://localhost:5000/v1/descriptor
+ ```
+
+
+### Java blueprint
+
+For the Java blueprint, we are going to explicitly create a Docker image and run it with **Docker Desktop**. To achieve this, you need to:
+
+1. Run the Maven `package` command, so you generate the `.jar` file for the blueprint project.
+2. Make sure that the `.jar` file was generated in the `/target` folder. By default, it is called `lc-blueprint-app-1.0-SNAPSHOT.jar`.
+3. Copy the `.jar` file into the same directory with the `Dockerfile` > `/src/main/docker`.
+4. Build the Docker image by using the [build](https://docs.docker.com/engine/reference/commandline/build/) command:
+
+ ```
+ docker build --tag /lc-blueprint-app-public/src/main/docker
+ ```
+
+5. Open **Docker Desktop** and search for the image by the `` you previously set (**java_bp** in this example).
+6. Click **RUN** and bind the exposed ports to localhost, as follows:
+
+ 
+
+7. Check that the application is running correctly by performing a `GET` request to your descriptor endpoint. For example:
+ ```
+ GET http://localhost:5000/v1/descriptor
+ ```
diff --git a/articles/Extensibility/docs/development/blueprints/Testing.md b/articles/Extensibility/docs/development/blueprints/Testing.md
new file mode 100644
index 0000000..f5bdfc1
--- /dev/null
+++ b/articles/Extensibility/docs/development/blueprints/Testing.md
@@ -0,0 +1,124 @@
+# Testing
+
+This guide explains the ways we can test the app from our local environment. This will help with solving the potential bugs or issues before deploying the app.
+
+Prerequisites:
+1. Ngrok
+2. MongoDB
+
+## Ngrok
+
+Ngrok exposes local servers to the public internet over secure tunnels. The app endpoints need to be public for Trados to find them.
+
+You can find a quick guide on how to install and set up Ngrok [here](https://ngrok.com/download).
+
+### Usage
+
+1. Find the **port** on which the app runs in the configuration files:
+ - `launchSettings.json` for the .NET blueprint
+
+ ```json
+ {
+ ...
+ "Rws.LC.AppBlueprint": {
+ ...
+ "applicationUrl": "http://localhost:5000"
+ }
+ }
+ ```
+
+ - `application.yml` for the Java blueprint
+
+ ```yml
+ ...
+ server:
+ port: 5000
+ ...
+ ```
+
+2. Open a Command-line tool (for example `cmd`, `PowerShell`), navigate to your Ngrok location, and run this command for your port:
+ ```
+ ngrok http 5000
+ ```
+
+ 
+
+### Configuration
+
+1. After having started a new session, you can find the exposed URLs in the Command-line.
+
+2. Copy the URL that uses **https**. For example:
+
+ 
+
+3. Locate the `baseUrl` setting in the configuration files and replace it with the copied URL:
+ - `appsettings.json` for the .NET blueprint
+ - `application.yml` for the Java blueprint
+
+### Testing
+
+1. Although you could access the descriptor URL from a browser, we recommend using a testing client like [Postman](https://www.postman.com/) to perform the `GET` request to your descriptor URL, namely `https:///`. For example:
+ ```
+ GET https://47b6-78-96-152-25.ngrok.io/v1/descriptor
+ ```
+
+ 
+
+2. If you have problems accessing the URL, you can try running Ngrok using one of these alternative commands:
+ ```
+ ngrok http 5000 -host-header="localhost:5000"
+ ```
+ -
+ ```
+ ngrok http https://localhost:5000 -host-header="localhost:5000"
+ ```
+
+3. Make sure the descriptor response contains the correct value for the `baseUrl` field.
+
+4. [Register](../../appManagement/Registering.md) the app in Trados using the URL provided by Ngrok.
+
+> [!NOTE]
+> You can restart the app application anytime while running a Ngrok session, without having to start a new session.
+
+## MongoDB
+
+We recommend using MongoDB as it is free and fairly easy to use. For testing purposes, the [community version](https://www.mongodb.com/try/download/community) should be enough.
+
+The installation package should also include the **MongoDB Compass Community** application which is the user interface for your database. Here we can see the collections with the documents inserted by the app at runtime.
+
+For example:
+
+
+
+You can edit the Mongo settings in the configuration files of the blueprints:
+ - `appsettings.json` for the .NET blueprint
+
+ ```json
+ {
+ ...
+ "MongoDb": {
+ "Connection": "mongodb://localhost:27017",
+ "Name": "lc-local-appblueprint"
+ }
+ }
+ ```
+
+ - `application.yml` for the Java blueprint
+ ```yml
+ ...
+ spring:
+ ...
+ data:
+ mongodb:
+ authentication-database: admin
+ database: lc-blueprint-app
+ uri: mongodb://localhost:27017
+ ssl-enabled: false
+ auto-index-creation: false
+ ...
+ ```
+
+> [!WARNING]
+> If you decide to use a different database, you should also modify your code accordingly.
+
+If you plan to package your app into a Docker container, here is a dedicated article for [Testing with Docker](./Testing-with-Docker.md).
\ No newline at end of file
diff --git a/articles/Extensibility/docs/development/samples/Dot-Net-Samples.md b/articles/Extensibility/docs/development/samples/Dot-Net-Samples.md
new file mode 100644
index 0000000..1511e14
--- /dev/null
+++ b/articles/Extensibility/docs/development/samples/Dot-Net-Samples.md
@@ -0,0 +1,19 @@
+# .NET Samples
+
+We create .NET samples to demonstrate basic implementations of specific extensions. They serve as examples for common tasks related to that extension. These samples are developed using the provided [.NET Blueprint](../blueprints/Dot-Net-Blueprint.md).
+
+For testing please see the guidelines from the Blueprints section: [Testing](../blueprints/Testing.md) and [Testing with Docker](../blueprints/Testing-with-Docker.md).
+
+## Machine Translation
+
+You can find the sample in our GitHub repository [here](https://github.com/RWS/language-cloud-extensibility/tree/main/samples/dotnet/MTSampleApp).
+
+It provides an implementation for the Google Machine Translation. But you can run it using a built-in mock, so there is no need to create a Google account to test it out. For enabling the mock please update the appsettings.json:
+```json
+"mockExtension": {
+ "enabled": true // will enable the mock instead true google integration
+ },
+```
+
+The sample can be run out of the box with the same requirements as for the blueprint, a local Mongo database. For different setups please see the blueprint and testing articles as you'll need to adjust your configuration.
+
diff --git a/articles/Extensibility/docs/development/samples/Java-Samples.md b/articles/Extensibility/docs/development/samples/Java-Samples.md
new file mode 100644
index 0000000..8a95031
--- /dev/null
+++ b/articles/Extensibility/docs/development/samples/Java-Samples.md
@@ -0,0 +1,18 @@
+# Java Samples
+
+We create Java samples to demonstrate basic implementations of specific extensions. They serve as examples for common tasks related to that extension. These samples are developed using the provided [Java Blueprint](../blueprints/Java-Blueprint.md).
+
+For testing please see the guidelines from the Blueprints section: [Testing](../blueprints/Testing.md) and [Testing with Docker](../blueprints/Testing-with-Docker.md).
+
+## Machine Translation
+
+You can find the sample in our GitHub repository [here](https://github.com/RWS/language-cloud-extensibility/tree/main/samples/java/mtSampleApp).
+
+It provides an implementation for the Google Machine Translation. But you can run it using a built-in mock, so there is no need to create a Google account to test it out. For enabling the mock please update the application.yml:
+```yml
+mockExtension:
+ enabled: true # will enable the mock instead true google integration
+
+```
+
+The sample can be run out of the box with the same requirements as for the blueprint, a local Mongo database. For different setups please see the blueprint and testing articles as you'll need to adjust your configuration.
diff --git a/articles/Extensibility/docs/development/verification-flow.png b/articles/Extensibility/docs/development/verification-flow.png
new file mode 100644
index 0000000..f7da3d0
Binary files /dev/null and b/articles/Extensibility/docs/development/verification-flow.png differ
diff --git a/articles/Extensibility/toc.yml b/articles/Extensibility/toc.yml
new file mode 100644
index 0000000..90afa12
--- /dev/null
+++ b/articles/Extensibility/toc.yml
@@ -0,0 +1,104 @@
+- name: What's New
+ href: docs/Whats-New.md
+
+- name: Development
+ items:
+ - name: Add-On To App Migration
+ href: docs/development/Add-On-To-App-Migration.md
+ - name: Concepts
+ href: docs/development/Concepts.md
+ - name: Technical Requirements And Best Practices
+ href: docs/development/Technical-Requirements-And-Best-Practices.md
+ - name: Lifecycle
+ href: docs/development/Lifecycle.md
+ - name: Multi-Region
+ href: docs/development/Multi-Region.md
+ - name: App Descriptor
+ href: docs/development/App-Descriptor.md
+ - name: App Versioning
+ href: docs/development/App-Versioning.md
+ - name: Authentication
+ items:
+ - name: Authentication Overview
+ href: docs/development/Authentication-Overview.md
+ - name: Request Authentication
+ href: docs/development/Request-Authentication.md
+ - name: Trados Cloud Platform API
+ href: docs/development/Trados-Cloud-API.md
+ - name: Webhooks
+ href: docs/development/Webhooks.md
+ - name: Deployment Strategy
+ href: docs/development/Deployment-Strategy.md
+ - name: Extensions
+ items:
+ - name: Automatic Task
+ href: docs/development/Automatic-Task-App-development-guide.md
+ - name: Machine Translation
+ href: docs/development/MT-App-development-guide.md
+ - name: Preview Provider
+ href: docs/development/Preview-App-development-guide.md
+ - name: Verification Provider
+ href: docs/development/Verification-App-development-guide.md
+ - name: User Interface (BETA)
+ items:
+ - name: User Interface App Development Guide
+ href: docs/development/UI-App-development-guide.md
+ - name: Custom Elements and Locations
+ href: docs/development/UI-App-custom-elements-locations.md
+ - name: Blueprints
+ items:
+ - name: Getting started
+ href: docs/development/blueprints/Getting-Started.md
+ - name: .NET Blueprint
+ href: docs/development/blueprints/Dot-Net-Blueprint.md
+ - name: .NET Migration Blueprint
+ href: docs/development/blueprints/Dot-Net-Migration-Blueprint.md
+ - name: Java Blueprint
+ href: docs/development/blueprints/Java-Blueprint.md
+ - name: Java Migration Blueprint
+ href: docs/development/blueprints/Java-Migration-Blueprint.md
+ - name: Testing
+ href: docs/development/blueprints/Testing.md
+ - name: Testing with Docker
+ href: docs/development/blueprints/Testing-with-Docker.md
+ - name: Samples
+ items:
+ - name: Java
+ href: docs/development/samples/Java-Samples.md
+ - name: .NET
+ href: docs/development/samples/Dot-Net-Samples.md
+
+- name: App Management
+ items:
+ - name: Foreword
+ href: docs/appManagement/Foreword.md
+ - name: Registering
+ href: docs/appManagement/Registering.md
+ - name: Installing
+ href: docs/appManagement/Installing.md
+ - name: Validating
+ href: docs/appManagement/Validating.md
+ - name: Sharing
+ href: docs/appManagement/Sharing.md
+ - name: Approvals
+ href: docs/appManagement/Approvals.md
+ - name: Publishing
+ href: docs/appManagement/Publishing.md
+ - name: Updating
+ href: docs/appManagement/Updating.md
+ - name: Retiring
+ href: docs/appManagement/Retiring.md
+
+- name: Machine Translation
+ href: docs/consumer/MT-App-consumer-guide.md
+
+- name: Automatic Task
+ href: docs/consumer/Automatic-Task-App-consumer-guide.md
+
+- name: Dynamic Preview
+ href: docs/consumer/Dynamic-Preview-guide.md
+
+- name: APIs
+ items:
+ - name: Extensibility API
+ href: api/Extensibility-API.v1-fv.html
\ No newline at end of file
diff --git a/articles/LCPublicAPI/api/Global-Public-API.v1-fv.html b/articles/LCPublicAPI/api/Global-Public-API.v1-fv.html
new file mode 100644
index 0000000..0ae9595
--- /dev/null
+++ b/articles/LCPublicAPI/api/Global-Public-API.v1-fv.html
@@ -0,0 +1,73 @@
+
+
+
+
+ Global Public API Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/articles/LCPublicAPI/api/Public-API.v1.json b/articles/LCPublicAPI/api/Public-API.v1.json
new file mode 100644
index 0000000..197adb5
--- /dev/null
+++ b/articles/LCPublicAPI/api/Public-API.v1.json
@@ -0,0 +1,32138 @@
+{
+ "openapi": "3.1.0",
+ "info": {
+ "title": "Trados Cloud Platform API",
+ "description": "The Trados Cloud Platform API",
+ "version": "1.0",
+ "contact": {}
+ },
+ "servers": [
+ {
+ "url": "https://api.eu.cloud.trados.com/public-api/v1",
+ "description": "EU Region Server"
+ },
+ {
+ "url": "https://api.ca.cloud.trados.com/public-api/v1",
+ "description": "CA Region Server"
+ }
+ ],
+ "tags": [
+ {
+ "name": "Account",
+ "description": "Account"
+ },
+ {
+ "name": "Connected AI",
+ "description": "Connected AI"
+ },
+ {
+ "name": "Custom Field",
+ "description": "Custom Field"
+ },
+ {
+ "name": "Customer",
+ "description": "Customer"
+ },
+ {
+ "name": "File",
+ "description": "File"
+ },
+ {
+ "name": "File Processing Configuration",
+ "description": "File Processing Configuration"
+ },
+ {
+ "name": "Folder",
+ "description": "Folder"
+ },
+ {
+ "name": "Group",
+ "description": "Group"
+ },
+ {
+ "name": "Language",
+ "description": "Language"
+ },
+ {
+ "name": "Language Processing",
+ "description": "Language Processing"
+ },
+ {
+ "name": "Machine Translation",
+ "description": "Machine Translation"
+ },
+ {
+ "name": "PerfectMatch Mapping",
+ "description": "PerfectMatch Mapping"
+ },
+ {
+ "name": "Pricing Model",
+ "description": "Pricing Model"
+ },
+ {
+ "name": "Project",
+ "description": "Project"
+ },
+ {
+ "name": "Project Group",
+ "description": "Project Group"
+ },
+ {
+ "name": "Project Template",
+ "description": "Project Template"
+ },
+ {
+ "name": "Public Keys",
+ "description": "Public Keys"
+ },
+ {
+ "name": "Quote",
+ "description": "Quote"
+ },
+ {
+ "name": "Rate Limits",
+ "description": "Rate Limits"
+ },
+ {
+ "name": "Schedule Template",
+ "description": "Schedule Template"
+ },
+ {
+ "name": "Source File",
+ "description": "Source File"
+ },
+ {
+ "name": "Target File",
+ "description": "Target File"
+ },
+ {
+ "name": "Task",
+ "description": "Task"
+ },
+ {
+ "name": "Task Type",
+ "description": "Task Type"
+ },
+ {
+ "name": "Termbase",
+ "description": "Termbase"
+ },
+ {
+ "name": "Termbase Export",
+ "description": "Termbase Export"
+ },
+ {
+ "name": "Termbase Import",
+ "description": "Termbase Import"
+ },
+ {
+ "name": "Termbase Template",
+ "description": "Termbase Template"
+ },
+ {
+ "name": "TQA Profile",
+ "description": "TQA Profile"
+ },
+ {
+ "name": "Translation Domain",
+ "description": "Translation Domain"
+ },
+ {
+ "name": "Translation Engine",
+ "description": "Translation Engine"
+ },
+ {
+ "name": "Translation Memory",
+ "description": "Translation Memory"
+ },
+ {
+ "name": "Translation Memory Export",
+ "description": "Translation Memory Export"
+ },
+ {
+ "name": "Translation Memory Import",
+ "description": "Translation Memory Import"
+ },
+ {
+ "name": "Translation",
+ "description": "Translation"
+ },
+ {
+ "name": "User",
+ "description": "User"
+ },
+ {
+ "name": "Workflow",
+ "description": "Workflow"
+ }
+ ],
+ "paths": {
+ "/accounts": {
+ "get": {
+ "tags": [
+ "Account"
+ ],
+ "summary": "List my Accounts",
+ "description": "Retrieves the accounts the authenticated user is part of. \n\n> For service users only the account where the user is defined is returned.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-my-accounts-response"
+ },
+ "examples": {
+ "ListAccountsWithDefaultFields": {
+ "value": {
+ "itemCount": 2,
+ "items": [
+ {
+ "id": "test-account-id-1",
+ "name": "test-account-name-1"
+ },
+ {
+ "id": "test-account-id-1",
+ "name": "test-account-name-2"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "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": {
+ "value": {
+ "message": "test-unauthorized-error-message",
+ "errorCode": "test-unauthorized-error-code",
+ "name": "test-unauthorized-error-name",
+ "value": "test-unauthorized-error-value",
+ "details": [
+ {
+ "name": "test-unauthorized-error-details-message",
+ "code": "test-unauthorized-error-details-code",
+ "value": "test-unauthorized-error-details-value"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "ListMyAccounts"
+ }
+ },
+ "/connected-ai/llm-configurations": {
+ "get": {
+ "summary": "List LLM Configurations",
+ "tags": [
+ "Connected AI"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-llm-configurations-response"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "\"invalid\": Invalid input in the query parameter mentioned in the \"name\" field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "ListLlmConfigurations",
+ "x-stoplight": {
+ "id": "inxxqoo6ktslt"
+ },
+ "description": "List the account configured Large Language Models.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ }
+ },
+ "/customers/{customerId}": {
+ "put": {
+ "tags": [
+ "Customer"
+ ],
+ "summary": "Update Customer",
+ "description": "Updates a customer by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/customer-update-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "No Content\n",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n* “invalid”: Invalid input in “name” field on the error response.\n* \"deleted\": Some of the selected values were deleted and cannot be selected for some values of the \"customFields\" field.\n",
+ "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.\n\n",
+ "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 resource.",
+ "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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": duplicate name of a customer is not allowed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "UpdateCustomer"
+ },
+ "get": {
+ "tags": [
+ "Customer"
+ ],
+ "summary": "Get Customer",
+ "description": "Retrieves a customer by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/customer"
+ }
+ }
+ },
+ "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.\n\n",
+ "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 resource.",
+ "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": "GetCustomer"
+ },
+ "delete": {
+ "tags": [
+ "Customer"
+ ],
+ "summary": "Delete Customer",
+ "description": "Deletes a customer.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "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 customer.",
+ "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 customer could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"conflict\": there might be resources that are still `attached`.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "DeleteCustomer"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/customerId"
+ }
+ ]
+ },
+ "/customers": {
+ "get": {
+ "tags": [
+ "Customer"
+ ],
+ "summary": "List Customers",
+ "description": "Retrieves a list of all the customers 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-customers-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 it's 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": "ListCustomers"
+ },
+ "post": {
+ "tags": [
+ "Customer"
+ ],
+ "summary": "Create Customer",
+ "description": "Create customer in a tenant.\n\nFor adding a customer to a tenant the authenticated user must have 'Create Customer' permission.\n\nTo also create an account for the key contact, you need to have the specific entitlements.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/customer-create-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "The customer was successfully created.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/customer"
+ },
+ "examples": {
+ "minimal": {
+ "value": {
+ "id": "string"
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n\n* “invalid”: invalid input specified in the error details.\n* \"empty\": empty input for required field specified in the error details.\n* \"maxSize\": The maximum size was exceeded for the value mentioned in the \"name\" field. \n* \"deleted\": Some of the selected values were deleted and cannot be selected for some values of the \"customFields\" field.\n",
+ "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\": \n- The authenticated user is not allowed to create a customer or if you intend to create the key contact account, you might not have sufficient permissions.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "408": {
+ "description": "Error responses:\n\n * \"timeout\": The request took longer than expected. The system might be overloaded. You might try again.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error responses:\n\n* “duplicate”: duplicate value for the field mentioned in the error details.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "CreateCustomer"
+ }
+ },
+ "/custom-field-definitions": {
+ "get": {
+ "summary": "List Custom Field Definitions",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-custom-field-definitions-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 it's 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": "ListCustomFields",
+ "description": "Retrieves a list of all the custom field definitions.",
+ "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"
+ }
+ ],
+ "tags": [
+ "Custom Field"
+ ]
+ }
+ },
+ "/custom-field-definitions/{customFieldDefinitionId}": {
+ "get": {
+ "summary": "Get Custom Field Definition",
+ "tags": [
+ "Custom Field"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/custom-field-definition"
+ }
+ }
+ },
+ "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 get the custom field definition.",
+ "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": "GetCustomField",
+ "description": "Retrieves a Custom Field by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/customFieldDefinitionId"
+ }
+ ]
+ },
+ "/file-processing-configurations/{fileProcessingConfigurationId}": {
+ "get": {
+ "tags": [
+ "File Processing Configuration"
+ ],
+ "summary": "Get File Processing Configuration",
+ "description": "Retrieves a file processing configuration 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/file-processing-configuration"
+ }
+ }
+ },
+ "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\": not allowed to read file processing configuration.",
+ "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\": file processing configuration could not be found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetFileProcessingConfiguration"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/fileProcessingConfigurationId"
+ }
+ ]
+ },
+ "/file-processing-configurations": {
+ "get": {
+ "tags": [
+ "File Processing Configuration"
+ ],
+ "summary": "List File Processing Configurations",
+ "description": "Retrieves a list of all the file processing configurations 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-file-processing-configurations-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 it's 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": "ListFileProcessingConfigurations"
+ }
+ },
+ "/file-processing-configurations/{fileProcessingConfigurationId}/file-type-settings/{fileTypeSettingId}": {
+ "get": {
+ "tags": [
+ "File Processing Configuration"
+ ],
+ "summary": "Get File Type Setting",
+ "description": "Retrieves a file type setting 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/file-type-setting"
+ }
+ }
+ },
+ "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\": not allowed to read file type setting.",
+ "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\": file type setting could not be found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetFileTypeSetting"
+ },
+ "parameters": [
+ {
+ "name": "fileProcessingConfigurationId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The file processing configuration identifier."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileTypeSettingId",
+ "in": "path",
+ "required": true,
+ "description": "The file type setting identifier."
+ }
+ ]
+ },
+ "/file-processing-configurations/{fileProcessingConfigurationId}/file-type-settings": {
+ "get": {
+ "tags": [
+ "File Processing Configuration"
+ ],
+ "summary": "List File Type Settings",
+ "description": "Retrieves a list of all the file type settings in a file processing configuration.",
+ "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/list-file-type-settings-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"
+ }
+ }
+ }
+ },
+ "operationId": "ListFileTypeSettings"
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileProcessingConfigurationId",
+ "in": "path",
+ "required": true,
+ "description": "The file processing configuration identifier."
+ }
+ ]
+ },
+ "/files": {
+ "post": {
+ "summary": "Upload Zip File",
+ "description": "Uploads an archive containing source files in `.zip` format, which will be extracted and used during project creation.\n\nStatus of the upload operation can be tracked using the [Poll Upload Zip File](#/operations/PollUploadZipFile) endpoint.\n\nOnce this Upload Zip File operation has finished extracting the files, they can be added to the desired project using the [Attach Source Files](#/operations/AddSourceFiles) endpoint. Alternatively, they can be used to [Request File Analysis](#/operations/RequestFileAnalysis) details like word counts and estimated costs.\n\n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when uploading files.",
+ "operationId": "UploadZipFile",
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "format": "byte",
+ "required": [
+ "file"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The .zip file to be uploaded (binary string). "
+ }
+ }
+ }
+ }
+ },
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-upload-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error code “invalid” in case of:\n * Empty or missing file in request\n * Not valid multipart request\n * File parameter contains other extension than the one expected by specification.",
+ "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"
+ }
+ }
+ }
+ },
+ "tags": [
+ "File"
+ ]
+ },
+ "parameters": []
+ },
+ "/files/analysis": {
+ "post": {
+ "summary": "Request File Analysis",
+ "responses": {
+ "202": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-analysis-operation-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\r\n* “invalid”: Invalid input in the request body parameter mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\r\n* \"forbidden\": the authenticated user is not allowed to read resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the resource could not be found.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "RequestFileAnalysis",
+ "x-stoplight": {
+ "id": "t57g1xy8y9r75"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "fileIds",
+ "sourceLanguage",
+ "languageProcessingRuleId"
+ ],
+ "properties": {
+ "fileIds": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "azlzt85a5lkl5"
+ },
+ "description": "The file identifiers for which the analysis will be performed.",
+ "items": {
+ "x-stoplight": {
+ "id": "g73xta7jy2re2"
+ },
+ "type": "string"
+ }
+ },
+ "sourceLanguage": {
+ "$ref": "#/components/schemas/source-language-request",
+ "x-stoplight": {
+ "id": "86x0qedyrl4rv"
+ },
+ "description": "The source language."
+ },
+ "languageProcessingRuleId": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "1g8puz69o0xu8"
+ },
+ "description": "The identifier of the Language Processing Rule to be used when determining word count."
+ },
+ "fileProcessingConfigurationId": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "hu1k8l2pqv2o8"
+ },
+ "description": "The identifier of the File Processing Configuration to be used when converting a file for analysis. \r\nA default configuration will be used if not specified."
+ },
+ "quotingOptions": {
+ "type": "object",
+ "x-stoplight": {
+ "id": "5l3iznluoo6kn"
+ },
+ "description": "Set these resources to calculate an estimated translation cost.",
+ "required": [
+ "pricingModelId",
+ "targetLanguages"
+ ],
+ "properties": {
+ "pricingModelId": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "5rf92aw1gkge2"
+ },
+ "description": "The identifier of the Pricing Model to be used when calculating the cost."
+ },
+ "targetLanguages": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "vyfoxy7wp48vl"
+ },
+ "description": "The target languages for which the cost will be calculated.",
+ "items": {
+ "$ref": "#/components/schemas/target-language-request",
+ "x-stoplight": {
+ "id": "pwvr1t18i9dym"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "description": "This endpoint allows you to request the word count and an estimated cost for your files. \r\n\r\nUse the [Upload Zip File](#/operations/UploadZipFile) / [Poll Upload Zip File](#/operations/PollUploadZipFile) endpoints to upload your files and get the `fileIds`. Send these `fileIds` together with the `languageProcessingRuleId` and `sourceLanguage` to receive the word count.\r\n\r\nOptionally, send the `quotingOptions` object to receive the `estimatedCosts`.\r\n\r\nUse the [Poll File Analysis](#/operations/PollFileAnalysis) endpoint to monitor the operation and receive the analysis results.\r\n\r\n> File analysis results will be available for 24 hours after generation.",
+ "tags": [
+ "File"
+ ]
+ },
+ "parameters": []
+ },
+ "/files/analysis/{operationId}": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "operationId",
+ "in": "path",
+ "required": true,
+ "description": "The file analysis operation identifier."
+ }
+ ],
+ "get": {
+ "summary": "Poll File Analysis",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-analysis-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\r\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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\r\n* \"forbidden\": the authenticated user is not allowed to read resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the quoting operation could not be found.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "PollFileAnalysis",
+ "x-stoplight": {
+ "id": "8iqm2m3c577th"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Monitor the [File Analysis](#/operations/RequestFileAnalysis) operation and receive the analysis results.\r\n\r\n> File analysis results will be available for 24 hours after generation.",
+ "tags": [
+ "File"
+ ]
+ }
+ },
+ "/files/{fileId}": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileId",
+ "in": "path",
+ "required": true,
+ "description": "The uploaded file id"
+ }
+ ],
+ "get": {
+ "summary": "Poll Upload Zip File",
+ "operationId": "PollUploadZipFile",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-metadata-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 uploaded files.",
+ "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 file could not be found by id.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "description": "Monitors the unzipping operation for a previously uploaded archive and retrieves details about the extracted files.\r\n\r\nOnce the [Upload Zip File](#/operations/UploadZipFile) operation has finished extracting the files, they can be added to the desired project using the [Attach Source Files](#/operations/AddSourceFiles) endpoint.\r\n Alternatively, they can be used to [Request File Analysis](#/operations/RequestFileAnalysis) details like word counts and estimated costs.\r\n",
+ "tags": [
+ "File"
+ ]
+ }
+ },
+ "/folders/{folderId}": {
+ "get": {
+ "tags": [
+ "Folder"
+ ],
+ "summary": "Get Folder",
+ "description": "Retrieves a folder 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/folder"
+ }
+ }
+ },
+ "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 folder.",
+ "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 Folder 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": "GetFolder"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/folderId"
+ }
+ ]
+ },
+ "/folders/root": {
+ "get": {
+ "tags": [
+ "Folder"
+ ],
+ "summary": "Get Root Folder",
+ "description": "Retrieves the Root folder in the account.",
+ "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/folder"
+ }
+ }
+ },
+ "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 resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetRootFolder"
+ }
+ },
+ "/folders": {
+ "get": {
+ "tags": [
+ "Folder"
+ ],
+ "summary": "List Folders",
+ "description": "Retrieves a list of all the folders in an account. Max 500.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "description": "Filter folders by name.",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-folders-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"
+ }
+ }
+ }
+ },
+ "operationId": "ListFolders"
+ }
+ },
+ "/groups/{groupId}": {
+ "get": {
+ "tags": [
+ "Group"
+ ],
+ "summary": "Get Group",
+ "description": "Retrieves a group 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/group"
+ }
+ }
+ },
+ "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 Group.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the Group could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetGroup"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/groupId"
+ }
+ ]
+ },
+ "/groups": {
+ "get": {
+ "tags": [
+ "Group"
+ ],
+ "summary": "List Groups",
+ "description": "Retrieves a list of all the groups 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-groups-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 it's 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": "ListGroups"
+ }
+ },
+ "/languages": {
+ "get": {
+ "tags": [
+ "Language"
+ ],
+ "summary": "List Languages",
+ "description": "Retrieves a list of all the languages.\n\nThe supported values for language `type` filter are: \"all\", \"specific\" or \"neutral\".\\\nThe \"neutral\" languages are the generic languages, e.g.: en -> English.\\\nThe \"specific\" languages are the sub-languages, e.g.: en-150 -> English (Europe), en-us -> English (United States).",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "name": "languageCodes",
+ "in": "query",
+ "description": "Filter by language codes.",
+ "style": "form",
+ "explode": false,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "description": "Filter by type.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "all",
+ "specific",
+ "neutral"
+ ],
+ "example": "specific"
+ }
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-languages-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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "ListLanguages"
+ }
+ },
+ "/language-processing-rules": {
+ "get": {
+ "summary": "List Language Processing Rules",
+ "tags": [
+ "Language Processing"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-language-processing-rules"
+ }
+ }
+ },
+ "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 it's 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": "ListLanguageProcessingRules",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ },
+ {
+ "$ref": "#/components/parameters/sort"
+ },
+ {
+ "$ref": "#/components/parameters/location"
+ },
+ {
+ "$ref": "#/components/parameters/location-strategy"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Returns a list of Language Processing Rules."
+ }
+ },
+ "/language-processing-rules/{languageProcessingRuleId}": {
+ "get": {
+ "summary": "Get Language Processing Rule",
+ "tags": [
+ "Language Processing"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/language-processing-rule"
+ }
+ }
+ },
+ "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 resource.",
+ "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": "GetLanguageProcessingRule",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Returns a Language Processing Rule by identifier."
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "languageProcessingRuleId",
+ "in": "path",
+ "required": true,
+ "description": "The language processing rule identifier"
+ }
+ ]
+ },
+ "/perfect-match-mappings": {
+ "post": {
+ "summary": "Create PerfectMatch Mapping",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-mapping-create-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \r\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\r\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"
+ }
+ }
+ },
+ "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: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\r\n* \"conflict\": the project has no source files.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "CreatePerfectMatchMapping",
+ "x-stoplight": {
+ "id": "thyh9npsnqozm"
+ },
+ "description": "For more details on the PerfectMatch feature please consult the [official documentation](https://docs.rws.com/791595/1155478/trados-enterprise---accelerate/perfectmatch-general-information).\r\n\r\nAfter creating a mapping, target files from the `matchingProjects` are automatically matched to the source files in the new project. This is a long-running background operation, and its `status` can be tracked by polling the [Get PerfectMatch Mapping](#/operations/GetPerfectMatchMapping) endpoint.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-mapping-create-request"
+ }
+ }
+ },
+ "description": ""
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "parameters": []
+ },
+ "/perfect-match-mappings/{mappingId}": {
+ "get": {
+ "summary": "Get PerfectMatch Mapping",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-mapping-response"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \r\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: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\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": "GetPerfectMatchMapping",
+ "description": "Retrieves the details of a PerfectMatch mapping.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "x-stoplight": {
+ "id": "gypb1u4fb5r8v"
+ }
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ }
+ ]
+ },
+ "/perfect-match-mappings/{mappingId}/batch-mappings": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "post": {
+ "summary": "Add PerfectMatch Batch Mapping",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-mapping-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \r\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes: \r\n* “conflict”: A pending batch mapping already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "AddPerfectMatchBatchMapping",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-batch-mapping-update-request"
+ }
+ }
+ }
+ },
+ "description": "Adds a new PerfectMatch batch mapping.\r\n\r\nWhen new source files are introduced to a mid-project, a new batch must be added to the current mapping to leverage PerfectMatch. This action triggers a background operation that identifies matching candidates for the newly added files.",
+ "x-stoplight": {
+ "id": "ojtqa1eu0nop1"
+ }
+ }
+ },
+ "/perfect-match-mappings/{mappingId}/batch-mappings/{batchMappingId}": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "batchMappingId",
+ "in": "path",
+ "required": true,
+ "description": "The batch mapping identifier"
+ }
+ ],
+ "put": {
+ "summary": "Update PerfectMatch Batch Mapping",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \r\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\r\n* \"updateNotAllowed\": the resource could not be updated at this time.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "UpdatePerfectMatchBatchMapping",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-batch-mapping-update-request"
+ }
+ }
+ }
+ },
+ "description": "Updates a PerfectMatch batch mapping.\r\n\r\nPay special attention to how [updating works](../docs/Updating-data-with-PUT.html).",
+ "x-stoplight": {
+ "id": "k414o2pdrvauv"
+ }
+ }
+ },
+ "/perfect-match-mappings/{mappingId}/batch-mappings/{batchMappingId}/file-mappings/{fileMappingId}/project-file": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "batchMappingId",
+ "description": "The batch mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileMappingId",
+ "description": "The file mapping identifier",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "put": {
+ "summary": "Update File Mapping With Project File",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "204": {
+ "description": "",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {}
+ },
+ "400": {
+ "description": "Error codes: \r\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.\r\n",
+ "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: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "UpdatePerfectMatchFileMappingWithProjectFile",
+ "x-stoplight": {
+ "id": "7v7r948reznq7"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-project-file-mapping-request"
+ }
+ }
+ }
+ },
+ "description": "Updates a PerfectMatch file mapping with an existing target file from a PerfectMatch candidate. Only valid candidates can be used to request an update.\r\n\r\nUse the [Candidates](#/operations/GetPerfectMatchCandidates) endpoint to retrieve a list of valid `fileId` and `projectId` to provide as matching data. "
+ }
+ },
+ "/perfect-match-mappings/{mappingId}/batch-mappings/{batchMappingId}/file-mappings/{fileMappingId}/file": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "batchMappingId",
+ "description": "The batch mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileMappingId",
+ "description": "The file mapping identifier",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "post": {
+ "summary": "Update File Mapping With Manually Uploaded File",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "204": {
+ "description": "",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \r\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response.\r\n",
+ "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: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "UpdatePerfectMatchFileMappingWithManuallyUploadedFile",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/perfect-match-custom-file-mapping-request"
+ }
+ }
+ }
+ },
+ "description": "Updates a PerfectMatch file mapping with a manually uploaded file.",
+ "x-stoplight": {
+ "id": "l5u5ir8uz9kr"
+ }
+ }
+ },
+ "/perfect-match-mappings/{mappingId}/batch-mappings/{batchMappingId}/file-mappings/{fileMappingId}/target-languages/{targetLanguage}": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "batchMappingId",
+ "description": "The batch mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileMappingId",
+ "description": "The file mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "targetLanguage",
+ "description": "The target language code",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "delete": {
+ "summary": "Delete PerfectMatch File Mapping For a File",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "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: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\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": "DeletePerfectMatchFileMappingForFile",
+ "x-stoplight": {
+ "id": "hzhi7qsfd975q"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "description": "Deletes a PerfectMatch file mapping for a specific file and target language."
+ }
+ },
+ "/perfect-match-mappings/{mappingId}/batch-mappings/{batchMappingId}/file-mappings/{fileMappingId}/target-languages/{targetLanguage}/candidates": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "mappingId",
+ "description": "The mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "batchMappingId",
+ "description": "The batch mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fileMappingId",
+ "description": "The file mapping identifier",
+ "in": "path",
+ "required": true
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "targetLanguage",
+ "description": "The target language code",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "get": {
+ "summary": "Get PerfectMatch Candidates",
+ "description": "Retrieves a list of file candidates that can be selected for PerfectMatch.",
+ "tags": [
+ "PerfectMatch Mapping"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-perfect-match-candidates-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \r\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: \r\n* \"forbidden\": the authenticated user is not allowed to read the resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "GetPerfectMatchCandidates",
+ "x-stoplight": {
+ "id": "fbia0pjkxv11t"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ }
+ },
+ "/machine-translation": {
+ "parameters": [],
+ "get": {
+ "summary": "List Machine Translations",
+ "operationId": "ListMachineTranslations",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-machine-translations-response"
+ }
+ }
+ }
+ },
+ "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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Retrieves a list of machine translations that can be used in a translation engine.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "sourceLanguage",
+ "required": true,
+ "description": "Language code expressed as generic language (example: \"en\") or specific language (example: \"en-US\")"
+ },
+ {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "in": "query",
+ "name": "targetLanguage",
+ "required": true,
+ "description": "List of language codes separated by comma, values can be generic language code or specific language code."
+ }
+ ],
+ "tags": [
+ "Machine Translation"
+ ],
+ "x-stoplight": {
+ "id": "pnd31f3gjids8"
+ }
+ }
+ },
+ "/pricing-models": {
+ "get": {
+ "tags": [
+ "Pricing Model"
+ ],
+ "summary": "List Pricing Models",
+ "description": "Retrieves a list of all the pricing models in an account.\r\n\r\nSorting is supported for the following fields: `name`, `description`, `currencyCode` and `location`.",
+ "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-pricing-models-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": "ListPricingModels"
+ },
+ "post": {
+ "summary": "Create Pricing Model",
+ "tags": [
+ "Pricing Model"
+ ],
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pricing-model"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\r\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\r\n* \"empty\": Empty mandatory value mentioned in the \"name\" field on the error response.\r\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\r\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response. \r\n",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\r\n* “forbidden”: The authenticated user is not allowed to create the pricing model\r\n",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "CreatePricingModel",
+ "x-stoplight": {
+ "id": "5xf6yyxydnib9"
+ },
+ "description": "Creates a new pricing model.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pricing-model-create-request"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/pricing-models/{pricingModelId}": {
+ "get": {
+ "tags": [
+ "Pricing Model"
+ ],
+ "summary": "Get Pricing Model",
+ "description": "Retrieves a pricing model 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/pricing-model"
+ }
+ }
+ },
+ "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 pricing model.",
+ "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": "GetPricingModel"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/pricingModelId"
+ }
+ ],
+ "put": {
+ "summary": "Update Pricing Model",
+ "tags": [
+ "Pricing Model"
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\r\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\r\n* \"empty\": Empty mandatory value mentioned in the \"name\" field on the error response.\r\n* \"minSize\": Minimum size exceeded for the value mentioned in the \"name\" field on the error response.\r\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" field on the error response.\r\n* \"missing\": Missing required field for the value mentioned in the \"name\" field on the error response. ",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\r\n* \"forbidden\": the authenticated user is not allowed to update the pricing model.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the pricing model could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "UpdatePricingModel",
+ "x-stoplight": {
+ "id": "519y1mm5q2twn"
+ },
+ "description": "Updates a pricing model.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/pricing-model-update-request"
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "summary": "Delete Pricing Model",
+ "tags": [
+ "Pricing Model"
+ ],
+ "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 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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\r\n* \"forbidden\": the authenticated user is not allowed to delete the pricing model.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\r\n* \"notFound\": the pricing model 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": "DeletePricingModel",
+ "x-stoplight": {
+ "id": "48vkxmoxbdoz0"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "description": "Deletes a pricing model."
+ }
+ },
+ "/projects": {
+ "get": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "List Projects",
+ "description": "Retrieves a list of all the projects in the 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"
+ },
+ {
+ "schema": {
+ "type": "boolean"
+ },
+ "in": "query",
+ "name": "excludeOnline",
+ "description": "Excludes projects that are being worked on exclusively in the Online Editor"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "created",
+ "inProgress",
+ "completed",
+ "archived"
+ ]
+ },
+ "in": "query",
+ "name": "status",
+ "description": "Filter the list to include projects that have this status."
+ },
+ {
+ "schema": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-11-28T16:46:00.00Z"
+ },
+ "in": "query",
+ "name": "createdFrom",
+ "description": "Filter the list to include only projects created after the specified date and time."
+ },
+ {
+ "schema": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-11-28T16:46:00.00Z"
+ },
+ "in": "query",
+ "name": "createdTo",
+ "description": "Filter the list to include only projects created before the specified date and time."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "createdBy",
+ "description": "Filter the list of projects to projects that were created by this user."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "projectTemplateId",
+ "description": "Filter the list of projects to projects that were created using this project template."
+ },
+ {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "in": "query",
+ "name": "projectIds",
+ "description": "Filter the list of projects to projects have these project identifiers."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "sourceLanguage",
+ "description": "Filter the list of projects to projects that were created using this source language."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "targetLanguage",
+ "description": "Filter the list of projects to projects that were created using this target language."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "projectName",
+ "description": "Filter the list of projects to projects that were created using this project name."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "dueFrom",
+ "description": "Filter the list of projects to projects that are due after this date and time. Accepted format: ISO-8601 `YYYY-MM-DDThh:mm:ss.sssZ`"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "dueTo",
+ "description": "Filter the list of projects to projects that are due before this date and time. Accepted format: ISO-8601 `YYYY-MM-DDThh:mm:ss.sssZ`"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "lastModifiedFrom",
+ "description": "Filter the list of projects to projects that are last modified after this date and time. Accepted format: ISO-8601 `YYYY-MM-DDThh:mm:ss.sssZ`"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "lastModifiedTo",
+ "description": "Filter the list of projects to projects that are last modified before this date and time. Accepted format: ISO-8601 `YYYY-MM-DDThh:mm:ss.sssZ`"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-projects-response"
+ },
+ "examples": {
+ "numbers": {
+ "value": {
+ "itemCount": 1,
+ "items": [
+ {
+ "id": "test-id",
+ "quote": {
+ "additionalCosts": [
+ {
+ "name": "test-additional-cost-name",
+ "count": 1,
+ "runningTotal": 1
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "missing-required-integer": {
+ "value": {
+ "items": [
+ {
+ "id": "test-id",
+ "quote": {
+ "additionalCosts": [
+ {
+ "name": "test-additional-cost-name",
+ "count": 1,
+ "runningTotal": 1
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "missing-optional-integer": {
+ "value": {
+ "itemCount": 1,
+ "items": [
+ {
+ "id": "test-id",
+ "quote": {
+ "additionalCosts": [
+ {
+ "name": "test-additional-cost-name",
+ "runningTotal": 1
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "missing-optional-double": {
+ "value": {
+ "itemCount": 1,
+ "items": [
+ {
+ "id": "test-id",
+ "quote": {
+ "additionalCosts": [
+ {
+ "name": "test-additional-cost-name",
+ "count": 1
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "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": "ListProjects"
+ },
+ "post": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Create Project",
+ "description": "Creates a new project.\n\nWhen creating a project using a project template that supports multiple source languages, you must supply the `languageDirections`.\n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when creating projects.\n\nThe values from a selected project template will take precedence over the individual resources when creating a new project.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-create-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project"
+ },
+ "examples": {
+ "minimal": {
+ "value": {
+ "id": "string"
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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. \n* \"deleted\": Some of the selected values were deleted and cannot be selected for some values of the \"customFields\" field.\n",
+ "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\": \n- The authenticated user is not allowed to create the project in the specified location.\n- Your subscription does not include access to the requested type of benefit.",
+ "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": "CreateProject"
+ }
+ },
+ "/projects/{projectId}": {
+ "get": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Get Project",
+ "description": "Retrieves a project by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project"
+ },
+ "examples": {
+ "valid-response": {
+ "value": {
+ "id": "test-id",
+ "name": "test-name",
+ "description": "test-description",
+ "dueBy": "2042-07-28T11:13:36.000Z",
+ "createdAt": "2021-07-28T11:13:36.000Z",
+ "status": "completed",
+ "languageDirections": [
+ {
+ "id": "language-direction-id",
+ "sourceLanguage": {
+ "languageCode": "test-source-languageCode",
+ "isNeutral": false
+ },
+ "targetLanguage": {
+ "languageCode": "test-target-languageCode",
+ "isNeutral": true
+ }
+ }
+ ]
+ }
+ },
+ "missing-required-string": {
+ "value": {
+ "name": "test-name",
+ "description": "test-description",
+ "dueBy": "2042-07-28T11:13:36.000Z",
+ "createdAt": "2021-07-28T11:13:36.000Z",
+ "status": "completed"
+ }
+ },
+ "missing-optional-string": {
+ "value": {
+ "id": "test-id",
+ "description": "test-description",
+ "dueBy": "2042-07-28T11:13:36.000Z",
+ "createdAt": "2021-07-28T11:13:36.000Z",
+ "status": "completed"
+ }
+ },
+ "missing-optional-datetime": {
+ "value": {
+ "id": "test-id",
+ "name": "test-name",
+ "description": "test-description",
+ "createdAt": "2021-07-28T11:13:36.000Z",
+ "status": "completed"
+ }
+ },
+ "missing-optional-enum": {
+ "value": {
+ "id": "test-id",
+ "name": "test-name",
+ "description": "test-description",
+ "dueBy": "2042-07-28T11:13:36.000Z",
+ "createdAt": "2021-07-28T11:13:36.000Z"
+ }
+ },
+ "missing-optional-boolean": {
+ "value": {
+ "id": "test-id",
+ "languageDirections": [
+ {
+ "id": "language-direction-id",
+ "sourceLanguage": {
+ "languageCode": "test-source-languageCode"
+ },
+ "targetLanguage": {
+ "languageCode": "test-target-languageCode"
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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": "GetProject"
+ },
+ "put": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Update Project",
+ "description": "Updates the project in terms of: name, description, due date, quote, and project resources. Observe the rules of [JSON Merge Patch Semantics](https://tools.ietf.org/html/rfc7386). \n\nProject rescheduling (updating dueBy) is permitted only if: \n* there is no Customer Quote Approval task in the associated flow \n* at least one Customer Quote Approval was closed(in case multiple project batches) \n\nUpdate `projectPlan.taskConfigurations` are now permitted before project is started. Elements are now pre-populated at project creation time.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-update-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n\n* “invalid”: invalid input on update quote model\n* “invalidStatus”: the quote cannot be edited, the project is in a phase which doesn't allow the quote to be edited\n* \"conflict\": the project does not have a quote to be updated\n* \"limit.exceeded\": a maximum number of users per task was assigned\n \n* \"deleted\": Some of the selected values were deleted and cannot be selected for some values of the \"customFields\" field.\n",
+ "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 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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error responses:\n\n* “invalidStatus”: a field cannot be edited, because the project is in a status which doesn't allow the field to be edited. `details.name` will provide the field name which is not allowed to be edited.\n\n* updateNotAllowed: a field of the project cannot be edited before the completion of customer approval.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "UpdateProject"
+ },
+ "delete": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Delete Project",
+ "description": "Deletes a project.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "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 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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "DeleteProject"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/configuration": {
+ "get": {
+ "summary": "Get Project Configuration",
+ "description": "Get the configuration settings of an existing project.",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-configuration"
+ }
+ }
+ },
+ "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 get the project configuration.",
+ "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": "GetProjectConfiguration",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "tags": [
+ "Project"
+ ]
+ },
+ "put": {
+ "summary": "Update Project Configuration",
+ "description": "Updates the configuration settings for an existing project.",
+ "operationId": "UpdateProjectConfiguration",
+ "tags": [
+ "Project"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "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 update the project configuration.",
+ "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"
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-configuration-request"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/pricing-model": {
+ "put": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Update Project Pricing Model",
+ "description": "Update project pricing model only during Customer Quote Review task type.",
+ "operationId": "UpdateProjectPricingModel",
+ "responses": {
+ "204": {
+ "description": "",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “invalidPricingModel”: There is mismatch configuration between the project and the new pricing model.\n* \"differentCurrencyCode\": There is a mismatch between the provided pricing model currency and the pricing model currency in the project.\n* “differentFuzzyBands”: There is a mismatch between the provided pricing model fuzzy bands and the pricing model fuzzy bands in the project.",
+ "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 project configuration.",
+ "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"
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-pricing-model-update-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "x-stoplight": {
+ "id": "ypm1hf7wad9at"
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/start": {
+ "put": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Start Project",
+ "description": "Starts a project. Translatable files should be uploaded before starting the project. If the action is executed on an already started project, the new translatable files should be uploaded first.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "Accepted",
+ "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 start 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 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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": the project's status doesn't permit the start operation.\n* \"missingTranslatableFile\": there was no translatable file attached to the project.\n* \"missingWorkflow\": there was no workflow associated with the project.\n* \"invalidWorkflow\" : the workflow associated with the project is invalid or has errors.\n* \"missingConfigurations\": not all manual task templates have configurations.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "StartProject"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/complete": {
+ "put": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Complete Project",
+ "description": "Marks a project as \"completed\".",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "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 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": "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"
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to complete 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 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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"projectAlreadyCompleted\": the project it is already in completed state.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "CompleteProject"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/files/exports": {
+ "post": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Export Project Files",
+ "operationId": "ExportProjectFiles",
+ "description": "Generates an asynchronous export operation. To monitor the progress until completion, use the [Poll Project Files Export](#/operations/ExportProjectFilesStatus) endpoint. \n\nThis operation triggers the packaging of the project files into a `zip` format.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Export Operation was triggered successfully",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/zip-file-export-response"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - the authenticated user is not allowed to trigger an export on the specified project, or does not have access to the project.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the project could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/zip-file-export-request"
+ }
+ }
+ }
+ },
+ "x-stoplight": {
+ "id": "5hbbqpkqxmfyt"
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/files/exports/{exportId}": {
+ "get": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Poll Project Files Export",
+ "operationId": "ExportProjectFilesStatus",
+ "description": "Retrieves the state of the export operation. \n\n Once the state is marked as `done`, you can download the generated `zip` file using the following endpoint: [Download Exported Project Files](#/operations/DownloadFile).",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/zip-file-export-response"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - the authenticated user is not allowed to retrieve the details of the export.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the export operation could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "exportId",
+ "in": "path",
+ "required": true,
+ "description": "The export identifier."
+ }
+ ],
+ "x-stoplight": {
+ "id": "uyc9zdzlangtw"
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/files/exports/{exportId}/download": {
+ "get": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "Download Exported Project Files",
+ "description": "Downloads the generated `zip` file containing the files according to initial export operation parameters. \n\nThe final ZIP file will be named using the project name. \n\n When the export operation is performed with `downloadFlat=true` and one target language specified, the resulting ZIP file name will be a combination of the project name and the target language code, as defined by the [Export Project Files](#/operations/ExportProjectFiles) endpoint.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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 file could not be found by identifier.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"conflict\": the export operation is not done yet.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "x-codegen-download": true,
+ "operationId": "DownloadFile",
+ "x-stoplight": {
+ "id": "r8ac4c1ortxtw"
+ }
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "projectId",
+ "in": "path",
+ "required": true,
+ "description": "The identifier of the project."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "exportId",
+ "in": "path",
+ "required": true,
+ "description": "The identifier of the export operation."
+ }
+ ]
+ },
+ "/projects/{projectId}/source-files": {
+ "get": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "List Source Files",
+ "description": "Retrieves the source files in a project.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$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-source-files-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\": not authorized to retrieve source files on 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.",
+ "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": "ListSourceFiles"
+ },
+ "post": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Add Source File",
+ "description": "Adds a source file to the project. Files can be uploaded before starting a project or after the project has started. When adding a `translatable` file after the project started, a new start project request should be performed.\n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when uploading files.\n\n> Note: The maximum character size of the sum between the `name` and the `path` fields must not exceed 255. Otherwise the request cannot be validated.\n\n> Note: Zip files will be added as reference files. If you want to upload zip files, please use the [Upload Zip File](#/operations/UploadZipFile) endpoint.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "properties",
+ "file"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/components/schemas/source-file-request"
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The source file (binary string)."
+ }
+ }
+ }
+ }
+ },
+ "required": true,
+ "description": "For details on how to send multipart/form-data with `properties` see this [article](../docs/How-to-multipart.html)."
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input on for the value mentioned in the “name” field on the error response.\n* \"empty\": missing input 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.",
+ "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 add a source file to the project.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": duplicate source file name inside a project is not allowed.\n* \"projectAlreadyCompleted\": resource can not be added because the project it is in completed state.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "AddSourceFile"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ],
+ "put": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Update Source Files",
+ "operationId": "UpdateSourceFiles",
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - the authenticated user is not allowed to update the source file.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the project could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": a file with the same name already exists."
+ }
+ },
+ "description": "Updates multiple source files. If any of the files fails to be updated, an error will be returned for each file. ",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-files-update-request"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/projects/{projectId}/source-files/attach-files": {
+ "post": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Attach Source Files",
+ "description": "This endpoint can only be used after files have been uploaded via the [Upload Zip File](#/operations/UploadZipFile) endpoint. It allows you to add multiple source files to a project. \n\n Each file must be individually attached by setting the `fileUrl` to the `associatedFiles.id` returned by the [Poll Upload Zip File](#/operations/PollUploadZipFile) endpoint, once the `unzipStatus` is `extracted`. \n\nIf a file is attached after the project has already been started, a new start project request must be made.\n\n> Note: The maximum character size of the sum between the `name` and the `path` fields must not exceed 255. Otherwise the request cannot be validated.\n",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file-attachment-request"
+ }
+ }
+ },
+ "required": true,
+ "description": ""
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file-attachment-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": invalid input on for the value mentioned in the “name” field on the error response.\n* \"empty\": missing input 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.",
+ "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 attach a source file on the project.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": duplicate source file name inside a project is not allowed.\n* \"duplicate\": duplicate fileUrl inside a project is not allowed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "AddSourceFiles"
+ },
+ "parameters": [
+ {
+ "name": "projectId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The project identifier."
+ }
+ ]
+ },
+ "/projects/{projectId}/source-files/{sourceFileId}": {
+ "get": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Get Source File",
+ "description": "Retrieves a source file from the project.",
+ "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/source-file"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value 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 resource.",
+ "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 or the source file 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": "GetSourceFile"
+ },
+ "put": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Update Source File",
+ "operationId": "UpdateSourceFile",
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - the authenticated user is not allowed to update the target file.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the project or the source file could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": a file with the same name already exists."
+ }
+ },
+ "description": "Updates a source file.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file-rename-request"
+ }
+ }
+ }
+ },
+ "parameters": []
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/sourceFileId"
+ }
+ ]
+ },
+ "/projects/{projectId}/source-files/{sourceFileId}/versions": {
+ "get": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "List Source File Versions",
+ "description": "Retrieves all the versions of a source file.",
+ "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/list-source-file-versions-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 retrieve the source file versions.",
+ "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 or the source file 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": "ListSourceFileVersions"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/sourceFileId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/source-files/{sourceFileId}/versions": {
+ "parameters": [
+ {
+ "name": "sourceFileId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The source file identifier."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "taskId",
+ "in": "path",
+ "required": true,
+ "description": "The task identifier."
+ }
+ ],
+ "post": {
+ "summary": "Add Source File Version",
+ "tags": [
+ "Source File"
+ ],
+ "operationId": "AddSourceFileVersion",
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file-version-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.\n* \"invalid\": the provided document is not a valid BCM file.\n* \"invalid\": invalid file format\n* \"multiPartOrder\": the multipart order in body is not correct. `properties` must be the first, followed by `file`.",
+ "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 resource.",
+ "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\": \\\n \\- the specified task or the source file was not found.\\\n \\- the request is performed in a task that doesn't have the input file type as source file and is used a target file identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"noOwner\": the task has no owner.\n* \"differentOwner\": the authenticated user is not the owner of the task.\n* \"differentServiceUserOwner\": the authenticated service user is not the owner of the task.\n* \"taskCompleted\": adding source file version is not allowed when the task is completed.\n* \"unsupported\" : you cannot add a source file version for this task.\n* \"duplicate\": a file with the same name already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "properties",
+ "file"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/components/schemas/source-file-version-properties-create-request",
+ "description": "Source file properties sent as a JSON inside a text part."
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The source file (binary string)."
+ }
+ }
+ }
+ }
+ },
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "description": "Adds a new version of the source file in [BCM](https://developers.rws.com/languagecloud-api-docs/articles/BCM.NET_client_API.html) or native format. More information about file formats can be found on the [File formats](../docs/File-formats.html) page.\n\nThe version is added on the task represented by `taskId`. To successfully execute the add operation the task should already be assigned and accepted by a user. If the task is automatic, it's possible to add a source file version only when the status of task is `inProgress`.\n\nThe file versions added need to respect the output file type declared by the task type of the enclosing task. On the [Rules for sequencing tasks correctly](https://docs.rws.com/791595/885137/trados-enterprise/rules-for-sequencing-tasks-correctly) page from the official RWS Documentation Center, you can find out what output file type is supported by each task.\n\nFor adding a source file version using an extension task, the configuration of the task must declare the `scope`'s value as \"file\".\n\nIf the file type of the new added file is different than the supported source file type, the new `fileTypeSettingsId` must be specified in the body or an update of file type should be performed after the add operation, using the [Update Source File Properties](#/operations/UpdateSourceProperties).\n\nThe value of `fileTypeSettingsId` is one of the identifiers listed by the [List File Type Settings](#/operations/ListFileTypeSettings) endpoint.\n\nThe [List File Type Settings](#/operations/ListFileTypeSettings) endpoint must be called with the File Processing Configuration identifier of your project.\n\nThe File Processing Configuration of your project can be retrieved from [Get Project](#/operations/GetProject) endpoint.\n\nThe multipart parameters in the body should respect and strictly follow the order specified in our documentation. \n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when adding files.\n",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ }
+ },
+ "/projects/{projectId}/source-files/{sourceFileId}/versions/{fileVersionId}/download": {
+ "get": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Download Source File Version",
+ "description": "Downloads a source file version.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "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 resource.",
+ "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, the source file or the file version could not be found by identifier.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "422": {
+ "description": "error codes:\n* \"maliciousContent\": the file contains malicious content. The infected file cannot be downloaded.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "x-codegen-download": true,
+ "operationId": "DownloadSourceFileVersion"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/sourceFileId"
+ },
+ {
+ "$ref": "#/components/parameters/fileVersionId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/source-files/{sourceFileId}": {
+ "get": {
+ "tags": [
+ "Source File"
+ ],
+ "summary": "Get Source File Properties",
+ "description": "Retrieves the properties for a source file.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file-properties-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 resource.",
+ "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 task or source file could not be found by id.\n",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetSourceFileProperties"
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "taskId",
+ "in": "path",
+ "required": true,
+ "description": "The task identifier."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "sourceFileId",
+ "in": "path",
+ "required": true,
+ "description": "The source file identifier."
+ }
+ ],
+ "put": {
+ "summary": "Update Source File Properties",
+ "tags": [
+ "Source File"
+ ],
+ "operationId": "UpdateSourceProperties",
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* “invalid”: invalid input on update source file properties.",
+ "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 resource.",
+ "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 specified task or the source file was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"noOwner\": the task has no owner.\n* \"differentOwner\": the authenticated user is not the owner of the task.\n* \"taskCompleted\": updating the source file properties is not allowed when the task is completed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Updates the properties of the source file.\n\n\nThe value of `fileTypeSettingsId` should be one of the identifiers listed by the [List File Type Settings](#/operations/ListFileTypeSettings) endpoint called with an identifier of a File Processing Configuration that exists on the project. The list of File Processing Configurations from a project can be retrieved by using the [List File Processing Configurations](#/operations/ListFileProcessingConfigurations) endpoint.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/source-file-properties-update-request"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ]
+ }
+ },
+ "/projects/{projectId}/target-files/{targetFileId}": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Get Target File",
+ "description": "Retrieves a target file from a project.",
+ "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/target-file"
+ }
+ }
+ },
+ "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 resource.",
+ "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 or the target file 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": "GetTargetFile"
+ },
+ "put": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Update Target File",
+ "operationId": "UpdateTargetFile",
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - the authenticated user is not allowed to update the target file.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the target file could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": a file with the same name already exists."
+ }
+ },
+ "description": "Updates a target file.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/target-file-rename-request"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "List Target Files",
+ "description": "Retrieves the target files for a project.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "name": "targetFileIds",
+ "in": "query",
+ "description": "Filter target files by identifiers.",
+ "style": "form",
+ "explode": false,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ {
+ "name": "sourceFileIds",
+ "in": "query",
+ "description": "Filter target files by the identifiers of the source file they were generated from.",
+ "style": "form",
+ "explode": false,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-target-files-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 target files on 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.",
+ "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": "ListTargetFiles"
+ },
+ "put": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Update Target Files",
+ "operationId": "UpdateTargetFiles",
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n* \"invalid\": invalid input for the value mentioned in the “name” field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - the authenticated user is not allowed to update the file.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the target file could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": a file with the same name already exists."
+ }
+ },
+ "description": "Updates multiple target files. If any of the files fails to be updated, an error will be returned for each file. ",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/target-files-update-request"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Get Target File Version",
+ "description": "Retrieves one version of a target file.",
+ "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/target-file-version"
+ }
+ }
+ },
+ "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 resource.",
+ "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, the target file or its version 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": "GetTargetFileVersion"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ },
+ {
+ "$ref": "#/components/parameters/fileVersionId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "List Target File Versions",
+ "description": "Retrieves the versions of a target file.",
+ "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/list-target-file-versions-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 retrieve versions on the target file.",
+ "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 or the target file 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": "ListTargetFileVersions"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/exports": {
+ "post": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Export Target File Version",
+ "description": "Generates an asynchronous export operation. Use the [Get Target File Version Export](#/operations/PollTargetFileVersionExport) endpoint to poll until the export is completed. Used only for [BCM](https://developers.rws.com/languagecloud-api-docs/articles/BCM.NET_client_API.html) file versions.\n\nThis operation triggers a conversion of the BCM target file version in a native or SDLXLIFF format, based on the value of the `format` query parameter used.\n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when uploading files.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/export-format"
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-version-export"
+ }
+ }
+ },
+ "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 export the target file version.",
+ "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, the target file or the version could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidType\": The type of the target file doesn't allow the export operation.\n* \"conflict\": A target file version export is already in progress.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "ExportTargetFileVersion"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ },
+ {
+ "$ref": "#/components/parameters/fileVersionId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/exports/{exportId}": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Poll Target File Version Export",
+ "description": "Polls a target file version via an export operation. The new version can be downloaded once the status is \"completed\".",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-version-export"
+ }
+ }
+ },
+ "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 retrieve the export.",
+ "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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "PollTargetFileVersionExport"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ },
+ {
+ "$ref": "#/components/parameters/fileVersionId"
+ },
+ {
+ "$ref": "#/components/parameters/exportId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/exports/{exportId}/download": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Download Exported Target File Version",
+ "description": "Downloads a completed target file version via an export operation.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "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\": not allowed to download the exported target file",
+ "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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": the export is not completed\n* \"conflict\": the export is not in a downloadable state due to another export, or the workflow has progressed since this export was requested",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "x-codegen-download": true,
+ "operationId": "DownloadExportedTargetFileVersion"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ },
+ {
+ "$ref": "#/components/parameters/fileVersionId"
+ },
+ {
+ "$ref": "#/components/parameters/exportId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/download": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Download Target File Version",
+ "description": "Downloads the file version (native or BCM). \n\nIf the `fileVersionId` path parameter represents a native file version, the native file will be downloaded. If the `fileVersionId` is an identifier of a version in [BCM format](https://developers.rws.com/languagecloud-api-docs/articles/BCM.NET_client_API.html), the BCM file will be downloaded.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "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\": not allowed to download the file version.",
+ "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 file version could not be found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "error codes:\n* \"invalidType\": the type of the file version cannot be downloaded.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "422": {
+ "description": "error codes:\n* \"maliciousContent\": the file contains malicious content. The infected file cannot be downloaded.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "x-codegen-download": true,
+ "operationId": "DownloadFileVersion"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ },
+ {
+ "$ref": "#/components/parameters/fileVersionId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/imports": {
+ "post": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Import Target File Version",
+ "description": "Generates an asynchronous import operation. Use [Poll Target File Version Import endpoint](#/operations/PollTargetFileVersionImport) to poll until the import is completed. Only `sdlxliff` files can be imported.\n\nImport should be used when a file is downloaded as an `sdlxliff`, processed and then, replaced. \nThe import operation triggers internally the update of the [BCM](https://developers.rws.com/languagecloud-api-docs/articles/BCM.NET_client_API.html) file associated with the imported file. It should mostly be used for offline work.\n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when uploading files.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The target file (binary string)."
+ }
+ }
+ }
+ }
+ },
+ "required": true,
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-version-import"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error code “invalid” in case of:\n * Empty or missing file in request\n * Not valid multipart request\n * File parameter contains other extension than the one expected by specification.",
+ "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 execute operation.",
+ "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 specified project or target file was not found.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "x-codegen-request-body-name": "body",
+ "operationId": "ImportTargetFileVersion"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ }
+ ]
+ },
+ "/projects/{projectId}/target-files/{targetFileId}/versions/imports/{importId}": {
+ "get": {
+ "tags": [
+ "Target File"
+ ],
+ "summary": "Poll Target File Version Import",
+ "description": "Polls a target file version via an import operation. The new version can be seen on the file versions once the status is \"completed\".",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/file-version-import"
+ }
+ }
+ },
+ "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 specified project or target file was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "PollTargetFileVersionImport"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/targetFileId"
+ },
+ {
+ "$ref": "#/components/parameters/importId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/target-files/{targetFileId}/versions": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "taskId",
+ "in": "path",
+ "required": true,
+ "description": "The task identifier."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "targetFileId",
+ "in": "path",
+ "required": true,
+ "description": "The target file identifier."
+ }
+ ],
+ "post": {
+ "summary": "Add Target File Version",
+ "tags": [
+ "Target File"
+ ],
+ "operationId": "AddTargetFileVersion",
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/target-file-version-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n\n* \"invalid\": invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"invalid\": the provided document is not a valid BCM file.\n* \"invalid\": invalid file format\n* \"multiPartOrder\": the multipart order in the body is not correct. The `properties` must be first and then, file.",
+ "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 add a version for the target file.",
+ "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\": \\\n \\- the specified task or the target file was not found.\\\n \\- the request is performed in a task that doesn't have the input file type as target file and is used a source file identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"noOwner\": the task has no owner.\n* \"differentOwner\": the authenticated user is not the owner of the task.\n* \"differentServiceUserOwner\": the authenticated service user is not the owner of the task.\n* \"taskCompleted\": adding target file version is not allowed when the task is completed.\n* \"duplicate\": a file with the same name already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "properties",
+ "file"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/components/schemas/target-file-version-properties-create-request",
+ "description": "Target file properties sent as a JSON inside a text part."
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The target file (binary string)."
+ }
+ }
+ }
+ }
+ },
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "description": "Adds a new version of the target file. Only the `native` and `bcm` file formats are accepted. For the `sdlxliff` files, you should use the [Import Target File endpoint](#/operations/ImportTargetFileVersion). More information about file formats can be found on the [File formats](../docs/File-formats.html) page. Additional details on BCM files can be found [here](https://developers.rws.com/languagecloud-api-docs/articles/BCM.NET_client_API.html).\n\nThe version is added on the task represented by `taskId`. To be able to execute the add operation the task should be assigned and accepted by user. If the task is automatic, it is possible to add a target file version only if the status is `inProgress`.\n\nThe added file versions need to respect the output file type declared by the task type of the enclosing task. On the [Rules for sequencing tasks correctly](https://docs.rws.com/791595/885137/trados-enterprise/rules-for-sequencing-tasks-correctly) page from the official RWS Documentation Center, you can find out what output file type is supported by each task.\n\nFor adding a target file version using an extension task, the configuration of the task type must declare the `scope`'s value as \"file\".\n\nThe multipart parameters in the body should respect and strictly follow the order specified in our documentation.\n\nConsider the [file and project size limit](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) when uploading files.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ }
+ },
+ "/projects/{projectId}/files/{fileId}/cancel": {
+ "put": {
+ "summary": "Cancel Project File",
+ "operationId": "CancelProjectFile",
+ "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 read resource",
+ "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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\r\n* \"alreadyCanceled\": the file was already cancelled.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Cancels a project file.",
+ "tags": [
+ "Project"
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "$ref": "#/components/parameters/fileId"
+ }
+ ]
+ },
+ "/projects/{projectId}/quote-report/export": {
+ "post": {
+ "summary": "Export Quote Report",
+ "operationId": "ExportQuoteReport",
+ "responses": {
+ "202": {
+ "description": "Accepted",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/export-quote-report-response",
+ "description": "Export quote report response.\n\nThe field is optional and will be returned only if a custom quote template is associated with the project.t.\n\nWe currently have this known issue: when the export is not using a Quote Template, the response for this call will be empty. It will be addressed in the future.e."
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"conflict\": the project is in a phase which doesn’t allow the quote to be exported.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Generates an asynchronous quote export operation for the project in either PDF or Excel format. Use the [polling endpoint](#/operations/PollQuoteReportExport) to check when the export is completed.
\nBuilt-in quotes are only available in the same languages as the user interface. See [this page](https://docs.rws.com/791595/1084405/trados-enterprise---accelerate/ui-languages) for more information. \nCustomers who use non-default quote templates are responsible for the implementation of a suitable localization approach.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/quote-report-format"
+ },
+ {
+ "$ref": "#/components/parameters/language-id"
+ }
+ ],
+ "tags": [
+ "Quote"
+ ]
+ },
+ "get": {
+ "summary": "Poll Quote Report Export",
+ "operationId": "PollQuoteReportExport",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "inProgress",
+ "completed"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Polls a quote report via an export operation. The quote report can be [downloaded](#/operations/DownloadQuoteReport) once the status is \"completed\". The recommended polling interval is 20 seconds. If polling does not return a success status in 20 minutes, it should be abandoned and a new export should be retried.\n\nIf the `exportId` query parameter is not provided, the polling action will return the status for the last generated export.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/quote-report-format"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "exportId",
+ "description": "The export identifier."
+ }
+ ],
+ "tags": [
+ "Quote"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/quote-report/download": {
+ "get": {
+ "summary": "Download Exported Quote Report",
+ "operationId": "DownloadQuoteReport",
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "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 resource.",
+ "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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Downloads a quote report generated by the [asynchronous export operation](#/operations/ExportQuoteReport). \n\nIf the `exportId` query parameter is not provided, the last generated export quote will be downloaded.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/quote-report-format"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "exportId",
+ "description": "The export identifier."
+ }
+ ],
+ "tags": [
+ "Quote"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/projects/{projectId}/tasks": {
+ "get": {
+ "tags": [
+ "Project"
+ ],
+ "summary": "List Project's Tasks",
+ "description": "Lists the tasks of a specific project.",
+ "parameters": [
+ {
+ "$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"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-tasks-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": "ListProjectTasks"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ }
+ ]
+ },
+ "/project-groups": {
+ "get": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "List Project Groups",
+ "description": "Retrieves a list of all the project groups 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/fields"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-project-groups-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": "ListProjectGroups"
+ },
+ "post": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "Create Project Group",
+ "description": "Creates a new project group.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-group-create-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-group-create-response"
+ },
+ "examples": {}
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"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.",
+ "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 the project group in the specified location.\n* \"benefitNotAvailable\": Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": Project group with the same name already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "CreateProjectGroup"
+ },
+ "parameters": []
+ },
+ "/project-groups/{projectGroupId}": {
+ "get": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "Get Project Group",
+ "description": "Retrieves a project group 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-group"
+ }
+ }
+ },
+ "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 project group.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": The project group could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetProjectGroup"
+ },
+ "put": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "Update Project Group",
+ "description": "Updates the project group.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-group-update-request"
+ }
+ }
+ },
+ "required": true,
+ "description": ""
+ },
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n\n* “invalid”: Invalid input on update project group model.\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.",
+ "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 project group.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the project group could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": Project group with the same name already exists.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "UpdateProjectGroup"
+ },
+ "delete": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "Delete Project Group",
+ "description": "Deletes a project group.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "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 project group.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the project group could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"conflict\": there might be projects that are still `attaching`.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "DeleteProjectGroup"
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "projectGroupId",
+ "in": "path",
+ "required": true,
+ "description": "The project group identifier."
+ }
+ ]
+ },
+ "/project-groups/{projectGroupId}/projects": {
+ "post": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "Add Projects To Group",
+ "description": "Adds projects to the project group.\n\nThe projects are not added instantly. To check the status use the [Get Project Group](#/operations/GetProjectGroup) endpoint.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/add-projects-to-group-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "202": {
+ "description": "Accepted",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/add-projects-to-group-response"
+ }
+ }
+ }
+ },
+ "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 add the projects to group.\n* \"forbidden\": The projects are not found or the authenticated user does not have acces to them.\n* \"benefitNotAvailable\": Your subscription does not include access to the requested type of benefit.\n* \"quotaReached\": The maximum number of projects allowed for your project group has already been reached.",
+ "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 group could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* “conflict”: A project with status \"detaching\" cannot be added.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "AddProjectsToGroup"
+ },
+ "delete": {
+ "tags": [
+ "Project Group"
+ ],
+ "summary": "Remove Projects From Group",
+ "description": "Removes projects from the project group.\n\nThe projects are not removed instantly. To check the status use the [Get Project Group](#/operations/GetProjectGroup) endpoint.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "202": {
+ "description": "Accepted",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n\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 remove the projects from the project group.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": The project group could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* “conflict”: A project with status \"attaching\" cannot be removed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "RemoveProjectsFromGroup",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/remove-projects-from-group-request"
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "projectGroupId",
+ "in": "path",
+ "required": true,
+ "description": "The Project Group identifier."
+ }
+ ]
+ },
+ "/project-templates/{projectTemplateId}": {
+ "get": {
+ "tags": [
+ "Project Template"
+ ],
+ "summary": "Get Project Template",
+ "description": "Retrieves a project 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-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 project 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 project 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"
+ }
+ }
+ }
+ },
+ "operationId": "GetProjectTemplate"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectTemplateId"
+ }
+ ],
+ "put": {
+ "summary": "Update Project Template",
+ "operationId": "UpdateProjectTemplate",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-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 mentioned in the “name” field on the error response. \n* \"deleted\": Some of the selected values were deleted and cannot be selected for some values of the \"customFields\" field.\n",
+ "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 project template.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the project template could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Updates a project template by id.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Project Template"
+ ]
+ },
+ "delete": {
+ "summary": "Delete Project Template",
+ "operationId": "DeleteProjectTemplate",
+ "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 read the project 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 project template could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Deletes a project template by id.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Project Template"
+ ]
+ }
+ },
+ "/project-templates": {
+ "get": {
+ "tags": [
+ "Project Template"
+ ],
+ "summary": "List Project Templates",
+ "description": "Retrieves a list of all the project templates in an account.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/name"
+ },
+ {
+ "$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-project-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": "ListProjectTemplates"
+ },
+ "post": {
+ "tags": [
+ "Project Template"
+ ],
+ "summary": "Create Project Template",
+ "description": "Creates a new project template.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-template-create-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/project-template-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “invalid”: Invalid input mentioned in the “name” field on the error response. \n* \"deleted\": Some of the selected values were deleted and cannot be selected for some values of the \"customFields\" field.\n",
+ "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 a project template.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": A project template with the same name already exists in the same location.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "CreateProjectTemplate"
+ }
+ },
+ "/rate-limits": {
+ "get": {
+ "tags": [
+ "Rate Limits"
+ ],
+ "summary": "List Rate Limits",
+ "description": "Retrieves a list of all rate limits applicable for an account.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-rate-limits-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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "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": "ListRateLimits"
+ }
+ },
+ "/schedule-templates": {
+ "get": {
+ "summary": "List Schedule Templates",
+ "description": "Retrieves a list of all the schedule 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/fields"
+ },
+ {
+ "$ref": "#/components/parameters/name"
+ },
+ {
+ "$ref": "#/components/parameters/location"
+ },
+ {
+ "$ref": "#/components/parameters/location-strategy"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-schedule-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": "ListScheduleTemplates",
+ "tags": [
+ "Schedule Template"
+ ]
+ },
+ "parameters": [],
+ "post": {
+ "summary": "Create Schedule Template",
+ "operationId": "CreateScheduleTemplate",
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/schedule-template"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n\n* “invalid”: invalid input on update schedule template model.\n* \"invalidLanguage\": The language used in configurations is invalid. Check the error message for more details.\n* \"maxSize\": The maximum size was exceeded for the value mentioned in the \"name\" or in the \"description\" fields.\n* \"invalidType\": The value provided for the \"taskTypeId\" field is invalid.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to create a schedule template.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": A schedule template with the same name already exists in the same location.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Creates a new schedule template.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/schedule-template-create-request"
+ }
+ }
+ }
+ },
+ "tags": [
+ "Schedule Template"
+ ]
+ }
+ },
+ "/schedule-templates/{scheduleTemplateId}": {
+ "get": {
+ "summary": "Get Schedule Template",
+ "description": "Retrieves a schedule 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/schedule-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.\n* “empty”: Empty input for the “scheduleTemplateId” path parameter variable.",
+ "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 schedule 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 schedule 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"
+ }
+ }
+ }
+ },
+ "operationId": "GetScheduleTemplate",
+ "tags": [
+ "Schedule Template"
+ ]
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "scheduleTemplateId",
+ "in": "path",
+ "required": true,
+ "description": "The id of the schedule template."
+ }
+ ],
+ "delete": {
+ "summary": "Delete Schedule Template",
+ "operationId": "DeleteScheduleTemplate",
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "401": {
+ "description": "The user could not be identified.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to delete the schedule template.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the schedule template could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Deletes a schedule template.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Schedule Template"
+ ]
+ },
+ "put": {
+ "summary": "Update Schedule Template",
+ "operationId": "UpdateScheduleTemplate",
+ "responses": {
+ "204": {
+ "description": "No content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error responses:\n\n* “invalid”: invalid input on update schedule template model.\n* \"empty\": Empty mandatory value mentioned in the \"name\" field on the error response or in “scheduleTemplateId” path variable.\n* \"maxSize\": Maximum size exceeded for the value mentioned in the \"name\" or in the \"description\" fields. \n* \"invalidType\": The value provided for the \"taskTypeId\" field is invalid.",
+ "headers": {
+ "X-LC-TraceId": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": the authenticated user is not allowed to update the schedule template.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the schedule template could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": A schedule template with the same name already exists in the same location.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Updates the schedule template identified by `scheduleTemplateId`.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/schedule-template-update-request"
+ }
+ }
+ }
+ },
+ "tags": [
+ "Schedule Template"
+ ]
+ }
+ },
+ "/tasks/{taskId}": {
+ "get": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Get Task",
+ "description": "Retrieves a task.",
+ "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/task"
+ },
+ "examples": {
+ "simple": {
+ "value": {
+ "id": "df680285-adcd-4bda-8f79-0bba4a857287",
+ "status": "created"
+ }
+ },
+ "unexpected-enum": {
+ "value": {
+ "id": "df680285-adcd-4bda-8f79-0bba4a857287",
+ "status": "unexpectedEnumValue"
+ }
+ }
+ }
+ }
+ },
+ "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 task.",
+ "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 task 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": "GetTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/tasks/assigned": {
+ "get": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "List Tasks assigned to me",
+ "description": "Retrieves the tasks assigned to the authenticated user.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "description": "If specified, this filters tasks by status.",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "$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-tasks-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": "ListTasksAssignedToMe"
+ }
+ },
+ "/tasks/{taskId}/accept": {
+ "put": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Accept Task",
+ "description": "Accepts a task. The authenticated user becomes the owner of the accepted task and can start work on it.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"alreadyOwned\": the task is already owned\n* \"invalidStatus\": the task status doesn't permit the accept operation",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "AcceptTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/reject": {
+ "put": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Reject Task",
+ "description": "Rejects a task. The authenticated user will be removed from the task's list of available assignee users.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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 task could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"alreadyOwned\": The task is already owned. It can't be rejected.\n* \"invalidStatus\": The task status doesn't permit the reject operation.\n* \"singleAssignee\": The authenticated user is the single assignee of the task, therefore the task can't be rejected.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "RejectTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/complete": {
+ "put": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Complete Task",
+ "description": "Completes a task. The task is required to be in \"inProgress\" state and will be marked as \"completed\".",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/task-complete-request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “maxSize“: Maximum size exceeded for the value 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 complete the task.",
+ "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 task could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": The current task status doesn't permit this operation.\n* \"noOwner\": The current task was not accepted in advance.\n* \"differentOwner\": The current task is accepted by another user.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "CompleteTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/release": {
+ "put": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Release Task",
+ "description": "Releases the task from its owner so that other task assignees will be able to accept it.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "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 release the resource.",
+ "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 task could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"noOwner\": the task currently has no owner.\n* \"differentOwner\": the authenticated user is not the owner of the task.\n* \"invalidStatus\": the task's status does not permit this operation.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "ReleaseTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/reclaim": {
+ "put": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Reclaim Task",
+ "description": "The current owner of task is removed so that other assignees can accept it. \nThe task is not reassigned automatically.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "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 query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty value for variable 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 reclaim the task.",
+ "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 task could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": the current task's status doesn't permit this operation.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "ReclaimTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/tasks/{taskId}/assign": {
+ "put": {
+ "tags": [
+ "Task"
+ ],
+ "summary": "Assign Task",
+ "description": "Assigns a task. The task assignees will be updated.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/task-assign-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 mentioned in the “name” field on the error response.\n* \"limit.exceeded\": a maximum number of users per task was assigned\n",
+ "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 assign the task.",
+ "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 task could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": the current task's status doesn't permit the operation.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "AssignTask"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskId"
+ }
+ ]
+ },
+ "/task-types/{taskTypeId}": {
+ "get": {
+ "tags": [
+ "Task Type"
+ ],
+ "summary": "Get Task Type",
+ "description": "Retrieves a task type 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/task-type"
+ }
+ }
+ },
+ "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 task type.",
+ "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": "GetTaskType"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/taskTypeId"
+ }
+ ]
+ },
+ "/task-types": {
+ "get": {
+ "tags": [
+ "Task Type"
+ ],
+ "summary": "List Task Types",
+ "description": "Retrieves all the task types in an account.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "name": "key",
+ "in": "query",
+ "description": "Filter by keys.",
+ "style": "form",
+ "explode": false,
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ {
+ "name": "automatic",
+ "in": "query",
+ "description": "Filter by automatic or human tasks.",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "$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-task-types-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": "ListTaskTypes"
+ }
+ },
+ "/translation-engines/{translationEngineId}": {
+ "get": {
+ "tags": [
+ "Translation Engine"
+ ],
+ "summary": "Get Translation Engine",
+ "description": "Retrieves a translation engine.",
+ "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/translation-engine"
+ }
+ }
+ },
+ "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\n* \"forbidden\": - The authenticated user is not allowed to read resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": The translation engine could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "GetTranslationEngine"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/translationEngineId"
+ }
+ ],
+ "put": {
+ "summary": "Update Translation Engine",
+ "operationId": "UpdateTranslationEngine",
+ "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 query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty input in the update translation engine model. Check error details.\n* \"invalidLanguage\": Invalid language code used in language-pair\n* \"duplicate\": Duplicate resources found for the language pair specified in the error details.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$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": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": The authenticated user is not allowed to update the resource.",
+ "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 translation memory could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n\n * \"updateNotAllowed\": Property specified in error response can not be updated because the translation engine provided is a copy assigned to a project.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Updates a translation engine. \n\nIt can be used to update a stand-alone translation engine or a project's translation engine. \nThe identifier of a project's translation engine can be retrieved only by calling [Get Project](https://sdl-language-tech.stoplight.io/docs/lcpublicapi/fd9ee0beb37ca-get-project) endpoint.\n\nPay special attention that some properties can not be changed for a project's translation engine. These include: name, description, definition.languageProcessingId, and language pairs can not be added/removed from definition.languagePairDefinitions. \n\nPay special attention to how [updating](https://languagecloud.sdl.com/lc/api-docs/updating-data-with-put) works.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-engine-update-request"
+ }
+ }
+ },
+ "description": ""
+ },
+ "tags": [
+ "Translation Engine"
+ ]
+ }
+ },
+ "/translation-engines": {
+ "get": {
+ "tags": [
+ "Translation Engine"
+ ],
+ "summary": "List Translation Engines",
+ "description": "Retrieves all the translation engines 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-translation-engines-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": "ListTranslationEngines"
+ }
+ },
+ "/termbase-templates": {
+ "get": {
+ "summary": "List Termbase Templates",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-termbase-templates-response"
+ },
+ "examples": {
+ "termbase-templates-list": {
+ "value": {
+ "items": [
+ {
+ "id": "test-id-1",
+ "name": "test-name-1",
+ "location": {
+ "id": "test-location-id-1",
+ "name": "test-location-name-1"
+ },
+ "type": "system",
+ "languages": [
+ {
+ "languageCode": "test-language-code-1"
+ }
+ ],
+ "fields": [
+ {
+ "id": "test-field-id-1",
+ "name": "test-field-name-1",
+ "type": "system",
+ "level": "entry",
+ "dataType": "text"
+ }
+ ]
+ },
+ {
+ "id": "test-id-2",
+ "name": "test-name-2",
+ "location": {
+ "id": "test-location-id-2",
+ "name": "test-location-name-2"
+ },
+ "type": "userDefined",
+ "languages": [
+ {
+ "languageCode": "test-language-code-2"
+ }
+ ],
+ "fields": [
+ {
+ "id": "test-field-id-2",
+ "name": "test-field-name-2",
+ "type": "userDefined",
+ "level": "language",
+ "dataType": "boolean"
+ }
+ ]
+ }
+ ],
+ "itemCount": 2
+ }
+ }
+ }
+ }
+ },
+ "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 resources.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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 it's 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": "ListTermbaseTemplates",
+ "description": "List termbase templates.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "in": "query",
+ "name": "location",
+ "description": "The identifiers of the resource folders. ",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "system",
+ "userDefined"
+ ]
+ },
+ "in": "query",
+ "name": "type",
+ "description": "The type of the termbase template to retrieve. If not specified, both types will be returned"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ }
+ ],
+ "tags": [
+ "Termbase Template"
+ ]
+ },
+ "parameters": [],
+ "post": {
+ "summary": "Create Termbase Template",
+ "operationId": "CreateTermbaseTemplate",
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-template"
+ },
+ "examples": {
+ "Example 1": {
+ "value": {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "copyright": "string",
+ "location": {
+ "id": "string",
+ "name": "string",
+ "hasParent": true,
+ "path": [
+ {
+ "id": "string",
+ "name": "string",
+ "location": "string",
+ "hasParent": true
+ }
+ ]
+ },
+ "createdAt": "2022-01-12T12:00:00.000Z",
+ "lastModifiedAt": "2022-01-12T12:00:00.000Z",
+ "type": "system",
+ "languages": [
+ {
+ "languageCode": "string",
+ "englishName": "string",
+ "direction": "string",
+ "parentLanguageCode": "string",
+ "defaultSpecificLanguageCode": "string",
+ "isNeutral": true
+ }
+ ],
+ "fields": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "type": "system",
+ "level": "entry",
+ "dataType": "text",
+ "pickListValues": [
+ "string"
+ ],
+ "allowCustomValues": true,
+ "allowMultiple": true,
+ "isMandatory": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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* \"duplicate\": The field name must be unique within the list.",
+ "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 a termbase template in the specified location.\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.",
+ "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 specified location was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": There is already a termbase template with the same name.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Creates a new termbase template.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-template-create-request"
+ }
+ }
+ }
+ },
+ "tags": [
+ "Termbase Template"
+ ]
+ }
+ },
+ "/termbase-templates/{termbaseTemplateId}": {
+ "get": {
+ "summary": "Get Termbase Template",
+ "tags": [
+ "Termbase Template"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-template"
+ }
+ }
+ },
+ "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\n* \"forbidden\": - The authenticated user is not allowed to read resource\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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 termbase 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"
+ }
+ }
+ }
+ },
+ "operationId": "GetTermbaseTemplate",
+ "description": "Get a termbase template by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "delete": {
+ "summary": "Delete Termbase Template",
+ "operationId": "DeleteTermbaseTemplate",
+ "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 termbase template\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.",
+ "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 termbase 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"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"conflict\": cannot delete system termbase templates",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Deletes a termbase template by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase Template"
+ ]
+ },
+ "put": {
+ "summary": "Update Termbase Template",
+ "operationId": "UpdateTermbaseTemplate",
+ "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 query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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* \"duplicate\": The field name must be unique within the list.",
+ "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 termbase template.\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": There is already a termbase template with the same name.\n* \"conflict\": cannot update system termbase template",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-template-update-request"
+ }
+ }
+ }
+ },
+ "description": "Updates the termbase template.",
+ "tags": [
+ "Termbase Template"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseTemplateId"
+ }
+ ]
+ },
+ "/termbase-templates/convert-xdt": {
+ "post": {
+ "summary": "Convert XDT to Termbase Structure",
+ "operationId": "ConvertTermbaseTemplate",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-structure"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error code “invalid” in case of:\r\n * Empty or missing file in request\r\n * Not valid multipart request\r\n * File parameter contains other extension than the one expected by specification.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Converts a termbase definition (XDT file) to a termbase structure that will be returned in the response. \nThe structure will not be stored in the Trados Cloud Platform.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The .xdt file (binary string) used for conversion."
+ }
+ }
+ }
+ }
+ },
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "tags": [
+ "Termbase Template"
+ ]
+ },
+ "parameters": []
+ },
+ "/termbases": {
+ "get": {
+ "summary": "List Termbases",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-termbases-response"
+ },
+ "examples": {
+ "termbases-list": {
+ "value": {
+ "items": [
+ {
+ "id": "test-id-1",
+ "name": "test-name-1",
+ "location": {
+ "id": "test-location-id-1",
+ "name": "test-location-name-1"
+ },
+ "termbaseStructure": {
+ "languages": [
+ {
+ "languageCode": "test-language-code-1"
+ }
+ ],
+ "fields": [
+ {
+ "id": "test-field-id-1",
+ "name": "test-field-name-1",
+ "type": "system",
+ "level": "entry",
+ "dataType": "text"
+ }
+ ]
+ },
+ "numberOfEntries": 1,
+ "status": "ready"
+ },
+ {
+ "id": "test-id-2",
+ "name": "test-name-2",
+ "location": {
+ "id": "test-location-id-2",
+ "name": "test-location-name-2"
+ },
+ "termbaseStructure": {
+ "languages": [
+ {
+ "languageCode": "test-language-code-2"
+ }
+ ],
+ "fields": [
+ {
+ "id": "test-field-id-2",
+ "name": "test-field-name-2",
+ "type": "userDefined",
+ "level": "language",
+ "dataType": "boolean"
+ }
+ ]
+ },
+ "numberOfEntries": 2,
+ "status": "ready"
+ }
+ ],
+ "itemCount": 2
+ }
+ }
+ }
+ }
+ },
+ "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* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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 it's 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": "ListTermbase",
+ "description": "List termbases.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/location"
+ },
+ {
+ "$ref": "#/components/parameters/location-strategy"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ }
+ ],
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "post": {
+ "summary": "Create Termbase",
+ "operationId": "CreateTermbase",
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase"
+ },
+ "examples": {
+ "Example 1": {
+ "value": {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "copyright": "string",
+ "location": {
+ "id": "string",
+ "name": "string",
+ "hasParent": true,
+ "path": [
+ {
+ "id": "string",
+ "name": "string",
+ "location": "string",
+ "hasParent": true
+ }
+ ]
+ },
+ "termbaseStructure": {
+ "languages": [
+ {
+ "languageCode": "string",
+ "englishName": "string",
+ "direction": "string",
+ "parentLanguageCode": "string",
+ "defaultSpecificLanguageCode": "string",
+ "isNeutral": true
+ }
+ ],
+ "fields": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "type": "system",
+ "level": "entry",
+ "dataType": "text",
+ "pickListValues": [
+ "string"
+ ],
+ "allowCustomValues": true,
+ "allowMultiple": true,
+ "isMandatory": true
+ }
+ ]
+ },
+ "numberOfEntries": 0,
+ "status": "ready",
+ "createdAt": "2022-01-12T12:00:00.000Z",
+ "lastModifiedAt": "2022-01-12T12:00:00.000Z"
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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.",
+ "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 a termbase.\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.\n* \"quotaReached\": - You have reached the maximum allowable number of termbases for your account.",
+ "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 specified location was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": There is already a termbase with the same name.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Creates a new termbase.\nThe termbase can be created with a termbase template by providing the templateId or by providing a custom termbaseStructure. \nIf only a `termbaseTemplateId` was provided, the termbase will be created using data from the template. \nIf only a `termbaseStructure` was provided, the termbase will be created using data from the structure. \nIf both, `termbaseTemplateId` and `termbaseStructure` are added in the request, the `termbaseStructure` takes precedence.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-create-request"
+ }
+ }
+ },
+ "description": ""
+ },
+ "tags": [
+ "Termbase"
+ ]
+ }
+ },
+ "/termbases/{termbaseId}": {
+ "get": {
+ "summary": "Get Termbase",
+ "tags": [
+ "Termbase"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase"
+ }
+ }
+ },
+ "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 resource.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetTermbase",
+ "description": "Retrieves a termbase by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "delete": {
+ "summary": "Delete Termbase",
+ "operationId": "DeleteTermbase",
+ "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 termbase\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.",
+ "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 termbase could not be found by identifier.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": The termbase cannot be deleted as is currently being processed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Deletes a termbase by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "put": {
+ "summary": "Update Termbase",
+ "operationId": "UpdateTermbase",
+ "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 query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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* \"duplicate\": The field name must be unique within the list.",
+ "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 termbase.\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.",
+ "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 specified termbase identifier was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"duplicate\": There is already a termbase with the same name.\n* \"invalidStatus\": The termbase cannot be updated as is currently being processed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-update-request"
+ }
+ }
+ }
+ },
+ "description": "Updates the termbase.\nThe termbase can be updated with a termbase template by providing the termbaseTemplateId or by providing a custom termbaseStructure. \n\nIf only a `termbaseTemplateId ` was provided, the termbase will be updated using data from the template. \nIf only a `termbaseStructure` was provided, the termbase will be updated using data from the structure. \nIf both, `termbaseTemplateId` and `termbaseStructure` are added in the request, the `termbaseStructure` takes precedence.",
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ }
+ ]
+ },
+ "/termbases/{termbaseId}/entries": {
+ "post": {
+ "summary": "Create Termbase Entry",
+ "operationId": "CreateTermbaseEntry",
+ "responses": {
+ "201": {
+ "description": "Created",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-entry"
+ },
+ "examples": {
+ "termbase-entry-create": {
+ "value": {
+ "id": "string",
+ "humanReadableId": "string",
+ "languages": [
+ {
+ "id": "string",
+ "language": {
+ "languageCode": "string",
+ "englishName": "string",
+ "direction": "string",
+ "parentLanguageCode": "string",
+ "defaultSpecificLanguageCode": "string",
+ "isNeutral": true
+ },
+ "terms": [
+ {
+ "id": "string",
+ "text": "string",
+ "termbaseFieldValues": [
+ {
+ "id": "string",
+ "name": "string",
+ "termbaseFieldId": "string",
+ "value": "string",
+ "fieldValueLinks": [
+ {
+ "type": "term",
+ "value": "string"
+ }
+ ],
+ "createdAt": "2019-08-24T14:15:22.000Z",
+ "createdBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ },
+ "lastModifiedAt": "2019-08-24T14:15:22.000Z",
+ "lastModifiedBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "createdAt": "2019-08-24T14:15:22.000Z",
+ "createdBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ },
+ "lastModifiedAt": "2019-08-24T14:15:22.000Z",
+ "lastModifiedBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "termbaseFieldValues": [
+ {
+ "id": "string",
+ "name": "string",
+ "termbaseFieldId": "string",
+ "value": "string",
+ "fieldValueLinks": [
+ {
+ "type": "term",
+ "value": "string"
+ }
+ ],
+ "createdAt": "2019-08-24T14:15:22.000Z",
+ "createdBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ },
+ "lastModifiedAt": "2019-08-24T14:15:22.000Z",
+ "lastModifiedBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "createdAt": "2019-08-24T14:15:22.000Z",
+ "createdBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ },
+ "lastModifiedAt": "2019-08-24T14:15:22.000Z",
+ "lastModifedBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "termbaseFieldValues": [
+ {
+ "id": "string",
+ "name": "string",
+ "termbaseFieldId": "string",
+ "value": "string",
+ "fieldValueLinks": [
+ {
+ "type": "term",
+ "value": "string"
+ }
+ ],
+ "createdAt": "2019-08-24T14:15:22.000Z",
+ "createdBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ },
+ "lastModifiedAt": "2019-08-24T14:15:22.000Z",
+ "lastModifiedBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "createdAt": "2019-08-24T14:15:22.000Z",
+ "createdBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ },
+ "lastModifiedAt": "2019-08-24T14:15:22.000Z",
+ "lastModifiedBy": {
+ "id": "string",
+ "email": "string",
+ "firstName": "string",
+ "lastName": "string",
+ "anonymized": true,
+ "anonymizedUserName": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "location": {
+ "id": "string",
+ "name": "string"
+ },
+ "users": [
+ {
+ "id": "string"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"invalidLevel\" : The termbaseFieldId is invalid for the current termbaseField type\n* \"empty\": Empty mandatory 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.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "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 an entry.\n* \"benefitNotAvailable\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": The termbase cannot be updated as is currently being processed.\n* \"duplicate\" : An entry with the same value already exists.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Creates a new termbase entry. For more information about how to use `fieldValueLinks` see [`Create termbase entry`](../docs/termbase/Termbase-entries.html#creating-a-termbase-entry).",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-entry-create-request"
+ }
+ }
+ }
+ },
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "get": {
+ "summary": "List Termbase Entries",
+ "operationId": "ListTermbaseEntries",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-termbase-entries-response"
+ },
+ "examples": {
+ "termbase-entries-list": {
+ "value": {
+ "items": [
+ {
+ "id": "test-id-1",
+ "humanReadableId": "test-humanReadableId-1",
+ "languages": [
+ {
+ "id": "test-languages-id-1",
+ "language": {
+ "languageCode": "test-language-code-1"
+ },
+ "terms": [
+ {
+ "id": "test-terms-id-1",
+ "text": "test-terms-test-1"
+ }
+ ]
+ }
+ ],
+ "termbaseFieldValues": [
+ {
+ "id": "test-termbaseFieldValues-id-1",
+ "name": "test-termbaseFieldValues-name-1",
+ "termbaseFieldId": "test-termbaseFieldValues-termbaseFieldId-1",
+ "value": "test-termbaseFieldValues-value-1",
+ "fieldValueLinks": [
+ {
+ "type": "term",
+ "value": "test-value-1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "test-id-2",
+ "humanReadableId": "test-humanReadableId-2",
+ "languages": [
+ {
+ "id": "test-languages-id-2",
+ "language": {
+ "languageCode": "test-language-code-2"
+ },
+ "terms": [
+ {
+ "id": "test-terms-id-2",
+ "text": "test-terms-test-2"
+ }
+ ]
+ }
+ ],
+ "termbaseFieldValues": [
+ {
+ "id": "test-termbaseFieldValues-id-2",
+ "name": "test-termbaseFieldValues-name-2",
+ "termbaseFieldId": "test-termbaseFieldValues-termbaseFieldId-2",
+ "value": "test-termbaseFieldValues-value-2",
+ "fieldValueLinks": [
+ {
+ "type": "term",
+ "value": "test-value-2"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "itemCount": 2
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"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.",
+ "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 entries.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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 it's 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"
+ }
+ }
+ }
+ },
+ "description": "Retrieves a list of all the entries in a termbase.",
+ "tags": [
+ "Termbase"
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/humanReadableIds"
+ }
+ ]
+ },
+ "delete": {
+ "summary": "Delete Termbase Entries",
+ "operationId": "DeleteTermbaseEntries",
+ "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 an entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Deletes all the entries in the termbase.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ }
+ ]
+ },
+ "/termbases/{termbaseId}/entries/{entryId}": {
+ "get": {
+ "summary": "Get Termbase Entry",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-entry"
+ }
+ }
+ },
+ "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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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 entry 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": "GetTermbaseEntry",
+ "description": "Retrieves a termbase entry by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "put": {
+ "summary": "Update Termbase Entry",
+ "operationId": "UpdateTermbaseEntry",
+ "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 query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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.",
+ "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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": The termbase cannot be updated as is currently being processed.\n* \"duplicate\" : An entry with the same value already exists.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Updates a termbase entry by identifier.\nThe request body will overwrite the existing data.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase"
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-entry-update-request"
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "summary": "Delete Termbase Entry",
+ "operationId": "DeleteTermbaseEntry",
+ "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 termbase entries.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Deletes a termbase entry.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ },
+ {
+ "$ref": "#/components/parameters/entryId"
+ }
+ ]
+ },
+ "/termbases/{termbaseId}/exports": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ }
+ ],
+ "post": {
+ "summary": "Export Termbase",
+ "operationId": "ExportTermbase",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-export-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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": - The specified termbase was not found.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "format": {
+ "type": "string",
+ "enum": [
+ "xml",
+ "tbx"
+ ],
+ "default": "tbx",
+ "description": "The file format used to export the termbase."
+ },
+ "properties": {
+ "$ref": "#/components/schemas/termbase-export-properties-request"
+ }
+ }
+ }
+ }
+ }
+ },
+ "description": "Generates an asynchronous export operation. \nUse the [Poll Export Termbase](#/operations/PollExportTermbase) endpoint to poll until the export status is `done`.",
+ "tags": [
+ "Termbase Export"
+ ]
+ }
+ },
+ "/termbases/{termbaseId}/exports/{exportId}": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ },
+ {
+ "$ref": "#/components/parameters/exportId"
+ }
+ ],
+ "get": {
+ "summary": "Poll Termbase Export",
+ "operationId": "PollExportTermbase",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-export-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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": - The specified export was not found."
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "description": "Polls a termbase via an export operation. The exported termbase can be downloaded once the status is `done`.",
+ "tags": [
+ "Termbase Export"
+ ]
+ }
+ },
+ "/termbases/{termbaseId}/exports/{exportId}/download": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ },
+ {
+ "$ref": "#/components/parameters/exportId"
+ }
+ ],
+ "get": {
+ "summary": "Download Exported Termbase",
+ "operationId": "DownloadExportedTermbase",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": - The specified termbase or export was not found.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "description": "Downloads the exported termbase when the poll operation status is `done`.",
+ "tags": [
+ "Termbase Export"
+ ]
+ }
+ },
+ "/termbases/{termbaseId}/export-template": {
+ "parameters": [
+ {
+ "name": "termbaseId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The termbase identifier."
+ }
+ ],
+ "get": {
+ "summary": "Export Termbase Template",
+ "tags": [
+ "Termbase Export"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "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 entry.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "DownloadTermbaseDefinition",
+ "description": "Downloads the termbase definition.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ]
+ }
+ },
+ "/termbases/{termbaseId}/terms/{sourceLanguageCode}": {
+ "get": {
+ "summary": "List Termbase Terms",
+ "operationId": "ListTermbaseTerms",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-termbase-terms-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.\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.",
+ "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 entries.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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 it's 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"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "in": "query",
+ "name": "search",
+ "description": "The text to search for."
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "normal",
+ "linguistic",
+ "fuzzy"
+ ],
+ "default": "normal"
+ },
+ "in": "query",
+ "name": "searchType",
+ "description": "The type of the search performed."
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "in": "query",
+ "name": "targetLanguageCode",
+ "description": "The target language code used to list the terms."
+ }
+ ],
+ "description": "Retrieves a list of all the terms of the termbase.\nSearch types:\n- normal: Use normal search to look for terms that match the text exactly as entered.\n- linguistic: Use linguistic search to look for terms that are similar to the search term. Linguistic search is based on stemming and other language-dependent aspects.\n- fuzzy: Use fuzzy search to look for terms that are similar to the search term. Fuzzy search is more fault-tolerant than linguistic search.",
+ "tags": [
+ "Termbase"
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ },
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "sourceLanguageCode",
+ "in": "path",
+ "required": true,
+ "description": "The source language code used to list the terms."
+ }
+ ]
+ },
+ "/termbases/{termbaseId}/imports": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ }
+ ],
+ "get": {
+ "summary": "Get Termbase Import History",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-termbase-import-history"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"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.",
+ "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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": - The authenticated user is not allowed to read entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "GetImportHistory",
+ "description": "Gets the import history for a termbase.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ }
+ ],
+ "tags": [
+ "Termbase Import"
+ ]
+ },
+ "post": {
+ "summary": "Import Termbase",
+ "operationId": "ImportTermbase",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-import-response"
+ },
+ "examples": {
+ "import-termbase-ok": {
+ "value": {
+ "id": "test-import-id",
+ "status": "queued"
+ }
+ }
+ }
+ }
+ },
+ "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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "409": {
+ "description": "Error codes:\n* \"invalidStatus\": Cannot import as the termbase is currently being processed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "schema": {
+ "type": "boolean",
+ "default": true
+ },
+ "in": "query",
+ "name": "strictImport",
+ "description": "Specifies if the entries are only imported into the exact language that matches your imported file. `true` - The import will only occur if the language in your import file matches exactly with a language in your termbase. `false` - The import will occur even there are non-matching languages, by trying to match them to a relevant main language or language variant, if available."
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "ignore",
+ "merge",
+ "overwrite"
+ ],
+ "default": "overwrite"
+ },
+ "in": "query",
+ "name": "duplicateEntriesStrategy",
+ "description": "The strategy for duplicate entries. Determines how the duplicate entries will be handled. `ignore` - The content of the current entry with the same identifier will be kept, and the new entry will be ignored `merge` - The content of the current entry with the same identifier will be merged with the imported entry. If the identifier is not provided the content will be merged by text. `overwrite` - The content of the current entry with the same identifier will be replaced by the imported entry."
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "file"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/components/schemas/termbase-import-request"
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The file (binary string) to import into the termbase. \nAccepted file types: .xml, .tbx\n "
+ }
+ }
+ },
+ "examples": {}
+ }
+ },
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "description": "Generates an asynchronous import operation. \nUse the Poll Import Termbase endpoint to poll until the import status is `done`. ",
+ "tags": [
+ "Termbase Import"
+ ]
+ }
+ },
+ "/termbases/{termbaseId}/imports/{importId}": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ },
+ {
+ "$ref": "#/components/parameters/importId"
+ }
+ ],
+ "get": {
+ "summary": "Poll Termbase Import",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/termbase-poll-import-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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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": "PollTermbaseImport",
+ "description": "Polls a termbase import operation.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase Import"
+ ]
+ }
+ },
+ "/termbases/{termbaseId}/imports/{importId}/logs": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/termbaseId"
+ },
+ {
+ "$ref": "#/components/parameters/importId"
+ }
+ ],
+ "get": {
+ "summary": "Download Termbase Import Logs",
+ "operationId": "DownloadTermbaseImportLog",
+ "description": "Downloads the termbase import logs.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Termbase Import"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error code: \n * \"invalid\": the value specified in the field \"name\" of the errorDetails is not an accepted value."
+ },
+ "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 entry.\n* \"entitlementMissing\": - Your subscription does not include access to the requested type of benefit.",
+ "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"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tqa-profiles": {
+ "get": {
+ "summary": "List TQA Profiles",
+ "tags": [
+ "TQA Profile"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-tqa-profiles-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 it's 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": "ListTqaProfiles",
+ "description": "List TQA Profiles.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/location"
+ },
+ {
+ "$ref": "#/components/parameters/location-strategy"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ },
+ {
+ "$ref": "#/components/parameters/sort"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ }
+ },
+ "/tqa-profiles/{profileId}": {
+ "get": {
+ "summary": "Get TQA Profile",
+ "tags": [
+ "TQA Profile"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/tqa-profile"
+ }
+ }
+ },
+ "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 resource.",
+ "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 User 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": "GetTqaProfile",
+ "description": "Get a TQA Profile By identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/profileId"
+ }
+ ]
+ },
+ "/translation-memory/{translationMemoryId}": {
+ "get": {
+ "summary": "Get Translation Memory",
+ "tags": [
+ "Translation Memory"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory"
+ }
+ }
+ },
+ "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 resource.",
+ "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 translation memory 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": "GetTranslationMemory",
+ "description": "Get a single Translation Memory by identifier.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "put": {
+ "summary": "Update Translation Memory",
+ "operationId": "UpdateTranslationMemory",
+ "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 query parameter 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* \"minSize\": Minimum size not met for the value 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 resource.",
+ "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 translation memory 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"
+ }
+ }
+ }
+ },
+ "description": "Updates a Translation Memory. We recommend reading this page too [Updating data with PUT](../docs/Updating-data-with-PUT.html).",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-update-request"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ }
+ ],
+ "tags": [
+ "Translation Memory"
+ ]
+ },
+ "delete": {
+ "summary": "Delete Translation Memory",
+ "operationId": "DeleteTranslationMemory",
+ "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 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 resource.",
+ "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 translation memory 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"
+ }
+ }
+ }
+ },
+ "description": "Deletes a Translation Memory.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ }
+ ],
+ "tags": [
+ "Translation Memory"
+ ]
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "translationMemoryId",
+ "in": "path",
+ "required": true,
+ "description": "The identifier of the translation memory"
+ }
+ ]
+ },
+ "/translation-memory/{translationMemoryId}/copy": {
+ "post": {
+ "summary": "Copy Translation Memory",
+ "tags": [
+ "Translation Memory"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory"
+ }
+ }
+ },
+ "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 resource.",
+ "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 translation memory 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": "CopyTranslationMemory",
+ "description": "Creates a copy of a Translation Memory. The name will be suffixed with ' (Copy) '",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "translationMemoryId",
+ "in": "path",
+ "required": true,
+ "description": "The identifier of the translation memory"
+ }
+ ]
+ },
+ "/translation-memory": {
+ "get": {
+ "summary": "List Translation Memories",
+ "tags": [
+ "Translation Memory"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-translation-memories-reposne"
+ }
+ }
+ },
+ "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 it's dependencies attempted to retrieve data outside the allowed range.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "ListTranslationMemories",
+ "description": "Retrieves all the Translation Memories.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$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"
+ }
+ ]
+ },
+ "post": {
+ "summary": "Create Translation Memory",
+ "operationId": "CreateTranslationMemory",
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-base"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “invalid”: Invalid input in the query parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory 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* \"minSize\": Minimum size not met for the value 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 resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "description": "Create a new Translation Memory.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-create-request"
+ }
+ }
+ }
+ },
+ "tags": [
+ "Translation Memory"
+ ]
+ }
+ },
+ "/translation-memory/field-templates": {
+ "get": {
+ "summary": "List Field Templates",
+ "tags": [
+ "Translation Memory"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-translation-memory-field-templates"
+ }
+ }
+ },
+ "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": "ListFieldTemplates",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ },
+ {
+ "$ref": "#/components/parameters/sort"
+ },
+ {
+ "$ref": "#/components/parameters/location"
+ },
+ {
+ "$ref": "#/components/parameters/location-strategy"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "description": "Retrieves all the Field Templates."
+ },
+ "parameters": []
+ },
+ "/translation-memory/field-templates/{fieldTemplateId}": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "fieldTemplateId",
+ "in": "path",
+ "required": true,
+ "description": "The field template identifier"
+ }
+ ],
+ "get": {
+ "summary": "Get Field Template",
+ "tags": [
+ "Translation Memory"
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-field-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 resource.",
+ "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": "GetFieldTemplate",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "description": "Get a single Field Template by identifier."
+ }
+ },
+ "/translation-memory/{translationMemoryId}/imports": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "translationMemoryId",
+ "description": "The identifier of the Translation Memory.",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "get": {
+ "summary": "Get Translation Memory Import History",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/list-translation-memory-import-history"
+ }
+ }
+ },
+ "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.",
+ "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 entry.",
+ "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": "GetTMImportHistory",
+ "description": "Gets the import history for a translation memory. It returns the history of last 7 days.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ },
+ {
+ "$ref": "#/components/parameters/top"
+ },
+ {
+ "$ref": "#/components/parameters/skip"
+ }
+ ],
+ "tags": [
+ "Translation Memory Import"
+ ]
+ },
+ "post": {
+ "summary": "Import Translation Memory",
+ "operationId": "ImportTranslationMemory",
+ "responses": {
+ "200": {
+ "description": "OK - returned when the `status` field has one of the following values: `failed`, `done`, `cancelled`",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-import-response"
+ },
+ "examples": {
+ "import-termbase-ok": {
+ "value": {
+ "id": "test-import-id",
+ "status": "queued"
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "202": {
+ "description": "Accepted - returned when the `status` field has one of the following values: `queued`, `inProgress`",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-import-response"
+ },
+ "examples": {
+ "import-termbase-ok": {
+ "value": {
+ "id": "test-import-id",
+ "status": "queued"
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the query/form parameter mentioned in the “name” field on the error response.\n* \"empty\": Empty mandatory value mentioned in the \"name\" field on the error response.\n* \"multiPartOrder\": The multipart order in the body is not correct. The `properties` must be first and then, file.",
+ "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\": Not authorized to import translation memories.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ },
+ "application/xml": {
+ "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"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "properties",
+ "file"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/components/schemas/translation-memory-import-request"
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "description": "The file (binary string) to import into the translation memory. Accepted file types: .tmx, .sdltm, .zip, .tmx.gz, .sdlxliff"
+ }
+ }
+ },
+ "examples": {}
+ }
+ },
+ "description": "For details on multipart requests please see [this article](../docs/How-to-multipart.html)."
+ },
+ "description": "Generates an asynchronous import operation. \n \n Read more about prerequisites and limitations on the [official documentation center](https://docs.rws.com/791595/741139/trados-enterprise/importing-tm-content).\n \nNote: The order of the multipart form parameter must be implemented as such: properties first, file second.\n \nUse the Poll Translation Memory Import endpoint to poll until the import status is `done`. \nTo track the progress of the import please refer to [Poll Translation Memory Import](#/operations/PollTMImport).",
+ "tags": [
+ "Translation Memory Import"
+ ]
+ }
+ },
+ "/translation-memory/imports/{importId}": {
+ "parameters": [
+ {
+ "name": "importId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The import identifier."
+ }
+ ],
+ "get": {
+ "summary": "Poll Translation Memory Import",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-import-poll-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* “invalid”: Invalid input in the path 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 entry.",
+ "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": "PollTMImport",
+ "description": "Polls a Translation Memory import operation. The import is finished when the status is `done`.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Translation Memory Import"
+ ]
+ }
+ },
+ "/translation-memory/{translationMemoryId}/exports": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/translationMemoryId"
+ }
+ ],
+ "post": {
+ "summary": "Export Translation Memory",
+ "operationId": "ExportTranslationMemory",
+ "responses": {
+ "200": {
+ "description": "OK - returned when the `status` field has one of the following values: `failed`, `done`, `cancelled`",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-export-response"
+ }
+ }
+ }
+ },
+ "202": {
+ "description": "Accepted - returned when the `status` field has one of the following values: `queued`, `inProgress`",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-export-response"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid input in the request parameters. Either the `translationMemoryId` or the `sourceLanguageCode`/`targetLanguageCode` are invalid.",
+ "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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": The authenticated user is not allowed to export the translation memory.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": The resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "description": "Generates an asynchronous export operation.\nUse the [Poll Translation Memory Export](#/operations/PollTranslationMemoryExport) endpoint to poll until the export status is `done`.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-export-request"
+ }
+ }
+ }
+ },
+ "tags": [
+ "Translation Memory Export"
+ ]
+ }
+ },
+ "/translation-memory/exports/{exportId}": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/exportId"
+ }
+ ],
+ "get": {
+ "summary": "Poll Translation Memory Export",
+ "tags": [
+ "Translation Memory Export"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-memory-poll-export-response"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid `exportId` in the path parameters.",
+ "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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": The authenticated user is not allowed to read the resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": The resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "PollTranslationMemoryExport",
+ "description": "Polls a translation memory via an export operation. The exported translation memory can be downloaded once the status is `done`.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ]
+ }
+ },
+ "/translation-memory/exports/{exportId}/download": {
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/exportId"
+ }
+ ],
+ "get": {
+ "summary": "Download Exported Translation Memory",
+ "tags": [
+ "Translation Memory Export"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes:\n* \"invalid\": Invalid `exportId` in the path parameters.",
+ "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.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Error codes:\n* \"forbidden\": The authenticated user is not allowed to read the resource.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": The resource could not be found by identifier.",
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ },
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ }
+ }
+ },
+ "operationId": "DownloadExportedTranslationMemory",
+ "description": "Downloads the exported translation memory in the `tmx.gz` format when the poll operation status is `done`.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ]
+ }
+ },
+ "/translations/lookup": {
+ "post": {
+ "summary": "Lookup",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-search-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response. \n\n * \"invalid\": Invalid input 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": "Unauthorized to use translation engine.",
+ "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\": - translation engine not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "TranslationsLookup",
+ "x-stoplight": {
+ "id": "e1b35d4bkp1dq"
+ },
+ "tags": [
+ "Translation"
+ ],
+ "description": "Translates a phrase in plain text or a BCM fragment containing a single segment. The translated content will be returned as a BCM [fragment](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Fragment.html) or [term](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Skeleton.Term.html). \n\n For detailed concepts and examples see the [Translation API](../docs/translations/Translations.html) page.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-search-request"
+ }
+ }
+ },
+ "description": "Learn more about Translation Memory standard penalties [here](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/trados-tm-penalties-1159224).\r\n \r\nLearn more about Translation Unit status penalties [here](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/editing-project-tm-and-verification-settings-800732)."
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "parameters": []
+ },
+ "/translations/concordance": {
+ "post": {
+ "summary": "Concordance",
+ "tags": [
+ "Translation"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-concordance-search-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response. \n\n * \"invalid\": Invalid input 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": "Unauthorized to use translation engine.",
+ "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\": - translation engine not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "TranslationsConcordanceSearch",
+ "x-stoplight": {
+ "id": "w7q4r8d7hum33"
+ },
+ "description": "Performs a concordance search for a given text within the TM linked to the specified translation engine. The translated content will be returned as a BCM [fragment](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Fragment.html) or [term](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Skeleton.Term.html). \n\n For detailed concepts and examples see the [Translation API](../docs/translations/Translations.html) page.",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-concordance-search-request"
+ }
+ }
+ },
+ "description": "Learn more about Translation Memory standard penalties [here](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/trados-tm-penalties-1159224).\r\n \r\nLearn more about Translation Unit status penalties [here](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/editing-project-tm-and-verification-settings-800732)."
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ]
+ },
+ "parameters": []
+ },
+ "/translations/translation-unit": {
+ "put": {
+ "summary": "Update Translation Unit",
+ "tags": [
+ "Translation"
+ ],
+ "responses": {
+ "200": {
+ "description": "Ok",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-unit-add-update-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response. \n\n * \"invalid\": Invalid input 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": "Unauthorized to use translation engine.",
+ "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\": - translation engine not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "TranslationsUpdate",
+ "x-stoplight": {
+ "id": "pyjdd2h02zm8z"
+ },
+ "description": "Updates a translation unit. The system identifies matching translation units in the TM based on the provided BCM [fragment](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Fragment.html). \n\n For detailed concepts and examples see the [Translation API](../docs/translations/Translations.html) page.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-update-request"
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "summary": "Add Translation Unit",
+ "tags": [
+ "Translation"
+ ],
+ "responses": {
+ "200": {
+ "description": "Ok",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-unit-add-update-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "400": {
+ "description": "Error codes: \n\n * \"empty\": Empty value for variable mentioned in the \"name\" field on the error response. \n\n * \"invalid\": Invalid input 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": "Unauthorized to use translation engine.",
+ "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\": - translation engine not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "TranslationsAdd",
+ "description": "Adds a translation unit. The system identifies matching translation units in the TM based on the provided BCM [fragment](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Fragment.html). \n\n For detailed concepts and examples see the [Translation API](../docs/translations/Translations.html) page.",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ },
+ {
+ "$ref": "#/components/parameters/fields"
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/translation-add-request"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/users/me": {
+ "get": {
+ "tags": [
+ "User"
+ ],
+ "summary": "Get my User",
+ "description": "Retrieves the authenticated user.",
+ "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/user"
+ }
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "operationId": "GetMyUser"
+ }
+ },
+ "/users": {
+ "get": {
+ "tags": [
+ "User"
+ ],
+ "summary": "List Users",
+ "description": "Retrieves a list of all the users 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-users-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 it's 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": "ListUsers"
+ }
+ },
+ "/users/{userId}": {
+ "get": {
+ "tags": [
+ "User"
+ ],
+ "summary": "Get User",
+ "description": "Retrieves a user 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/user"
+ }
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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 resource.",
+ "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 User 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": "GetUser"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/userId"
+ }
+ ]
+ },
+ "/.well-known/jwks.json": {
+ "get": {
+ "summary": "List Public Keys",
+ "tags": [
+ "Public Keys"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/well-known-jwks-response"
+ },
+ "examples": {
+ "list-keys-ok": {
+ "value": {
+ "keys": [
+ {
+ "kty": "test-kty-1",
+ "n": "test-n-1",
+ "e": "test-e-1",
+ "alg": "test-alg-1",
+ "kid": "test-kid-1",
+ "use": "test-use-1"
+ },
+ {
+ "kty": "test-kty-2",
+ "n": "test-n-2",
+ "e": "test-e-2",
+ "alg": "test-alg-2",
+ "kid": "test-kid-2",
+ "use": "test-use-2"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "416": {
+ "description": "Error codes:\n* \"requestedRangeNotSatisfiable\": The requested entity or one of it's dependencies attempted to retrieve data outside the allowed range.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error-response"
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ }
+ },
+ "operationId": "ListPublicKeys",
+ "description": "List all available Public Keys."
+ }
+ },
+ "/.well-known/jwks.json/{kid}": {
+ "get": {
+ "summary": "Get Public Key",
+ "tags": [
+ "Public Keys"
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/jwk"
+ },
+ "examples": {
+ "get-key-ok": {
+ "value": {
+ "kty": "test-kty",
+ "n": "test-n",
+ "e": "test-e",
+ "alg": "test-alg",
+ "kid": "test-kid",
+ "use": "test-use"
+ }
+ }
+ }
+ }
+ },
+ "headers": {
+ "X-LC-TraceId": {
+ "$ref": "#/components/headers/X-LC-TraceId"
+ }
+ }
+ },
+ "404": {
+ "description": "Error codes:\n* \"notFound\": the public key 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": "GetPublicKey",
+ "description": "Retrieves a public key by it's identifier."
+ },
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "kid",
+ "in": "path",
+ "required": true,
+ "description": "The key 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",
+ "x-stoplight": {
+ "id": "014dsosfughtk"
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Authorization"
+ },
+ {
+ "$ref": "#/components/parameters/X-LC-Tenant"
+ }
+ ],
+ "tags": [
+ "Translation Domain"
+ ],
+ "description": "List all available service types."
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "account": {
+ "title": "Account",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The account identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "
default
The account name.
",
+ "x-default-field": true
+ }
+ },
+ "required": [
+ "id"
+ ]
+ },
+ "add-projects-to-group-request": {
+ "title": "Add Projects To Group Request",
+ "type": "object",
+ "description": "Input for adding projects to group.",
+ "properties": {
+ "projects": {
+ "type": "array",
+ "description": "The projects to be added to group.",
+ "items": {
+ "$ref": "#/components/schemas/project-group-project-request"
+ }
+ }
+ },
+ "required": [
+ "projects"
+ ]
+ },
+ "add-projects-to-group-response": {
+ "title": "Add Projects To Group Response",
+ "type": "object",
+ "description": "Add Projects To Group response.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The project group identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "The project group name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The project group description."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the projects in the project group.\n\n- `new`: the group is new created, or all projects in the group have status New\n\n- `inProgress`: at least one project in the group is in progress\n\n- `completed`: all projects in the group have status Completed\n\n- `deleting`: the group is getting deleted and the projects are removing from it",
+ "enum": [
+ "new",
+ "inProgress",
+ "completed",
+ "deleting"
+ ]
+ },
+ "projects": {
+ "type": "array",
+ "description": "The projects in the project group.",
+ "items": {
+ "$ref": "#/components/schemas/project-group-project"
+ }
+ },
+ "location": {
+ "$ref": "#/components/schemas/folder-v2"
+ },
+ "shortId": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the project group was created. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sssZ\"",
+ "format": "date-time"
+ },
+ "lastModifiedAt": {
+ "type": "string",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the project group was modified. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "format": "date-time"
+ }
+ },
+ "required": [
+ "id"
+ ]
+ },
+ "project-cost": {
+ "title": "Project Cost",
+ "x-stoplight": {
+ "id": "34d171ee75017"
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "type",
+ "index",
+ "costPerUnit",
+ "unitCount"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the additional cost. "
+ },
+ "type": {
+ "$ref": "#/components/schemas/project-cost-type",
+ "description": "The type of the additional cost."
+ },
+ "index": {
+ "type": "number",
+ "description": "The number of the additional cost."
+ },
+ "costPerUnit": {
+ "type": "number",
+ "description": "The cost of a unit."
+ },
+ "unitCount": {
+ "type": "number",
+ "description": "The number of units for which a cost is applied."
+ },
+ "volumeUnitType": {
+ "$ref": "#/components/schemas/volume-unit-type",
+ "description": "The unit type of the 'volume' cost, used as reference for the unit cost."
+ },
+ "conditionalCostType": {
+ "$ref": "#/components/schemas/conditional-cost-type",
+ "description": "Only for the Conditional type."
+ },
+ "costOperator": {
+ "$ref": "#/components/schemas/conditional-cost-operator",
+ "description": "Only for the Conditional type.",
+ "x-stoplight": {
+ "id": "dw5wpcfk70z9c"
+ }
+ },
+ "costVariable": {
+ "$ref": "#/components/schemas/conditional-cost-variable",
+ "description": "Only for the Conditional type.",
+ "x-stoplight": {
+ "id": "np7a8b8w5ra70"
+ }
+ },
+ "operand": {
+ "type": "number",
+ "description": "Operand of the Conditional type cost."
+ },
+ "serviceTypes": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "gkyey7knc4j3v"
+ },
+ "description": "
default
Array of Service Type identifiers where this additional cost is applied. ",
+ "items": {
+ "x-stoplight": {
+ "id": "3e6kwmu58ut0p"
+ },
+ "type": "string"
+ }
+ },
+ "customUnitName": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "rovgmbrayoltf"
+ },
+ "description": "The name of the custom unit."
+ }
+ }
+ },
+ "language-cost": {
+ "title": "Language Cost",
+ "x-stoplight": {
+ "id": "28d3xstakbk6t"
+ },
+ "type": "object",
+ "required": [
+ "name",
+ "type",
+ "index",
+ "costPerUnit",
+ "unitCount"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the additional cost. "
+ },
+ "type": {
+ "$ref": "#/components/schemas/language-cost-type",
+ "description": "The type of the additional cost."
+ },
+ "index": {
+ "type": "number",
+ "description": "The number of the additional cost."
+ },
+ "costPerUnit": {
+ "type": "number",
+ "description": "The cost of a unit."
+ },
+ "unitCount": {
+ "type": "number",
+ "description": "The number of units for which a cost is applied."
+ },
+ "volumeUnitType": {
+ "$ref": "#/components/schemas/volume-unit-type",
+ "description": "The unit type of the 'volume' cost, used as reference for the unit cost."
+ },
+ "conditionalCostType": {
+ "$ref": "#/components/schemas/conditional-cost-type",
+ "description": "Only for the Conditional type."
+ },
+ "costOperator": {
+ "$ref": "#/components/schemas/conditional-cost-operator",
+ "description": "Only for the Conditional type.",
+ "x-stoplight": {
+ "id": "ak744d5hs26tb"
+ }
+ },
+ "costVariable": {
+ "$ref": "#/components/schemas/conditional-cost-variable",
+ "description": "
default
Only for the Conditional type.",
+ "x-stoplight": {
+ "id": "la3r0xwre29qy"
+ }
+ },
+ "operand": {
+ "type": "number",
+ "description": "
default
Operand of the Conditional type cost."
+ },
+ "serviceTypes": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "gkyey7knc4j3v"
+ },
+ "description": "
default
Array of Service Type identifiers where this additional cost is applied. ",
+ "items": {
+ "x-stoplight": {
+ "id": "3e6kwmu58ut0p"
+ },
+ "type": "string"
+ }
+ },
+ "customUnitName": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "6o3o1f3p0863z"
+ },
+ "description": "The name of the custom unit."
+ }
+ }
+ },
+ "analysis-statistics": {
+ "title": "Analysis Statistics",
+ "type": "object",
+ "properties": {
+ "exactMatch": {
+ "$ref": "#/components/schemas/count",
+ "description": "
",
+ "x-default-field": true
+ },
+ "description": {
+ "type": "string"
+ },
+ "typeId": {
+ "type": "string",
+ "description": "A short string representation of the file type identifier. The ID displayed in the Trados Cloud Platform UI."
+ },
+ "enabled": {
+ "type": "boolean",
+ "description": "
default
Is this file type setting enabled. Disabled file types will not be included in operations (ex. Scan)
",
+ "nullable": true,
+ "x-default-field": true
+ },
+ "excluded": {
+ "type": "boolean",
+ "description": "Is this file type setting included in the file processing configuration. \n\nFile types will be added to a configuration as excluded = true by default and can be included by a consumer when needed (via the Trados Cloud Platform UI)\n\nExcluded file types will not be included in operations (ex. Scan)",
+ "nullable": true
+ },
+ "deprecated": {
+ "type": "boolean",
+ "description": "This file type setting is planned for deprecation and will be removed in the future.",
+ "nullable": true
+ },
+ "orderNumber": {
+ "type": "integer",
+ "description": "The order of the setting in the file type configuration."
+ },
+ "extensions": {
+ "type": "array",
+ "description": "A collection of extensions supported by this file type. Ex: \"*.xlsx\"",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "description": ""
+ },
+ "file-upload-response": {
+ "title": "File Upload Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the uploaded file"
+ },
+ "fileName": {
+ "type": "string",
+ "description": "The name of the uploaded file"
+ },
+ "unzipStatus": {
+ "type": "string",
+ "enum": [
+ "queued",
+ "extracting",
+ "extracted",
+ "unzipError"
+ ],
+ "description": "The status of the unzipping operation. You can use this to determine if your .zip file has been extracted successfully."
+ }
+ },
+ "required": [
+ "id",
+ "fileName"
+ ]
+ },
+ "file-metadata-response": {
+ "title": "File Metadata Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the uploaded file"
+ },
+ "fileName": {
+ "type": "string",
+ "description": "The name of the uploaded file"
+ },
+ "unzipStatus": {
+ "type": "string",
+ "enum": [
+ "queued",
+ "extracting",
+ "extracted",
+ "unzipError"
+ ],
+ "description": "The status of the unzipping operation. You can use this to determine if your .zip file has been extracted successfully."
+ },
+ "associatedFiles": {
+ "type": "array",
+ "description": "The files that were extracted from the uploaded .zip archive.",
+ "items": {
+ "$ref": "#/components/schemas/file-extracted-response"
+ }
+ }
+ },
+ "required": [
+ "id",
+ "fileName"
+ ]
+ },
+ "file-extracted-response": {
+ "title": "File Extracted Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the extracted file."
+ },
+ "fileName": {
+ "type": "string",
+ "description": "The name of the extracted file."
+ },
+ "filePath": {
+ "type": "string",
+ "description": "The file path of the extracted file. This is relative to the archive root."
+ }
+ },
+ "required": [
+ "id",
+ "fileName",
+ "filePath"
+ ]
+ },
+ "file-role": {
+ "type": "string",
+ "title": "File-Role",
+ "enum": [
+ "translatable",
+ "reference",
+ "localizable",
+ "unknown"
+ ],
+ "nullable": true
+ },
+ "file-version-export": {
+ "title": "File Version Export",
+ "description": "File Version Export. The resulted version can be downloaded once the status is completed.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/asynchronous-result"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "downloadUrl": {
+ "type": "string",
+ "description": "The url where the file can be downloaded."
+ }
+ }
+ }
+ ]
+ },
+ "file-version-import": {
+ "title": "File Version Import",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/asynchronous-result"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "fileVersionId": {
+ "type": "string"
+ }
+ }
+ }
+ ]
+ },
+ "folder": {
+ "title": "Folder",
+ "type": "object",
+ "description": "Folder used for resource storage.",
+ "examples": [
+ {
+ "id": "1de8f71c357c4bb5a32626faf5f53ef1",
+ "name": "consumer_A",
+ "path": [
+ {
+ "id": "7fb808326daa4bb1988ckedcd0734aa6",
+ "location": "0e6d1f1aa8df46e6b9b111ca9f388c9e",
+ "name": "dexters_extensibility_consumer",
+ "hasParent": true
+ },
+ {
+ "id": "0e6d1f1aa8df46e6b9b111ca9f388c9e",
+ "location": "61e801fa3d600fe2cfs12dd08",
+ "name": "Customers",
+ "hasParent": true
+ },
+ {
+ "id": "61e801fa3d600fe2cfs12dd08",
+ "name": "61e801fa3d600fe2cfs12dd08",
+ "hasParent": false
+ }
+ ]
+ }
+ ],
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The folder identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "
default
The name of the folder.
",
+ "x-default-field": true
+ },
+ "hasParent": {
+ "type": "boolean",
+ "description": "Indicates if the folder has a parent folder.",
+ "nullable": true
+ },
+ "path": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "31bd3get7o6hk"
+ },
+ "description": "The hierarchical path. It consists of all the items of the path in reverse order, the parent of the current folder being the first in the list, and the root of the account being the last.",
+ "items": {
+ "$ref": "#/components/schemas/folder-path",
+ "x-stoplight": {
+ "id": "i4c2vlnydf80m"
+ }
+ }
+ }
+ }
+ },
+ "folder-v2": {
+ "title": "Folder",
+ "type": "object",
+ "description": "Folder used for resource storage.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The folder identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "
default
The name of the folder.
",
+ "x-default-field": true
+ },
+ "hasParent": {
+ "type": "boolean",
+ "description": "Indicates if the folder has a parent folder.",
+ "nullable": true
+ },
+ "path": {
+ "type": "array",
+ "description": "The hierarchical path. It consists of all the items of the path in reverse order, the parent of the current folder being the first in the list, and the root of the account being the last.",
+ "items": {
+ "$ref": "#/components/schemas/folder-path"
+ }
+ }
+ },
+ "required": [
+ "id"
+ ]
+ },
+ "folder-path": {
+ "title": "Folder Path",
+ "type": "object",
+ "description": "Path of a folder.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The folder identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the folder."
+ },
+ "location": {
+ "type": "string",
+ "description": "
Options: \r\n- `keepExisting`: no segments are overwritten, existing segments are kept;\r\n- `overwriteIfBetter`: unlocked segments (including confirmed segments) are overwritten, while unlocked PerfectMatch segments and locked segments are not overwritten; \r\n- `overwriteAlways`: PerfectMatch segments (both locked and unlocked) are overwritten, while other locked segments are not overwritten;\r\n- `overwriteExceptPerfectMatch`: unlocked segments (including confirmed segments) and locked segments are overwritten, while unlocked PerfectMatch segments are not overwritten;
",
+ "x-default-field": true,
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 20,
+ "default": 0
+ }
+ }
+ },
+ "project-plan": {
+ "title": "Project Plan",
+ "type": "object",
+ "description": "The configurations of the tasks that will be created in the future.\n\nAvailable now directly after project creation, project does not need to be started to be populated. \n\n(Not available for List Projects endpoint)",
+ "properties": {
+ "taskConfigurations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/project-plan-task-configuration"
+ }
+ }
+ }
+ },
+ "project-plan-task-configuration": {
+ "title": "Project Plan Task Configuration",
+ "type": "object",
+ "description": "The configuration of a task that will be created in the future.",
+ "properties": {
+ "taskTemplate": {
+ "$ref": "#/components/schemas/object-id"
+ },
+ "scope": {
+ "$ref": "#/components/schemas/task-configuration-scope"
+ },
+ "assignees": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/workflow-task-assignee"
+ }
+ },
+ "isSkipped": {
+ "type": "boolean",
+ "description": "
default
Specifies if the task will be skipped.
",
+ "nullable": true,
+ "x-default-field": true
+ },
+ "dueBy": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The due date of the future task. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sssZ\"",
+ "nullable": true
+ }
+ },
+ "required": [
+ "taskTemplate",
+ "scope"
+ ]
+ },
+ "project-plan-task-assignee-request": {
+ "title": "Project Plan Task Assignee Request",
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "user",
+ "group",
+ "vendorOrderTemplate",
+ "projectCreator"
+ ]
+ },
+ "id": {
+ "type": "string",
+ "description": "The user, group or vendor identifier, depending on the type chosen. It is not required for `projectCreator`."
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "project-plan-update-request": {
+ "title": "Project Plan Update Request",
+ "type": "object",
+ "description": "Updates the configurations of the tasks that will be created in the future. \nFor example, you can change the assignee of the \"translation\" task while the project is in the \"preprocessing\" phase.",
+ "properties": {
+ "taskConfigurations": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/components/schemas/project-plan-task-configuration-request"
+ }
+ }
+ },
+ "required": [
+ "taskConfigurations"
+ ]
+ },
+ "project-plan-task-configuration-request": {
+ "title": "Project Plan Task Configuration Request",
+ "type": "object",
+ "description": "A project plan task configuration request. Used to update a task that will be created in the future.",
+ "properties": {
+ "taskTemplate": {
+ "$ref": "#/components/schemas/object-id-request"
+ },
+ "isSkipped": {
+ "type": "boolean",
+ "description": "Specifies if the task will be skipped. \n If you want to skip all the target languages for the given task, set the scope as \"global\"."
+ },
+ "assignees": {
+ "type": "array",
+ "description": "Specifies the list of assignees for the future task. \n When the 'isSkipped' field is set to 'true', an empty list of assignees should be specified.\r\n Total assignee count is limited. See more at [Assigning users and groups to workflow tasks](https://docs.rws.com/791595/743481/trados-enterprise---accelerate/assigning-users-and-groups-to-workflow-tasks) point 5e.",
+ "items": {
+ "$ref": "#/components/schemas/project-plan-task-assignee-request"
+ }
+ },
+ "scope": {
+ "$ref": "#/components/schemas/task-configuration-scope-request"
+ },
+ "dueBy": {
+ "$ref": "#/components/schemas/date-time"
+ }
+ },
+ "required": [
+ "taskTemplate",
+ "isSkipped",
+ "assignees",
+ "scope"
+ ]
+ },
+ "project-status-history": {
+ "title": "Project Status History Item",
+ "type": "object",
+ "description": "An Item which describes a change in the status of the project.",
+ "properties": {
+ "from": {
+ "type": "string",
+ "description": "Specifies the project status previous to the change.",
+ "enum": [
+ "none",
+ "created",
+ "inProgress",
+ "completed"
+ ]
+ },
+ "to": {
+ "type": "string",
+ "description": "Specifies the project status post change.",
+ "enum": [
+ "created",
+ "inProgress",
+ "completed"
+ ]
+ },
+ "by": {
+ "$ref": "#/components/schemas/user"
+ },
+ "timestamp": {
+ "$ref": "#/components/schemas/date-time",
+ "x-default-field": true,
+ "description": "The time and date when the status history was updated. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sssZ\""
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ]
+ },
+ "quote": {
+ "title": "Quote",
+ "type": "object",
+ "description": "Project quote.",
+ "properties": {
+ "totalAmount": {
+ "type": "number",
+ "description": "
"
+ },
+ "count": {
+ "type": "number",
+ "description": "The number of units used to compute the total. Used only for 'volume', 'hourly', 'perPage' and 'percentage' cost types.",
+ "nullable": true
+ },
+ "total": {
+ "type": "number",
+ "description": "
default
The computed cost.
",
+ "nullable": true,
+ "x-default-field": true
+ },
+ "cost": {
+ "type": "number",
+ "description": "The cost of a unit.",
+ "nullable": true
+ },
+ "costType": {
+ "$ref": "#/components/schemas/project-cost-type",
+ "description": "The type of the additional cost."
+ },
+ "volumeUnitType": {
+ "$ref": "#/components/schemas/volume-unit-type",
+ "description": "The unit type of the 'volume' cost, used as a reference for the unit cost."
+ },
+ "costOrder": {
+ "type": "integer",
+ "description": "Indicates the order in which the additional cost is computed.",
+ "nullable": true
+ },
+ "conditionalCostType": {
+ "$ref": "#/components/schemas/conditional-cost-type",
+ "description": "Describes how the cost of type 'conditional' will be added to total cost."
+ },
+ "conditionalCostOperator": {
+ "$ref": "#/components/schemas/conditional-cost-operator",
+ "description": "The operator applied between the 'costVariable' and 'operand'."
+ },
+ "conditionalCostVariable": {
+ "$ref": "#/components/schemas/conditional-cost-variable",
+ "description": "The variable that is evaluated against the 'operand' based on the 'costOperator'."
+ },
+ "conditionalCostThreshold": {
+ "description": "The value that is evaluated against the 'costVariable' based on the 'costOperator'.",
+ "type": "number",
+ "nullable": true
+ },
+ "runningTotal": {
+ "type": "number",
+ "description": "The sum of all the previously computed costs.",
+ "nullable": true
+ },
+ "customUnitName": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "sh8ttf4ncbt4f"
+ },
+ "description": "The name of the custom unit."
+ }
+ }
+ },
+ "quote-additional-cost-request": {
+ "title": "Quote Additional Cost Request",
+ "type": "object",
+ "required": [
+ "name",
+ "count",
+ "cost",
+ "costOrder",
+ "conditionalCostThreshold"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the additional cost."
+ },
+ "count": {
+ "type": "number",
+ "description": "The number of units used to compute the total. Used only for 'volume', 'hourly', 'perPage' and 'percentage' cost types."
+ },
+ "cost": {
+ "type": "number",
+ "description": "The cost of a unit."
+ },
+ "costType": {
+ "$ref": "#/components/schemas/project-cost-type",
+ "description": "The type of the additional cost.",
+ "nullable": true
+ },
+ "volumeUnitType": {
+ "$ref": "#/components/schemas/volume-unit-type",
+ "description": "The unit type of the 'volume' cost, used for counting the units.",
+ "nullable": true
+ },
+ "costOrder": {
+ "type": "integer",
+ "description": "Indicates the order in which the additional cost is computed."
+ },
+ "conditionalCostType": {
+ "$ref": "#/components/schemas/conditional-cost-type",
+ "description": "Describes how the cost of type 'conditional' will be added to total cost.",
+ "nullable": true
+ },
+ "conditionalCostOperator": {
+ "$ref": "#/components/schemas/conditional-cost-operator",
+ "description": "The operator applied between the 'costVariable' and 'operand'.",
+ "nullable": true
+ },
+ "conditionalCostVariable": {
+ "$ref": "#/components/schemas/conditional-cost-variable",
+ "description": "The variable that is evaluated against the 'operand' based on the 'costOperator'.",
+ "nullable": true
+ },
+ "conditionalCostThreshold": {
+ "description": "The value that is evaluated against the 'costVariable' based on the 'costOperator'.",
+ "type": "number"
+ }
+ }
+ },
+ "quote-language-cost": {
+ "title": "Quote Language Cost",
+ "type": "object",
+ "description": "Fees relevant for a specific target language.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "
default
The name of the additional cost.
",
+ "x-default-field": true
+ },
+ "count": {
+ "type": "number",
+ "description": "The number of units used to compute the total. Used only for 'volume', 'hourly', 'perPage' and 'percentage' cost types.",
+ "nullable": true
+ },
+ "total": {
+ "type": "number",
+ "description": "
default
The computed cost.
",
+ "nullable": true,
+ "x-default-field": true
+ },
+ "cost": {
+ "type": "number",
+ "description": "The cost of a unit.",
+ "nullable": true
+ },
+ "costType": {
+ "$ref": "#/components/schemas/language-cost-type",
+ "description": "The type of the additional cost."
+ },
+ "volumeUnitType": {
+ "$ref": "#/components/schemas/volume-unit-type",
+ "description": "The unit type of the 'volume' cost, used as a reference for the unit cost."
+ },
+ "targetLanguage": {
+ "$ref": "#/components/schemas/language"
+ },
+ "costOrder": {
+ "type": "integer",
+ "description": "Indicates the order in which the additional cost is computed.",
+ "nullable": true
+ },
+ "conditionalCostType": {
+ "$ref": "#/components/schemas/conditional-cost-type",
+ "description": "The condition type of the conditional cost."
+ },
+ "conditionalCostOperator": {
+ "$ref": "#/components/schemas/conditional-cost-operator",
+ "description": "The operator applied between the 'costVariable' and 'operand'."
+ },
+ "conditionalCostVariable": {
+ "$ref": "#/components/schemas/conditional-cost-variable",
+ "description": "The variable that is evaluated against the 'operand' based on the 'costOperator'."
+ },
+ "conditionalCostThreshold": {
+ "description": "The value that is evaluated against the 'costVariable' based on the 'costOperator'.",
+ "type": "number",
+ "nullable": true
+ },
+ "runningTotal": {
+ "type": "number",
+ "description": "The sum of all the previously computed costs.",
+ "nullable": true
+ },
+ "customUnitName": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "tdfu8mqyo09if"
+ },
+ "description": "The name of the custom unit."
+ }
+ }
+ },
+ "quote-language-cost-request": {
+ "title": "Quote Language Cost Request",
+ "type": "object",
+ "required": [
+ "name",
+ "count",
+ "cost",
+ "costOrder",
+ "conditionalCostThreshold"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the additional cost."
+ },
+ "count": {
+ "type": "number",
+ "description": "The number of units used to compute the total. Used only for 'volume', 'hourly', 'perPage' and 'percentage' cost types."
+ },
+ "cost": {
+ "type": "number",
+ "description": "The cost of a unit."
+ },
+ "costType": {
+ "$ref": "#/components/schemas/language-cost-type",
+ "description": "The type of the additional cost.",
+ "nullable": true
+ },
+ "volumeUnitType": {
+ "$ref": "#/components/schemas/volume-unit-type",
+ "description": "The unit type of the 'volume' cost, used for counting the units.",
+ "nullable": true
+ },
+ "targetLanguage": {
+ "$ref": "#/components/schemas/target-language-request"
+ },
+ "costOrder": {
+ "type": "integer",
+ "description": "Indicates the order in which the additional cost is computed."
+ },
+ "conditionalCostType": {
+ "$ref": "#/components/schemas/conditional-cost-type",
+ "description": "Describes how the cost of type 'conditional' will be added to total cost.",
+ "nullable": true
+ },
+ "conditionalCostOperator": {
+ "$ref": "#/components/schemas/conditional-cost-operator",
+ "description": "The operator applied between the 'costVariable' and 'operand'.",
+ "nullable": true
+ },
+ "conditionalCostVariable": {
+ "$ref": "#/components/schemas/conditional-cost-variable",
+ "description": "The variable that is evaluated against the 'operand' based on the 'costOperator'.",
+ "nullable": true
+ },
+ "conditionalCostThreshold": {
+ "description": "The value that is evaluated against the 'costVariable' based on the 'costOperator'.",
+ "type": "number"
+ }
+ }
+ },
+ "quote-translation-cost": {
+ "title": "Quote Translation Cost",
+ "type": "object",
+ "description": "Fees calculated based on segment status (new, translated, signed off) and previous leverage (100% match and identical context, 100% match, <100%match, cross-file repetitions).",
+ "properties": {
+ "total": {
+ "type": "number",
+ "description": "
Unique identifier of custom task types. Null for default task types."
+ },
+ "description": {
+ "type": "string"
+ },
+ "automatic": {
+ "type": "boolean",
+ "description": "This indicates whether the task is automatic or human.",
+ "nullable": true
+ },
+ "scope": {
+ "type": "string",
+ "description": "The resource type scope for the task.",
+ "enum": [
+ "file",
+ "targetLanguage",
+ "batch",
+ "vendorOrder",
+ "task"
+ ],
+ "nullable": true
+ },
+ "outcomes": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/task-type-outcome"
+ }
+ },
+ "location": {
+ "$ref": "#/components/schemas/folder-v2"
+ }
+ },
+ "required": [
+ "id"
+ ]
+ },
+ "task-outcome": {
+ "title": "Task Outcome",
+ "type": "object",
+ "description": "Outcome a task can be completed with. List will be populated after the task is accepted.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "
default
Outcome to be used with complete endpoint.",
+ "x-default-field": true
+ },
+ "description": {
+ "type": "string",
+ "description": "A human-friendly form of the outcome."
+ },
+ "default": {
+ "type": "boolean",
+ "description": "
default
Specifies if the outcome is the default one for the task.",
+ "x-default-field": true
+ }
+ }
+ },
+ "task-type-outcome": {
+ "title": "Task Type Outcome",
+ "type": "object",
+ "description": "The task type outcome.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "
",
+ "x-default-field": true
+ }
+ }
+ },
+ "task-configuration-scope": {
+ "title": "Workflow Task Configuration Scope",
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The applicability impact of the workflow configuration:\n- global: used for global tasks which are not associated to a target language\n- sourceLanguage: changes affect only the task associated to the source language specified in **sourceLanguage** field\n- targetLanguage: changes affect only the task associated to the target language specified in **targetLanguage** field\n- languageDirection: changes affect only the task associated to the language direction specified in **languageDirection** field",
+ "enum": [
+ "global",
+ "sourceLanguage",
+ "targetLanguage",
+ "languageDirection"
+ ]
+ },
+ "sourceLanguage": {
+ "$ref": "#/components/schemas/language"
+ },
+ "targetLanguage": {
+ "$ref": "#/components/schemas/language"
+ },
+ "languageDirection": {
+ "$ref": "#/components/schemas/language-direction-item"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "task-configuration-scope-request": {
+ "title": "Workflow Task Configuration Scope Request",
+ "type": "object",
+ "description": "",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The applicability impact of the workflow configuration:\n- global: used for global tasks, that are not associated to a target language \n- sourceLanguage: changes affect only the task associated to the source language specified in `sourceLanguage` field. For using this type, must include the `sourceLanguage` field.\n- targetLanguage: changes affect only the task associated to the target language specified in `targetLanguage` field. For using this type, must include the `targetLanguage` field.\n- languageDirection: changes affect only the task associated to the language direction specified in `languageDirection` field. For using this type, must include the `languageDirection` field.",
+ "enum": [
+ "global",
+ "sourceLanguage",
+ "targetLanguage",
+ "languageDirection"
+ ]
+ },
+ "sourceLanguage": {
+ "$ref": "#/components/schemas/source-language-request"
+ },
+ "targetLanguage": {
+ "$ref": "#/components/schemas/target-language-request"
+ },
+ "languageDirection": {
+ "$ref": "#/components/schemas/language-direction-item"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "target-file": {
+ "title": "Target File",
+ "type": "object",
+ "description": "Target File.",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "description": "
The termbase fields. (Not available for List Termbases endpoint).
",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field"
+ },
+ "x-default-field": true
+ }
+ }
+ },
+ "termbase-structure-create-request": {
+ "title": "Termbase Structure Create Request",
+ "type": "object",
+ "description": "The termbase structure create request.",
+ "properties": {
+ "languages": {
+ "type": "array",
+ "description": "The languages of the termbase. If not supplied, the termbase will be created using the languages from the specified template. Otherwise it will override the languages from the template.",
+ "items": {
+ "$ref": "#/components/schemas/language-request"
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "Describes the field structure. If not supplied, the termbase will be created using the fields from the specified template. Otherwise it will override the fields from the template.",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-create-request"
+ }
+ }
+ }
+ },
+ "termbase-structure-update-request": {
+ "title": "Termbase Structure Update Request",
+ "type": "object",
+ "description": "The termbase structure update request.",
+ "properties": {
+ "languages": {
+ "type": "array",
+ "description": "The languages of the termbase. If not supplied, the termbase will be updated using the languages from the specified template. Otherwise it will override the languages from the template.",
+ "items": {
+ "$ref": "#/components/schemas/language-request"
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "Describes the field structure. If not supplied, the termbase will be updated using the fields from the specified template. Otherwise it will override the fields from the template.",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-update-request"
+ }
+ }
+ }
+ },
+ "termbase-field": {
+ "title": "Termbase Field",
+ "type": "object",
+ "description": "The termbase field.",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the termbase field."
+ },
+ "name": {
+ "type": "string",
+ "description": "
default
The name of the termbase field.
",
+ "x-default-field": true
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the termbase field",
+ "nullable": true
+ },
+ "type": {
+ "type": "string",
+ "description": "The type of the termbase field - system or userDefined.",
+ "enum": [
+ "system",
+ "userDefined"
+ ]
+ },
+ "level": {
+ "type": "string",
+ "enum": [
+ "entry",
+ "language",
+ "term"
+ ],
+ "description": "
",
+ "x-default-field": true
+ },
+ "pickListValues": {
+ "type": "array",
+ "uniqueItems": false,
+ "description": "The pick list options. Only if dataType is \"picklist\".",
+ "items": {
+ "type": "string"
+ }
+ },
+ "allowCustomValues": {
+ "type": "boolean",
+ "description": "Specifies if the field allows custom values."
+ },
+ "allowMultiple": {
+ "type": "boolean",
+ "description": "Specifies if the field can be used multiple times."
+ },
+ "isMandatory": {
+ "type": "boolean",
+ "description": "Specifies if the field is mandatory."
+ }
+ }
+ },
+ "termbase-field-update-request": {
+ "title": "Termbase Field Update Request",
+ "type": "object",
+ "description": "The termbase field update request.\n\nIf dataType is `picklist` and pickListValues array is empty `allowCustomValues` must be true.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the termbase field to updated. If missing will add a new field."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the termbase field. Must be unique.",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the termbase field.",
+ "minLength": 1,
+ "maxLength": 200,
+ "nullable": true
+ },
+ "level": {
+ "type": "string",
+ "enum": [
+ "entry",
+ "language",
+ "term"
+ ],
+ "description": "The level of which this field applies."
+ },
+ "dataType": {
+ "type": "string",
+ "enum": [
+ "text",
+ "double",
+ "date",
+ "picklist",
+ "boolean"
+ ],
+ "description": "The data type of the field."
+ },
+ "pickListValues": {
+ "type": "array",
+ "uniqueItems": true,
+ "description": "The pick list options. Only if dataType is \"picklist\".",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 1000
+ }
+ },
+ "allowCustomValues": {
+ "type": "boolean",
+ "description": "Specifies if the field allows custom values. Must be true if pickListValues is empty.",
+ "default": false
+ },
+ "allowMultiple": {
+ "type": "boolean",
+ "description": "Specifies if the field can be used multiple times.",
+ "default": true
+ },
+ "isMandatory": {
+ "type": "boolean",
+ "description": "Specifies if the field is mandatory.",
+ "default": false
+ }
+ },
+ "required": [
+ "name",
+ "level",
+ "dataType"
+ ]
+ },
+ "termbase-field-create-request": {
+ "title": "Termbase Field Create Request",
+ "type": "object",
+ "description": "The termbase field request.\n\nIf dataType is `picklist` and pickListValues array is empty `allowCustomValues` must be true.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the termbase field. Must be unique.",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the termbase field.",
+ "minLength": 1,
+ "maxLength": 200,
+ "nullable": true
+ },
+ "level": {
+ "type": "string",
+ "enum": [
+ "entry",
+ "language",
+ "term"
+ ],
+ "description": "The level of which this field applies."
+ },
+ "dataType": {
+ "type": "string",
+ "enum": [
+ "text",
+ "double",
+ "date",
+ "picklist",
+ "boolean"
+ ],
+ "description": "The data type of the field."
+ },
+ "pickListValues": {
+ "type": "array",
+ "uniqueItems": true,
+ "description": "The pick list values. Only if dataType is \"picklist\". Values must be unique.",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 1000
+ }
+ },
+ "allowCustomValues": {
+ "type": "boolean",
+ "description": "Specifies if the field allows custom values. Must be true if pickListValues is empty.",
+ "default": false
+ },
+ "allowMultiple": {
+ "type": "boolean",
+ "description": "Specifies if the field can be used multiple times.",
+ "default": true
+ },
+ "isMandatory": {
+ "type": "boolean",
+ "description": "Specifies if the field is mandatory.",
+ "default": false
+ }
+ },
+ "required": [
+ "name",
+ "level",
+ "dataType"
+ ]
+ },
+ "termbase": {
+ "title": "Termbase",
+ "type": "object",
+ "description": "The termbase.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the termbase."
+ },
+ "name": {
+ "type": "string",
+ "description": "
default
The name of the termbase.
",
+ "x-default-field": true
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the termbase.",
+ "nullable": true
+ },
+ "copyright": {
+ "type": "string",
+ "description": "The copyright of the termbase.",
+ "nullable": true
+ },
+ "location": {
+ "$ref": "#/components/schemas/folder-v2",
+ "description": "
default
The resource folder.
",
+ "x-default-field": true
+ },
+ "termbaseStructure": {
+ "$ref": "#/components/schemas/termbase-structure"
+ },
+ "numberOfEntries": {
+ "type": "number",
+ "description": "The number of entries included in the termbase. (Not available for List Termbases endpoint)"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "ready",
+ "processingContent",
+ "exportingContent",
+ "deletingContent"
+ ],
+ "description": "The status of the termbase. (Not available for List Termbases endpoint)"
+ },
+ "createdAt": {
+ "type": "string",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the termbase was created. (Not available for List Termbases endpoint) UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "format": "date-time"
+ },
+ "lastModifiedAt": {
+ "type": "string",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the termbase was last updated. (Not available for List Termbases endpoint) UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "format": "date-time"
+ }
+ },
+ "required": [
+ "id"
+ ]
+ },
+ "termbase-create-request": {
+ "title": "Termbase Create Request",
+ "type": "object",
+ "description": "Termbase create request.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the termbase.",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the termbase.",
+ "minLength": 0,
+ "maxLength": 200,
+ "nullable": true
+ },
+ "copyright": {
+ "type": "string",
+ "description": "The copyright of the termbase.",
+ "minLength": 0,
+ "maxLength": 50,
+ "nullable": true
+ },
+ "location": {
+ "type": "string",
+ "description": "The folder identifier where the termbase should be created. If not specified, it will be created in the Root folder. If the user does not have access in Root, the request will fail with forbidden error."
+ },
+ "termbaseTemplateId": {
+ "type": "string",
+ "description": "The termbase template identifier."
+ },
+ "termbaseStructure": {
+ "$ref": "#/components/schemas/termbase-structure-create-request"
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "termbase-update-request": {
+ "title": "Termbase Update Request",
+ "type": "object",
+ "description": "Termbase update request.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the termbase.",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the termbase.",
+ "minLength": 0,
+ "maxLength": 200,
+ "nullable": true
+ },
+ "copyright": {
+ "type": "string",
+ "description": "The copyright of the termbase.",
+ "minLength": 0,
+ "maxLength": 50,
+ "nullable": true
+ },
+ "termbaseTemplateId": {
+ "type": "string",
+ "description": "The termbase template identifier."
+ },
+ "termbaseStructure": {
+ "$ref": "#/components/schemas/termbase-structure-update-request"
+ }
+ }
+ },
+ "termbase-field-value-link": {
+ "title": "Termbase Field Value Link",
+ "type": "object",
+ "description": "The field value link.",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "term",
+ "entry",
+ "external"
+ ],
+ "description": "The type of the link."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the link."
+ }
+ },
+ "required": [
+ "type",
+ "value"
+ ]
+ },
+ "termbase-field-value-link-update-request": {
+ "title": "Termbase Field Value Link Update Request",
+ "type": "object",
+ "description": "The field value link update request.",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "term",
+ "entry",
+ "external"
+ ],
+ "description": "The type of the link."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the link."
+ }
+ }
+ },
+ "termbase-field-value-link-create-request": {
+ "title": "Termbase Field Value Link Create Request",
+ "type": "object",
+ "description": "The field value link create request.",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "term",
+ "entry",
+ "external"
+ ],
+ "description": "The type of link."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the link.",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "type",
+ "value"
+ ]
+ },
+ "termbase-field-value": {
+ "title": "Termbase Field Value",
+ "type": "object",
+ "description": "The termbase field value.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The field value identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "The field value name."
+ },
+ "termbaseFieldId": {
+ "type": "string",
+ "description": "The termbase field identifier."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the field."
+ },
+ "fieldValueLinks": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-link"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the termbase field value was created. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "createdBy": {
+ "$ref": "#/components/schemas/user"
+ },
+ "lastModifiedAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the termbase field value was last modified. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "lastModifiedBy": {
+ "$ref": "#/components/schemas/user"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "termbaseFieldId",
+ "value"
+ ]
+ },
+ "termbase-field-value-update-request": {
+ "title": "Termbase Field Value Update request",
+ "type": "object",
+ "description": "The termbase field value update request.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The field value identifier. Either the `id` or the `name` is mandatory to be provided."
+ },
+ "name": {
+ "type": "string",
+ "description": "The field value name. Either the `id` or the `name` is mandatory to be provided."
+ },
+ "termbaseFieldId": {
+ "type": "string",
+ "description": "The termbase field value identifier. Must match with the fieldId from the termbase."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the field.",
+ "minLength": 1,
+ "maxLength": 4096
+ },
+ "fieldValueLinks": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-link-update-request"
+ }
+ }
+ },
+ "required": [
+ "termbaseFieldId",
+ "value"
+ ]
+ },
+ "termbase-field-value-create-request": {
+ "title": "Termbase Field Value Create Request",
+ "type": "object",
+ "description": "The termbase field value create request.",
+ "properties": {
+ "termbaseFieldId": {
+ "type": "string",
+ "description": "The termbase field identifier. It must match the `fieldId` from the termbase."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the field.",
+ "minLength": 1,
+ "maxLength": 4096
+ },
+ "fieldValueLinks": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-link-create-request"
+ }
+ }
+ },
+ "required": [
+ "termbaseFieldId",
+ "value"
+ ]
+ },
+ "termbase-entry-term": {
+ "title": "Termbase Entry Term",
+ "type": "object",
+ "description": "The termbase entry term.",
+ "required": [
+ "id",
+ "text"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The term identifier."
+ },
+ "text": {
+ "type": "string",
+ "description": "The term text."
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the term entry was created. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "createdBy": {
+ "$ref": "#/components/schemas/user"
+ },
+ "lastModifiedAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the term entry was last modified. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "lastModifiedBy": {
+ "$ref": "#/components/schemas/user"
+ },
+ "systemStatus": {
+ "$ref": "#/components/schemas/termbase-entry-term-system-status",
+ "x-stoplight": {
+ "id": "xx4xvu4isws0c"
+ }
+ }
+ }
+ },
+ "termbase-entry-term-update-request": {
+ "title": "Termbase Entry Term Update Request",
+ "type": "object",
+ "description": "The termbase entry term update request.",
+ "required": [
+ "text"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The term identifier that will be updated. If not supplied, a new term will be created."
+ },
+ "text": {
+ "type": "string",
+ "description": "The term text.",
+ "minLength": 1,
+ "maxLength": 1024
+ },
+ "systemStatus": {
+ "$ref": "#/components/schemas/termbase-entry-term-system-status-request",
+ "x-stoplight": {
+ "id": "lpm4ttzn58ku0"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-update-request"
+ }
+ }
+ }
+ },
+ "termbase-term-create-request": {
+ "title": "Termbase Entry Term Create Request",
+ "type": "object",
+ "description": "The termbase entry term request.",
+ "required": [
+ "text"
+ ],
+ "properties": {
+ "text": {
+ "type": "string",
+ "description": "The term text.",
+ "maxLength": 1024,
+ "minLength": 1
+ },
+ "systemStatus": {
+ "$ref": "#/components/schemas/termbase-entry-term-system-status-request",
+ "x-stoplight": {
+ "id": "cvo2q7bu0gkix"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-create-request"
+ }
+ }
+ }
+ },
+ "termbase-entry-language": {
+ "title": "Termbase Entry Language",
+ "type": "object",
+ "description": "The termbase entry language.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The termbase language identifier."
+ },
+ "language": {
+ "$ref": "#/components/schemas/language"
+ },
+ "terms": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-entry-term"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the language entry was created. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "createdBy": {
+ "$ref": "#/components/schemas/user"
+ },
+ "lastModifiedAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the language entry was last modified. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "lastModifedBy": {
+ "$ref": "#/components/schemas/user"
+ }
+ },
+ "required": [
+ "id",
+ "language"
+ ]
+ },
+ "termbase-entry-language-update-request": {
+ "title": "Termbase Entry Language Update Request",
+ "type": "object",
+ "description": "The termbase entry language update request.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The termbase language identifier."
+ },
+ "language": {
+ "$ref": "#/components/schemas/language-request"
+ },
+ "terms": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-entry-term-update-request"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-update-request"
+ }
+ }
+ },
+ "required": [
+ "language",
+ "terms"
+ ]
+ },
+ "termbase-entry-language-create-request": {
+ "title": "Termbase Entry Language Create Request",
+ "type": "object",
+ "description": "The termbase entry language create request.",
+ "properties": {
+ "language": {
+ "$ref": "#/components/schemas/language-request"
+ },
+ "terms": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-term-create-request"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-create-request"
+ }
+ }
+ },
+ "required": [
+ "language",
+ "terms"
+ ]
+ },
+ "termbase-entry": {
+ "title": "Termbase Entry",
+ "type": "object",
+ "description": "The termbase entry.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The termbase entry identifier."
+ },
+ "humanReadableId": {
+ "type": "string",
+ "description": "An identifier that can be provided externally, or generated automatically by the Trados Cloud Platform, used for creating cross-references. You can use it to set its value to be correlated to your system. The format of the generated value is not guaranteed."
+ },
+ "languages": {
+ "description": "The termbase entry languages.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-entry-language"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the termbase entry was created. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "createdBy": {
+ "$ref": "#/components/schemas/user"
+ },
+ "lastModifiedAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The date and time when the termbase entry was last modified. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss",
+ "nullable": true
+ },
+ "lastModifiedBy": {
+ "$ref": "#/components/schemas/user"
+ }
+ },
+ "required": [
+ "id",
+ "languages"
+ ]
+ },
+ "termbase-entry-update-request": {
+ "title": "Termbase Entry Update Request",
+ "type": "object",
+ "description": "The termbase entry update request.",
+ "properties": {
+ "humanReadableId": {
+ "type": "string",
+ "description": "An identifier that can be provided externally, or generated automatically by the Trados Cloud Platform, used for creating cross-references. You can use it to set its value to be correlated to your system. The format of the generated value is not guaranteed."
+ },
+ "languages": {
+ "description": "The termbase entry languages.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-entry-language-update-request"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-update-request"
+ }
+ }
+ },
+ "required": [
+ "languages"
+ ]
+ },
+ "termbase-entry-create-request": {
+ "title": "Termbase Entry Create Request",
+ "type": "object",
+ "description": "The termbase entry create request.",
+ "properties": {
+ "humanReadableId": {
+ "type": "string",
+ "description": "An identifier that can be provided externally, or generated automatically by the Trados Cloud Platform, used for creating cross-references. You can use it to set its value to be correlated to your system.\nThe format of the generated value is not guaranteed."
+ },
+ "languages": {
+ "description": "The termbase entry languages.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-entry-language-create-request"
+ }
+ },
+ "termbaseFieldValues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/termbase-field-value-create-request"
+ }
+ }
+ },
+ "required": [
+ "languages"
+ ]
+ },
+ "termbase-entry-term-system-status": {
+ "title": "Termbase Entry Term System Status",
+ "type": "string",
+ "nullable": true,
+ "x-stoplight": {
+ "id": "k477x1xb11mvw"
+ },
+ "enum": [
+ "preferred",
+ "draft",
+ "inReview",
+ "deprecated",
+ "recommended",
+ "admitted",
+ "forbidden",
+ "rejected",
+ "superseded"
+ ]
+ },
+ "termbase-entry-term-system-status-request": {
+ "title": "Termbase Entry Term System Status",
+ "type": "string",
+ "x-stoplight": {
+ "id": "k477x1xb11mvw"
+ },
+ "enum": [
+ "preferred",
+ "draft",
+ "inReview",
+ "deprecated",
+ "recommended",
+ "admitted",
+ "forbidden",
+ "rejected",
+ "superseded"
+ ]
+ },
+ "termbase-export-properties-request": {
+ "title": "Termbase Export Properties Request",
+ "type": "object",
+ "properties": {
+ "downloadCompressed": {
+ "type": "boolean",
+ "description": "Download compressed ( zipped ).",
+ "default": false
+ }
+ }
+ },
+ "termbase-export-response": {
+ "title": "Termbase Export Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The termbase export identifier."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the export operation. \n`queued` - The export passed the structural validation and it's waiting to be processed. \n`processing` - The export is in progress. \n`done` - The export was successfully processed . \n`canceled` - The export process was interrupted. \n`error` - The export was unsuccessful due to an internal error.",
+ "enum": [
+ "queued",
+ "processing",
+ "done",
+ "cancelled",
+ "error"
+ ]
+ },
+ "errorMessage": {
+ "type": "string",
+ "description": "When status is 'error', contains the error message explaining what went wrong."
+ },
+ "downloadUrl": {
+ "type": "string",
+ "description": "The url where the file can be downloaded."
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "termbase-term": {
+ "title": "Termbase Term Response",
+ "type": "object",
+ "description": "The termbase term.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The term identifier."
+ },
+ "entryId": {
+ "type": "string",
+ "description": "The entry identifier."
+ },
+ "text": {
+ "type": "string",
+ "description": "The term text."
+ }
+ },
+ "required": [
+ "id",
+ "entryId",
+ "text"
+ ]
+ },
+ "termbase-import-response": {
+ "title": "Termbase Import Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier of the import operation."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the import operation. \n`queued` - The import passed the structural validation and it's waiting to be processed. \n`processing` - The import is in progress. \n`done` - The import was successfully processed and at least an entry changed its structure ( either inserted or modified ) \n`cancelled` - The import process was interrupted. \n`failed` - The import was unsuccessful. Either one of the import files is not compliant with the TBX structure or no entry changed during the import process. \n`error` - The import was unsuccessful due to an internal error.",
+ "enum": [
+ "queued",
+ "processing",
+ "done",
+ "cancelled",
+ "failed",
+ "error"
+ ]
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "termbase-poll-import-response": {
+ "title": "Termbase Poll Import Response",
+ "type": "object",
+ "description": "The termbase poll import response. \nThe import was successfully processed when the status is `done`.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier of the import operation."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the import operation. \n`queued` - The import passed the structural validation and it's waiting to be processed. \n`processing` - The import is in progress. \n`done` - The import was successfully processed and at least an entry changed its structure ( either inserted or modified ) \n`cancelled` - The import process was interrupted. \n`failed` - The import was unsuccessful. Either one of the import files is not compliant with the TBX structure or no entry changed during the import process. \n`error` - The import was unsuccessful due to an internal error.",
+ "enum": [
+ "queued",
+ "processing",
+ "done",
+ "cancelled",
+ "failed",
+ "error"
+ ]
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "termbase-import-history-response": {
+ "title": "Termbase Import History Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The termbase import identifier."
+ },
+ "fileName": {
+ "type": "string",
+ "description": "
default
The file name of the imported file.
",
+ "x-default-field": true
+ },
+ "fileSize": {
+ "type": "integer",
+ "description": "The file size of the imported file.",
+ "format": "int64"
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the import operation. \n`pending` - The import was just created and it's waiting for user input. \n`queued` - The import passed the structural validation and it's waiting to be processed. \n`processing` - The import is in progress. \n`done` - The import was successfully processed and at least an entry changed its structure ( either inserted or modified ) \n`cancelled` - The import process was interrupted. \n`failed` - The import was unsuccessful. Either one of the import files is not compliant with the TBX structure or no entry changed during the import process. \n`error` - The import was unsuccessful due to an internal error.",
+ "enum": [
+ "pending",
+ "queued",
+ "processing",
+ "done",
+ "cancelled",
+ "failed",
+ "error"
+ ]
+ },
+ "createdAt": {
+ "$ref": "#/components/schemas/date-time"
+ },
+ "elapsedTime": {
+ "type": "integer",
+ "description": "The last modified date of the import."
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "termbase-import-request": {
+ "type": "object",
+ "title": "Termbase Import Properties",
+ "description": "Properties required for system status mapping",
+ "properties": {
+ "statusMapping": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "jr1v619dgm5k8"
+ },
+ "items": {
+ "$ref": "#/components/schemas/termbase-system-status-mapping",
+ "x-stoplight": {
+ "id": "jjw6bvzbbc0eg"
+ }
+ }
+ }
+ }
+ },
+ "termbase-system-status-mapping": {
+ "title": "Termbase System Status Mapping",
+ "x-stoplight": {
+ "id": "3o7f2m7gb63yw"
+ },
+ "type": "object",
+ "description": "A mapping between a termbase term system status and termbase statuses.",
+ "required": [
+ "systemStatusValue",
+ "statuses"
+ ],
+ "properties": {
+ "systemStatusValue": {
+ "$ref": "#/components/schemas/termbase-entry-term-system-status-request",
+ "x-stoplight": {
+ "id": "kznc76h6wxicr"
+ }
+ },
+ "statuses": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "3isyr4742q3jg"
+ },
+ "minItems": 1,
+ "items": {
+ "x-stoplight": {
+ "id": "6lvylhb8t3n96"
+ },
+ "type": "string"
+ }
+ }
+ }
+ },
+ "tqa-profile": {
+ "title": "TQA Profile",
+ "type": "object",
+ "description": "As a project manager, you choose a TQA configuration and use it to automatically assess the quality of a translation document.\n\nThe TQA configuration specifies:\n - Categories and subcategories that reviewers will use to classify the translation issues in a document.\n - Severities to define custom metrics you want to use to assess translation quality.\n - Score to measure the importance of each category or subcategory of an issue.\n - Pass/Fail Threshold to define the maximum number of penalty points admitted before failing the translation document.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the TQA profile."
+ },
+ "name": {
+ "type": "string",
+ "description": "
",
+ "x-default-field": true
+ },
+ "translationUnits": {
+ "type": "integer",
+ "description": "The number of translation units for this language pair. Sum up all language pairs to get the total for the translation memory.",
+ "nullable": true
+ },
+ "unalignedTranslationUnits": {
+ "type": "integer",
+ "description": "The number of translation units that are unaligned for this language pair. Sum up all language pairs to get the total for the translation memory.",
+ "nullable": true
+ }
+ }
+ },
+ "translation-memory-import-request": {
+ "title": "Translation Memory Import Properties",
+ "type": "object",
+ "description": "Translation Memory Import properties sent as a JSON inside a text part.",
+ "properties": {
+ "sourceLanguageCode": {
+ "type": "string",
+ "description": "The code of the source language of the translation memory."
+ },
+ "targetLanguageCode": {
+ "type": "string",
+ "description": "The code of the target language of the translation memory."
+ },
+ "importAsPlainText": {
+ "description": "(Deprecated) The default value is set for this field, as this property is set internally.",
+ "type": "boolean",
+ "deprecated": true
+ },
+ "exportInvalidTranslationUnits": {
+ "type": "boolean",
+ "default": true
+ },
+ "triggerRecomputeStatistics": {
+ "description": "(Deprecated) The default value is set for this field, as this property is set internally.",
+ "type": "boolean",
+ "deprecated": true
+ },
+ "targetSegmentsDifferOption": {
+ "type": "string",
+ "description": "Option to specify how to handle translation units in the Translation Memory, if target segments differ.",
+ "enum": [
+ "addNew",
+ "overwrite",
+ "leaveUnchanged",
+ "keepMostRecent"
+ ],
+ "default": "addNew"
+ },
+ "unknownFieldsOption": {
+ "type": "string",
+ "description": "Option to specify how to handle translation units and unknown fields in the Translation Memory.",
+ "enum": [
+ "skipTranslationUnit",
+ "ignore",
+ "addToTranslationMemory",
+ "failTranslationUnitImport"
+ ],
+ "default": "addToTranslationMemory"
+ },
+ "onlyImportSegmentsWithConfirmationLevels": {
+ "description": "Only segments with the these confirmation levels will be imported. Default if the field is not set or null: [translated, approvedSignOff, approvedTranslation]. Empty array will be treated as not specified.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "translated",
+ "approvedTranslation",
+ "approvedSignOff",
+ "draft",
+ "rejectedTranslation",
+ "rejectedSignOff"
+ ]
+ }
+ }
+ },
+ "required": [
+ "sourceLanguageCode",
+ "targetLanguageCode"
+ ]
+ },
+ "translation-memory-import-response": {
+ "title": "Translation Memory Import Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier of the import operation."
+ },
+ "status": {
+ "type": "string",
+ "description": "(Deprecated) The status of the import operation.\n* `queued` - the import has been queued and is waiting to be processed\n* `inProgress` - the import is being processed\n* `failed` - the import has failed due to internal errors\n* `done` - the import has finished successfully\n* `cancelled` - the import has been interrupted",
+ "enum": [
+ "queued",
+ "inProgress",
+ "failed",
+ "done",
+ "cancelled"
+ ],
+ "deprecated": true
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "translation-memory-import-poll-response": {
+ "title": "Translation Memory Import Response",
+ "x-stoplight": {
+ "id": "f31ba8725474f"
+ },
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier of the import operation."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the import operation.\n* `queued` - the import has been queued and is waiting to be processed\n* `inProgress` - the import is being processed\n* `failed` - the import has failed due to internal errors\n* `done` - the import has finished successfully\n* `cancelled` - the import has been interrupted",
+ "enum": [
+ "queued",
+ "inProgress",
+ "failed",
+ "done",
+ "cancelled"
+ ]
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "translation-memory-import-history-response": {
+ "title": "Translation Memory Import History Response",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier of the import operation."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the import operation.\n* `queued` - the import has been queued\n* `inPorgress` - the import is being processed\n* `failed` - the import has failed\n* `done` - the import has finished successfully\n* `cancelled` - the import has been cancelled",
+ "enum": [
+ "queued",
+ "inProgress",
+ "failed",
+ "done",
+ "cancelled"
+ ]
+ },
+ "displayName": {
+ "type": "string",
+ "description": "The assigned name of the import operation."
+ },
+ "settings": {
+ "$ref": "#/components/schemas/translation-memory-import-settings"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The creation date of the import operation. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time",
+ "example": "2022-01-12T12:00:00.000Z",
+ "description": "The last update time of the import operation. UTC Timezone Allowed formats: \"YYYY-MM-DDThh:mmZ\" \"YYYY-MM-DDThh:mm:ssZ\" \"YYYY-MM-DDThh:mm:ss.sZ\" \"YYYY-MM-DDThh:mm:ss.ssZ\" \"YYYY-MM-DDThh:mm:ss.sss"
+ },
+ "ownerId": {
+ "type": "string",
+ "description": "Owner of the import operation, corresponds with the tenant identifier."
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "translation-memory-import-settings": {
+ "title": "Translation Memory Import Settings",
+ "type": "object",
+ "description": "The properties provided by the client, when the Import Operation was triggered.",
+ "properties": {
+ "onlyImportSegmentsWithConfirmationLevels": {
+ "description": "Only segments with the these confirmation levels were be imported.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "translated",
+ "approvedTranslation",
+ "approvedSignOff",
+ "draft",
+ "rejectedTranslation",
+ "rejectedSignOff"
+ ]
+ }
+ },
+ "unknownFieldsOption": {
+ "description": "This option describes how were the translation units handled when there were unknown fields in the request.",
+ "enum": [
+ "skipTranslationUnit",
+ "ignore",
+ "addToTranslationMemory",
+ "failTranslationUnitImport"
+ ],
+ "type": "string"
+ },
+ "targetSegmentsDifferOption": {
+ "description": "This option describes how were the translation units handled when there were differences in target segments.",
+ "enum": [
+ "addNew",
+ "overwrite",
+ "leaveUnchanged",
+ "keepMostRecent"
+ ],
+ "type": "string"
+ },
+ "importAsPlainText": {
+ "description": "(Deprecated) The default value is set for this field, as this property is set internally.",
+ "type": "boolean",
+ "deprecated": true
+ },
+ "exportInvalidTranslationUnits": {
+ "description": "This option describes if the invalid translation units were exported during the original translation memory import operation.",
+ "type": "boolean"
+ },
+ "triggerRecomputeStatistics": {
+ "description": "(Deprecated) The default value is set for this field, as this property is set internally.",
+ "type": "boolean",
+ "deprecated": true
+ },
+ "fileName": {
+ "description": "The name of the file attached to the import request.",
+ "type": "string"
+ },
+ "sourceLanguageCode": {
+ "description": "The source language code of the import request.",
+ "type": "string"
+ },
+ "targetLanguageCode": {
+ "description": "The target language code of the import request.",
+ "type": "string"
+ },
+ "traceId": {
+ "description": "(Deprecated) The field will be completly remove in the future. For compatibily, until it will be removed a default value it is set: 0000-0000-0000-0000.",
+ "type": "string",
+ "deprecated": true
+ }
+ },
+ "required": [
+ "onlyImportSegmentsWithConfirmationLevels",
+ "unknownFieldsOption",
+ "targetSegmentsDifferOption",
+ "importAsPlainText",
+ "exportInvalidTranslationUnits",
+ "triggerRecomputeStatistics",
+ "fileName",
+ "sourceLanguageCode",
+ "targetLanguageCode",
+ "traceId"
+ ]
+ },
+ "translation-memory-export-response": {
+ "title": "Translation Memory Export Response",
+ "x-stoplight": {
+ "id": "ol4kmgwlbdr8f"
+ },
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The translation memory export identifier."
+ },
+ "status": {
+ "type": "string",
+ "description": "(Deprecated) The status of the import operation.\n* `queued` - the import has been queued and is waiting to be processed\n* `inProgress` - the import is being processed\n* `failed` - the import has failed due to internal errors\n* `done` - the import has finished successfully\n* `cancelled` - the import has been interrupted",
+ "enum": [
+ "queued",
+ "inProgress",
+ "failed",
+ "done",
+ "cancelled"
+ ],
+ "deprecated": true
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "translation-memory-poll-export-response": {
+ "title": "Translation Memory Export Response",
+ "x-stoplight": {
+ "id": "h78jfifpf8rpa"
+ },
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The translation memory export identifier."
+ },
+ "status": {
+ "type": "string",
+ "description": "The translation memory export status.\n* `queued` - the export has been queued to be processed\n* `inProgress` - the export is being processed\n* `failed` - the export has failed due to internal errors\n* `done` - the export has finished successfully\n* `cancelled` - the export has been interrupted",
+ "enum": [
+ "queued",
+ "inProgress",
+ "failed",
+ "done",
+ "cancelled"
+ ]
+ }
+ },
+ "required": [
+ "id",
+ "status"
+ ]
+ },
+ "translation-memory-export-language-direction": {
+ "title": "Translation Memory Export Language Direction",
+ "x-stoplight": {
+ "id": "sgv1fy31ffmba"
+ },
+ "type": "object",
+ "description": "",
+ "properties": {
+ "sourceLanguage": {
+ "$ref": "#/components/schemas/source-language-request"
+ },
+ "targetLanguage": {
+ "$ref": "#/components/schemas/target-language-request"
+ }
+ },
+ "required": [
+ "sourceLanguage",
+ "targetLanguage"
+ ]
+ },
+ "translation-memory-export-request": {
+ "title": "Translation Memory Export Request",
+ "x-stoplight": {
+ "id": "ivlpf7ccfd3is"
+ },
+ "description": "",
+ "type": "object",
+ "properties": {
+ "languageDirection": {
+ "$ref": "#/components/schemas/translation-memory-export-language-direction"
+ }
+ },
+ "required": [
+ "languageDirection"
+ ]
+ },
+ "translation-service-type": {
+ "title": "Service Type",
+ "x-stoplight": {
+ "id": "qxo8dvfuhtpvn"
+ },
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "y8k58twki2cx2"
+ },
+ "description": "The Service Type identifier."
+ },
+ "name": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "at815peslzdx2"
+ },
+ "description": "
default
The Service Type name.
"
+ }
+ }
+ },
+ "update-translation-memory": {
+ "title": "Update Translation Memory",
+ "x-stoplight": {
+ "id": "7imfj2yp6ndh4"
+ },
+ "type": "object",
+ "properties": {
+ "settings": {
+ "$ref": "#/components/schemas/update-translation-memory-settings",
+ "description": "The configuration settings for Update Translation Memory\r\n.",
+ "x-default-field": true
+ }
+ },
+ "required": [
+ "settings"
+ ]
+ },
+ "update-translation-memory-settings": {
+ "title": "Update Translation Memory Settings",
+ "x-stoplight": {
+ "id": "ns9gqapkdazxv"
+ },
+ "type": "object",
+ "properties": {
+ "segmentsConfirmationLevels": {
+ "type": "array",
+ "x-stoplight": {
+ "id": "1sf7j3cudjzag"
+ },
+ "items": {
+ "x-stoplight": {
+ "id": "7tg40rat3gilo"
+ },
+ "type": "string",
+ "enum": [
+ "approvedTranslation",
+ "approvedSignOff",
+ "draft",
+ "notTranslated",
+ "translated",
+ "rejectedTranslation",
+ "rejectedSignOff"
+ ]
+ },
+ "description": "Default values are: \n\r [`translated`, `approvedTranslation`, `approvedSignOff`]."
+ },
+ "targetSegmentsDifferOption": {
+ "type": "string",
+ "x-stoplight": {
+ "id": "2ndpsnxl5k5qq"
+ },
+ "enum": [
+ "addNew",
+ "overwrite",
+ "keepMostRecent",
+ "leaveUnchanged",
+ "merge"
+ ],
+ "description": "Options:\r\n- `merge`: replace (update) only the TU (from which a match was retrieved for the edited TU) with the latest available translation AND keep the other duplicates as they are. Use this option to have multiple translations for the same source together with Multiple Translation Penalty = 0.\r\n- `addNew`: add translations as new TUs to the TM. Specify the status of the TUs (which will be added) under Segment status. This means that the existing TUs in the TM are not overwritten.\r\n- `overwriteExisting`: delete all TUs (which have the same source, all TU duplicates) and keep only the last added TU (the latest available translation). Use this option to prevent inconsistent translations.\r\n- `leaveUnchanged`: keep the existing TUs and do not add any new ones.\r\n- `keepMostRecent`: replace (update) only the most recent TU (from which a match was retrieved for the edited TU) with the latest available translation AND delete all other duplicates.\r\n",
+ "default": "merge"
+ }
+ },
+ "required": [
+ "segmentsConfirmationLevels",
+ "targetSegmentsDifferOption"
+ ]
+ },
+ "user": {
+ "title": "User",
+ "type": "object",
+ "description": "User in the account.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "User account identifier."
+ },
+ "email": {
+ "type": "string",
+ "description": "
default
The user's email address. Retrieved only for RWS ID (formerly SDL ID) users (not service users) that the authenticated entity is authorized to read.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/articles/LCPublicAPI/docs/API-rate-limits.md b/articles/LCPublicAPI/docs/API-rate-limits.md
new file mode 100644
index 0000000..c38cace
--- /dev/null
+++ b/articles/LCPublicAPI/docs/API-rate-limits.md
@@ -0,0 +1,89 @@
+# API rate limits
+
+Trados Cloud Platform API enforces rate limits to prevent overuse and spikes of requests that could degrade the platform performance.
+
+The default limits are chosen as to cover the needs of most integrators, but there might be cases when these limits are insufficient. In this case you should contact support for help in increasing your account limits.
+
+
+## Default Trados Cloud Platform API Rate Limits
+> Note: Please remember our current limits and that they are subject to change without notice. You must always rely on response headers and never hardcode any limit values.
+
+>Note: Daily limits are calculated in a fixed time window, that is reset nightly at 00:00 UTC.
+
+Each tenant is entitled to:
+
+1. Up to 10 API requests per second.
+2. Up to 200 API requests per minute.
+3. Up to 200 000 API requests per day.
+
+#### Projects Rate Limits
+For [Create Project Operation](../api/Public-API.v1-fv.html#/operations/CreateProject):
+
+each tenant is entitled to:
+1. Up to 2 API requests per second.
+2. Up to 10 API requests per minute.
+3. Up to 500 API requests per day.
+
+#### Export Quote Rate Limits
+For [Export Quote Report](../api/Public-API.v1-fv.html#/operations/ExportQuoteReport):
+
+each tenant is entitled to:
+1. Up to 2 API requests per second.
+2. Up to 10 API requests per minute.
+3. Up to 1000 API requests per day.
+
+#### Import / Export Translation Memory limits:
+1. Up to 2 API requests per second.
+2. Up to 10 API requests per minute.
+3. Up to 2000 API requests per day.
+
+#### Project Files Rate Limits
+For each of the API operations listed below:
+
+- [Add Source File](../api/Public-API.v1-fv.html#/operations/AddSourceFile)
+- [Download Source File Version](../api/Public-API.v1-fv.html#/operations/DownloadSourceFileVersion)
+- [Download Exported Target File Version](../api/Public-API.v1-fv.html#/operations/DownloadExportedTargetFileVersion)
+- [Download Target File Version](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion)
+- [Add Source File Version](../api/Public-API.v1-fv.html#/operations/AddSourceFileVersion)
+- [Add Target File Version](../api/Public-API.v1-fv.html#/operations/AddTargetFileVersion)
+- [Import Target File Version](../api/Public-API.v1-fv.html#/operations/ImportTargetFileVersion)
+
+each tenant is entitled to:
+1. Up to 5 API requests per second.
+2. Up to 200 API requests per minute.
+3. Up to 5000 API requests per day.
+
+
+
+#### Rate Limit verification endpoint
+Individual rate limits can be consulted below:
+
+- [List Rate Limits](../api/Public-API.v1-fv.html#/operations/ListRateLimits)
+
+## Rejection response
+
+In case a request is blocked or rejected the following details are sent to the Client:
+
+Error Response Status Code: **TOO_MANY_REQUESTS** (429, "Too Many Requests"). Example of a response message:
+```json
+{
+ "errorCode": "TOO_MANY_REQUESTS_EXCEPTION",
+ "message": "Quota exceeded. Please check X-RateLimit-Reset response header",
+ "details": []
+}
+```
+
+Response headers can provide more details:
+- `X-RateLimit-Limit`: the limit that was exceeded. For example, the value "2" represents the available quota. It does not provide the type of limit that has been exceeded, for those details the `X-RateLimit-Reset` and `X-RateLimit-Policy` should be used (for deciding when to retry the call).
+- `X-RateLimit-Reset`: the exact moment in time when the Client can resume activity. This is datetime in RFC-1123 format, for example: "Tue, 3 Jun 2008 11:05:30 GMT".
+- `X-RateLimit-Remaining`: the value is always "0". This is reserved for future enhancements.
+- `X-RateLimit-Policy`: the name of the Rate Limit policy that was violated, made up by the operation and the time interval. Please see also the [List Rate Limits](../api/Public-API.v1-fv.html#/operations/ListRateLimits).
+
+## Implementation recommendations
+
+Unless it's a time-critical scenario, don't make requests in parallel. It is better to keep all the requests in sequence.
+
+It's important to handle responses with the HTTP Status 429. There are multiple approaches to handle it and a simple strategy would be:
+1. Expect the HTTP code (429)
+2. Block all the requests, and wait until `X-RateLimit-Reset`
+3. Try again.
diff --git a/articles/LCPublicAPI/docs/Authentication.md b/articles/LCPublicAPI/docs/Authentication.md
new file mode 100644
index 0000000..2012524
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Authentication.md
@@ -0,0 +1,77 @@
+# Authentication
+
+We recommend using the provided [Postman Collection](../docs/Language-Cloud-APIs-for-Postman.md) to get started.
+
+## Base API URL
+The base API address is **`https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/`**.
+> Check the [Multi-Region](../docs/Multi-region.md) page for regional API details.
+
+## Authorization headers
+When making any call to the Trados Cloud Platform API, make sure you provide the following `Header` information:
+- `Authorization` = access token
+- `X-LC-Tenant` = tenant ID
+
+Also note that the `Authorization` header should use the Bearer schema, for example:
+```
+Authorization: Bearer {{token}}
+```
+
+
+## How do I find the tenant ID?
+
+A service user can be part of only one account. If you're not sure what the tenant ID is for a service user, you can:
+
+1. Log in to the Trados UI, and make sure to select the same account where the service user was created.
+2. In the top right-hand corner, select your profile, and then select **Manage Account**.
+3. In the **Account Information** tab, check the value for **Trados Account ID**.
+
+> Note: There are 2 identifiers that might be confused. The identifier you need looks something like this: **2ef3c10e74fc39104e633c11**.
+
+
+## Generating the Bearer Token
+
+For generating the token, Trados Cloud Platform API uses the Auth0 authorization server (`https://sdl-prod.eu.auth0.com/oauth/token`) and the [client credentials flow](https://auth0.com/docs/flows/client-credentials-flow).
+
+The request to Auth0 can be done using JSON or URL Form Encoded. There is no difference between them, so you can choose whichever best suits you in terms of code. Here are some example payloads for both approaches:
+
+`POST` to `https://sdl-prod.eu.auth0.com/oauth/token` with `Content-Type: application/json`:
+```
+{
+ "client_id": "{{the client ID for the application}}",
+ "client_secret": "{{the Client Secret for the application}}",
+ "grant_type": "client_credentials",
+ "audience":"https://api.sdl.com"
+}
+```
+Alternatively, you can `POST` to `https://sdl-prod.eu.auth0.com/oauth/token` with `Content-Type: application/x-www-form-urlencoded`:
+
+```json
+client_id={{the Client ID for the application}}&client_secret={{the Client Secret for the application}}&grant_type=client_credentials&audience=https://api.sdl.com
+```
+
+
+The response will be a JSON that contains the token, for example:
+```json
+{
+ "access_token": "eyJhbGciO....4NXz8TXatw",
+ "expires_in": 86400,
+ "token_type": "Bearer"
+}
+```
+The token is provided in the `access_token` property. This is then used to make authenticated calls to the Trados Cloud Platform API by using the Authorization header, and the X-LC-Tenant header:
+```json
+Authorization: Bearer {{access_token}}
+X-LC-Tenant: {{tenantId}}
+```
+
+
+## Token management
+
+The previous example of an Auth0 response body that contains the `access_token`, also contains an expiry value `"expires_in": 86400`. That property informs the service of how long the token is valid for. An application should use this value to cache the token for that duration minus a few minutes (to avoid clock drift issues).
+
+The application is responsible for getting a fresh token once the token is about to expire, by using the same mechanism described above.
+
+> Note: while it's technically possible to get a fresh token for every single call, there is no reason to do so, and the calling application IP risks to be blocked by Auth0 as it might consider it a DoS attack.
+
+
+> Please limit the number of requests for the Bearer token to a maximum of 16 per day. It's acceptable to exceed this limit only if you need to deploy multiple versions of your application, in a single day.
diff --git a/articles/LCPublicAPI/docs/Basic-project-creation-flow.md b/articles/LCPublicAPI/docs/Basic-project-creation-flow.md
new file mode 100644
index 0000000..a75aa1b
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Basic-project-creation-flow.md
@@ -0,0 +1,381 @@
+# Basic project creation flow
+
+Please read carefully about [authentication and prerequisites](../docs/Authentication.md) , and take into consideration that some steps might be done by Trados engineering.
+
+Details about what are the rate limits for Trados Cloud Platform API can be found on [API rate limits](../docs/API-rate-limits.md) page.
+
+Additional information regarding file and project size limits can be found [here](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit).
+
+> This small [Postman collection](https://raw.githubusercontent.com/RWS/language-cloud-public-api-postman/develop/basicProjectCreationFlow.json) can help you get started with the basic project creation flow. For details on Postman setup please see the main [Postman](../docs/Language-Cloud-APIs-for-Postman.md) page.
+>
+> In the [Create Project](../api/Public-API.v1-fv.html#/operations/CreateProject) endpoint body, the `projectTemplate` value should be replaced with a valid `templateId`. From that point on all the necessary identifiers will be automatically populated throughout Postman.
+>
+> Check the [Multi-Region](../docs/Multi-region.md) page for regional API details.
+
+Steps to create a basic translation project:
+1. Create Project
+2. Add project source file
+3. Start Project
+4. List Project's Tasks
+5. List Project Target Files
+6. Download File
+7. Complete Project
+8. List Projects
+
+### 1. Create Project
+Creates a new project.
+
+Endpoint: [`POST /projects`](../api/Public-API.v1-fv.html#/operations/CreateProject)
+
+For running this endpoint you need to supply the required project details (body tab in Postman):
+> `POST` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects
+```json
+{
+ "name": "Name of the Project",
+ "description": "Test Project",
+ "dueBy": "2021-09-04T08:14:05.858Z",
+ "projectTemplate": {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx" // Provided by RWS
+ },
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-US"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR"
+ }
+ }
+ ]
+}
+```
+
+Source and Target Language Codes can be obtained from [here](../api/Public-API.v1-fv.html#/operations/ListLanguages).
+
+The API should respond with:
+- HTTP Status Code: 201 Created.
+- Body – your project details consisting of `projectId`, `project name`, `language direction`, `location` and other optional fields.
+
+Example:
+```json
+{
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx", // The project identifier.
+ "name": "Name of the Project",
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-US",
+ "englishName": "English (United States)"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR",
+ "englishName": "French (France)"
+ }
+ }
+ ],
+ "location": {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx",
+ "name": "Project Location"
+ }
+}
+```
+
+
+
+
+
+
+
+#### Scenario:
+If your company has multiple divisions, you can imagine a hierarchy like this:
+
+**YOUR COMPANY**
+- **Marketing Division**
+- **Management Division**
+- **HR Division**
+
+If you want to create projects for different divisions, this can be done by using the `location` parameter, which will be added in the body. When location is not set, the system will try to create the resource in the higher folder in the hierarchy, the Root folder. It might not have access to that folder and the request will fail with forbidden error.
+
+```json
+{
+ "name": "Name of the Project",
+ "description": "Test Project",
+ "dueBy": "2021-09-04T08:14:05.858Z",
+ "projectTemplate": {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx" // Provided by RWS
+ },
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-US"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR"
+ }
+ }
+ ],
+ "location": "xxxxxxxxxxxxxxxxxxxxxxxx" // Provided by RWS
+}
+```
+
+Using this request your project will be created in the specified Division and it will be visible only there.
+
+Detailed information about location and folders can be found on the [How to use location and folders](../docs/How-to-use-location-and-folders.md) page.
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/CreateProject).
+
+### 2. Add Source File
+
+Adds a source file to the project.
+
+Endpoint: [`POST /projects/{projectId}/source-files`](../api/Public-API.v1-fv.html#/operations/AddSourceFile)
+
+For running this endpoint you need to:
+- Replace `{projectId}` from the URL with the identifier received from the Create Project endpoint response:
+> `POST` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects/{projectId}/source-files
+- Add the file to the request body.
+- Complete the details from Body tab - Properties field.
+```json
+Properties field:
+{
+ "language": "en-US",
+ "type": "native",
+ "role": "translatable",
+ "name": "nameOfTheFile.extension"
+}
+```
+
+Responses:
+- HTTP Code 201 Created.
+- Body – a list with the identifier, name and role of the file.
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/AddSourceFile).
+
+### 3. Start Project
+
+Starts a project.
+
+Endpoint: [`PUT /projects/{projectId}/start`](../api/Public-API.v1-fv.html#/operations/StartProject)
+
+For running this endpoint you need to:
+- Replace `{projectId}` from the URL with the identifier received from the Create Project endpoint response:
+> `PUT` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects/{projectId}/start
+
+Responses:
+- HTTP Code 202 Accepted
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/StartProject).
+
+### 4. List Project's Tasks
+
+List the tasks of a specific project. If all the tasks have the status `completed`, all the files are translated.
+
+Endpoint: [`GET /projects/{projectId}/tasks`](../api/Public-API.v1-fv.html#/operations/ListProjectTasks)
+
+For running this endpoint you need to:
+- Replace `{projectId}` from the URL with the identifier received from the Create Project endpoint response:
+> `GET` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects/{projectId}/tasks?fields=taskType,status
+
+Use `?fields=taskType` if you want to observe the task name.
+
+Responses:
+- HTTP Code 200 Ok.
+- Body – a list with task identifier and status.
+
+Example:
+```json
+{
+ "items": [
+ {
+ "id": "613f621fe5ed2804ba31870e",
+ "status": "completed",
+ "taskType": {
+ "id": "607932f25c7cc701241f0f60",
+ "key": "scan",
+ "name": "File Type Detection"
+ }
+ },
+ {
+ "id": "613f623040d9943308ef7c3b",
+ "status": "completed",
+ "taskType": {
+ "id": "607932f3ce8af15851b70205",
+ "key": "convert",
+ "name": "File Format Conversion"
+ }
+ },
+ ...
+ ],
+ "itemCount": 11
+}
+```
+
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/ListProjectTasks).
+
+### 5. List Project Target Files
+
+Retrieves the target `fileId` for a project and the latest version for the translated file.
+
+Endpoint: [`GET /projects/{projectId}/target-files`](../api/Public-API.v1-fv.html#/operations/ListTargetFiles)
+
+For running this endpoint you need to:
+- Replace `{projectId}` from the URL with the identifier received from the Create Project endpoint response:
+> `GET` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects/{projectId}/target-files?fields=latestVersion
+
+Responses:
+- HTTP Code 200 Ok.
+- Body – a list with objects that contain:
+ - source file and target file identifiers
+ - source and target languages
+
+Example:
+```json
+{
+ "items": [
+ {
+ "id": "613f623ae5ed2804ba318a40", // This is the target file identifier.
+ "latestVersion": {
+ "id": "613f628540d9943308ef8497", // This is the file version identifier.
+ "type": "native"
+ }
+ },
+ {
+ "id": "613f623ae5ed2804ba318a43",
+ "latestVersion": {
+ "id": "613f628a40d9943308ef84cd",
+ "type": "native"
+ }
+ }
+ ],
+ "itemCount": 2
+}
+```
+
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/ListTargetFiles).
+
+### 6. Download File
+
+Downloads the translated file.
+
+Endpoint: [`GET /projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/download`](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion)
+
+For running this endpoint you need to:
+- Replace `{projectId}` from the URL with the identifier received from the Create Project endpoint response
+- Replace `{targetFileId}` from the URL with the identifier received from the List Project Target Files endpoint response
+- Replace `{fileVersionId}` from the URL with the identifier received from the List Project Target Files endpoint response
+
+> `GET` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/download
+
+Responses:
+- HTTP Code 200 OK.
+- Body – the translated file. The file can be also saved from Save Response option.
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion).
+
+
+### 7. Complete Project
+
+Marks a project as `completed`.
+
+Endpoint: [`PUT /projects/{projectId}/complete`](../api/Public-API.v1-fv.html#/operations/CompleteProject)
+
+For running this endpoint you need to:
+- Replace `{projectId}` from the URL with the identifier received from the Create Project endpoint response
+> `PUT` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects/{projectId}/complete
+
+Responses:
+- HTTP Code 204 No Content.
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/CompleteProject).
+
+### 8. List Projects
+
+Retrieves a list of all the projects in the account.
+
+Endpoint: [`GET /projects`](../api/Public-API.v1-fv.html#/operations/ListProjects)
+
+For running this endpoint make a request to:
+> `GET` https://api.{REGION_CODE}.cloud.trados.com/public-api/v1/projects
+
+Responses:
+- HTTP Code 200 OK.
+- Body – a list of projects with details consisting of project identifier, project name, language direction, location and other optional fields
+
+Example:
+```json
+{
+ "items": [
+ {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx",
+ "name": "Translation Project 1",
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-US",
+ "englishName": "English (United States)"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR",
+ "englishName": "French (France)"
+ }
+ }
+ ],
+ "location": {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx",
+ "name": "Project Location"
+ }
+ },
+ {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx",
+ "name": "Translation Project 2",
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-US",
+ "englishName": "English (United States)"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR",
+ "englishName": "French (France)"
+ }
+ }
+ ],
+ "location": {
+ "id": "xxxxxxxxxxxxxxxxxxxxxxxx",
+ "name": "Project Location"
+ }
+ }
+ ],
+ "itemCount": 2
+}
+```
+
+
+
+
+
+
+More details about this endpoint can be found [here](../api/Public-API.v1-fv.html#/operations/ListProjects).
diff --git a/articles/LCPublicAPI/docs/Create-projects.md b/articles/LCPublicAPI/docs/Create-projects.md
new file mode 100644
index 0000000..2ef44cd
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Create-projects.md
@@ -0,0 +1,103 @@
+# Create projects
+To create a project, you need to specify the following resources:
+- A translation engine: determines which translation memories, MT engines and termbases should be used in the project
+- A file processing configuration: determines which translatable file types this project should support, and the specific configuration of those file types
+- A pricing model: the set of rules based on which the project quote is calculated
+- A workflow: the sequence of steps the project goes through from inception to completion and the assignees for each step
+
+Instead of specifying every resource separately, you can also specify a project template, which brings together all the elements needed during project creation: a translation engine, a file processing configuration, a pricing model, and a workflow.
+
+You must define your project resources before you start creating your project. This API version does not allow any `POST` requests to create project resources. Your project resources must be created from the Trados UI beforehand.
+
+## Create projects from scratch
+You can create projects from scratch, which means that you must add all the project resources (all their identifiers) above to your project, one by one.
+
+You cannot specify custom fields and project settings directly via the Trados Cloud Platform API. These can only be configured within a project template from the Trados UI. Therefore, if you want to include custom fields and project settings in your project, you must create projects from a project template which is already configured in the Trados UI.
+
+### 1. Decide which project resources you want to use.
+
+Make a `GET` request to the following resource endpoints and identify the identifiers of the resources you want to include in your project:
+- [`/translation-engine`](../api/Public-API.v1-fv.html#/operations/ListTranslationEngines) *required*
+- [`/file-processing-configuration`](../api/Public-API.v1-fv.html#/operations/ListFileProcessingConfigurations) *required*
+- [`/workflow`](../api/Public-API.v1-fv.html#/operations/ListWorkflows) *required*
+- [`/pricing-model`](../api/Public-API.v1-fv.html#/operations/ListPricingModels) *optional*
+- [`/custom-field-definitions`](../api/Public-API.v1-fv.html#/operations/ListCustomFields) *optional*
+
+
+### 2. Decide which language pairs (source – target) you want to use.
+
+Make a `GET` request to the [`/languages`](../api/Public-API.v1-fv.html#/operations/ListLanguages) endpoint and identify the `languageCode` parameter values.
+
+### 3. Decide where you want to save your project.
+
+When you create your project, you must save it in a location (or customer folder). You will need the `locationId` of that customer folder. To retrieve the `locationId` of a given customer folder, make a `GET` request to the [`/customers/{customerId}`](../api/Public-API.v1-fv.html#/operations/GetCustomer) endpoint and check the `locationId` value in the response. If you do not specify a location, the project will be created in the Root folder.
+
+### 4. Create your project.
+
+Make a `POST` request to the [`/projects`](../api/Public-API.v1-fv.html#/operations/CreateProject) endpoint. You must provide identifiers for all the **required** resources: translation engine, file processing configuration and workflow.
+
+Each resource object has a `strategy` parameter you must specify in the request body. The strategy parameter has 2 available values: `copy` and `use`. Trados recommends that you choose the `copy` value, which means that you include a copy (clone) of your resource in the project. If you choose the `use` value, then the actual resource is included in your project.
+
+> Issues may arise when `strategy=use` because you have no control over how the resource is updated from the other places where it is being used.
+
+Make sure that you remember the value of the project `id` parameter in the response. You will need it for tracking your project, interacting with tasks, and completing projects.
+
+### 5. Add your project files.
+
+Make a `POST` request to the [`/projects/{projectId}/source-files`](../api/Public-API.v1-fv.html#/operations/AddSourceFile) endpoint. You can add both translatable files and reference files (by specifying the `role` property), and various file formats (by specifying the `type` property – native/bcm/sdxliff). You must provide the language of your source file, and, optionally, the values of the `targetLanguages` and `path` elements.
+
+### 5.1 Perfect Match (optional)
+At this point you can make use of the [PerfectMatch](../api/Public-API.v1-fv.html#/operations/CreatePerfectMatchMapping) feature. You can read more about it [here](https://docs.rws.com/791595/1155478/trados-enterprise---accelerate/perfectmatch-general-information).
+
+### 6. Start your project.
+
+Make a `PUT` request to the [`/projects/{projectId}/start`](../api/Public-API.v1-fv.html#/operations/StartProject) endpoint.
+
+
+## Create projects based on a template
+You can create projects based on a project template already configured from the Trados UI, which means that you must only add a project template (its identifier) to your project. All the resources in your project template are automatically included in your project.
+
+### 1. Decide which project template you want to use.
+
+Make a `GET` request to the [`/project-templates`](../api/Public-API.v1-fv.html#/operations/ListProjectTemplates) endpoint. Remember the project template `id` parameter in the response.
+
+### 2. Decide which language pairs (source – target) you want to use.
+
+A project template may include more languages than you need. If this is the case, you can keep only the languages of interest. Make a `GET` request to the [`/languages`](../api/Public-API.v1-fv.html#/operations/ListLanguages) endpoint and identify the `languageCode` parameter values.
+
+### 3. Decide where you want to save your project.
+
+A project template is saved in a location or a customer folder. Most of the times, when you create your project, you want to save it in the same location (customer folder) as the project template it is based on. You will need the `locationId` of that customer folder. To retrieve the `locationId` of a given customer folder, make a `GET` request to the [`/customers/{customerId}`](../api/Public-API.v1-fv.html#/operations/GetCustomer) endpoint and check the `locationId` value in the response.
+
+### 4. Create your project.
+
+Make a `POST` request to the [`/projects`](../api/Public-API.v1-fv.html#/operations/CreateProject) endpoint. Provide the project template `id` and the location `id`.
+
+Make sure that you remember the value of the project `id` parameter in the response. You will need it for tracking your project, interacting with tasks, and completing projects.
+
+### 5. Add your project files
+
+Make a `POST` request to the [`/projects/{projectId}/source-files`](../api/Public-API.v1-fv.html#/operations/AddSourceFile) endpoint. You can add both translatable files and reference files (by specifying the `role` property), and various file formats (by specifying the `type` property – native/bcm/sdxliff). You must provide the language of your source file, and, optionally, the values of the `targetLanguages` and `path` elements.
+
+### 5.1 Perfect Match (optional)
+At this point you can make use of the [PerfectMatch](../api/Public-API.v1-fv.html#/operations/CreatePerfectMatchMapping) feature. You can read more about it [here](https://docs.rws.com/791595/1155478/trados-enterprise---accelerate/perfectmatch-general-information).
+
+### 6. Start your project.
+
+Make a `PUT` request to the [`/projects/{projectId}/start`](../api/Public-API.v1-fv.html#/operations/StartProject) endpoint.
+
+## Restrict file downloads for a project
+To restrict file downloads for certain roles, you may create a project as usual and choose to:
+
+#### Use a project template that has the restriction enabled
+or
+#### Create a project from scratch
+Create the project as usual, but specify an additional boolean field named `forceOnline` in the project creation request:
+```json
+{
+ "name": "Restricted Project Name",
+ "description": "Restricted Project Description",
+ ...,
+ "forceOnline": true
+}
+```
diff --git a/articles/LCPublicAPI/docs/Custom-Fields.md b/articles/LCPublicAPI/docs/Custom-Fields.md
new file mode 100644
index 0000000..354eade
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Custom-Fields.md
@@ -0,0 +1,172 @@
+# Custom fields
+
+Custom Fields allow associating custom data with a project. Custom Fields can be defined in the UI, and then listed and accessed using the List and Get endpoints. The Custom Field values are retrieved through the Project endpoints.
+
+## Custom Field Definitions
+
+To list the available Custom Field Definitions make a `GET` request to the [`/custom-field-definitions`](../api/Public-API.v1-fv.html#/operations/ListCustomFields) endpoint. The response contains: the Custom Fields total count, and by default, the `id` and the `name` for each Custom Field. By specifying the `fields` query parameter, the other properties of these entities can be retrieved.
+
+
+
+To get a particular Custom Field Definition make a `GET` request to the [`/custom-field-definitions/{customFieldDefinitionId}`](../api/Public-API.v1-fv.html#/operations/GetCustomField) endpoint, and specify the `customFieldDefinitionId` path parameter.
+The default fields for custom field are `id` and `name`, but the other fields can be seen by specifying them into `fields` query param. For example: `id,key,description,type,defaultValue`
+
+
+
+A default value can be specified on the Custom Field Definition, which will be applied to a project if no other value is specified when creating the project.
+
+## Custom fields in Projects
+
+At project level, Custom Fields can be set either when creating a project or when updating one. Moreover, custom fields are exposed when users search for a project or list all projects.
+
+**Creating projects with Custom Fields**
+
+To create or update a project with Custom Fields, follow the instructions for creating/updating projects, but also populate the `customFields` property in the request payload.
+
+The `key` property is mandatory and must be specified for each Custom Field. Its value, however, is optional and the Custom Field Definition might contain a default value that will be applied if not otherwise specified. If the value doesn't correspond to the type of Custom Field selected, a validation message with a Bad Request status will be returned in the response. The value type can be checked in the Custom Field Definition in the `type` field, for ex: `DATE`, `STRING`, `PICKLIST`.
+
+When creating a project using a template, Custom Fields that are marked with `isMandatory: true` must be included in the create request and values set, if a default value is not specified.
+
+The following is an example for creating a project body with valid Custom Fields:
+
+***Request***:
+
+```json
+...
+{
+ "name": "API project with valid custom fields",
+ "projectTemplate": {
+ "id": "60c1f06d1d8ff66537d674c3"
+ },
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-gb"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-be"
+ }
+ }
+ ],
+ "location": "d1d6bd4e2ec14ab99e2ec41682553ac0",
+ "customFields": [
+ {
+ "key": "Custom_Field_Boolean_ps0xw",
+ "value": true
+ },
+ {
+ "key": "Custom_Field_Long_Text_qq4olq",
+ "value": "Test custom field"
+ }
+ ]
+}
+...
+```
+
+***Response***:
+
+```json
+...
+{
+ "id": "60fa9b729011f339266a2e3b",
+ "name": "API project with valid custom fields",
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-GB",
+ "englishName": "English (United Kingdom)"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-BE",
+ "englishName": "French (Belgium)"
+ }
+ }
+ ],
+ "location": {
+ "id": "d1d6bd4e2ec14ab99e2ec41682553ac0",
+ "name": "RWS"
+ },
+ "customFields": [
+ {
+ "id": "60c3539b06e09d00019c0a2d"
+ },
+ {
+ "id": "60c353ec06e09d00019c0a2f"
+ }
+ ]
+}
+...
+```
+
+
+
+An example for creating a project with an invalid value set for a custom field:
+
+***Request***:
+
+```json
+...
+{
+ "name": "API project with invalid custom fields",
+ "projectTemplate": {
+ "id": "60c1f06d1d8ff66537d674c3"
+ },
+ "languageDirections": [
+ {
+ "sourceLanguage": {
+ "languageCode": "en-gb"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-be"
+ }
+ }
+ ],
+ "location": "d1d6bd4e2ec14ab99e2ec41682553ac0",
+ "customFields": [
+ {
+ "key": "Custom_Field_Boolean_ps0xw",
+ "value": "Test custom field" //invalid value
+ }
+ ]
+}
+...
+```
+
+***Response***:
+This will have an HTTP code 400 Bad Request
+
+```json
+...
+{
+ "message": "Invalid input on create project.",
+ "errorCode": "invalidInput",
+ "details": [
+ {
+ "name": "project.customFields[0]",
+ "code": "invalidInput",
+ "value": "Test custom field"
+ }
+ ]
+}
+...
+```
+
+**Updating projects with Custom Fields**
+
+To update the Custom Fields of a project make a `PUT` request to the [`/projects/{projectId}`](../api/Public-API.v1-fv.html#/operations/UpdateProject) endpoint. Specify new values for the Custom Fields that need updating.
+
+
+
+**Getting Custom Fields for projects**
+
+To get the Custom Fields for a project, make a `GET` request to the [`/projects/{projectId}`](../api/Public-API.v1-fv.html#/operations/GetProject) endpoint and request the desired fields in the `fields` query parameters: `customFields.id,customFields.key,customFields.value`. Similarly, this can be done when making a `GET` request to the [`/projects`](../api/Public-API.v1-fv.html#/operations/ListProjects) endpoint.
+
+
+
+## Custom Fields in Project Templates
+
+Custom Fields can be defined in Project Templates. `isMandatory` on a Custom Field indicates that it must be populated when a project is created with that template.
+
+To get the Custom Fields for a project template, make a `GET` request to the [`/project-templates/{projectTemplateId}`](../api/Public-API.v1-fv.html#/operations/GetProjectTemplate) endpoint or a `GET` request to the [`/project-templates`](../api/Public-API.v1-fv.html#/operations/ListProjectTemplates) endpoint and specify the desired fields in the `fields` query parameters: `customFields.id,customFields.key,customFields.value`.
+
+
diff --git a/articles/LCPublicAPI/docs/Developing-Language-Cloud-Add-Ons.md b/articles/LCPublicAPI/docs/Developing-Language-Cloud-Add-Ons.md
new file mode 100644
index 0000000..9d3d92b
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Developing-Language-Cloud-Add-Ons.md
@@ -0,0 +1,166 @@
+TODO: Needs removing
+
+# Developing Trados Cloud Platform Add-Ons
+
+## Design Notes
+The developer can choose any development environment, programming language or hosting options, as long as the required set of APIs are implemented according to specification. Blueprints and samples, for getting to speed, are provided.
+
+When using the provided blueprint - either Java or .Net, some concerns will be already covered in the blueprint, like:
+
+- logging
+- health check
+- authorization
+- default handling of account and add-on lifecycle events
+- Sample Dockerfile for containerizing the application
+
+## Terminology
+The 3 big concepts that need to be clearly separated:
+
+- **Add-On** - a REST API service implementing the API for Language Cloud Add-Ons
+- **Extension Point** - a functionality from RWS Language Cloud that can be implemented by Add-On Services
+- **Extension** - a new functionality for a given Extension Point, provided by an Add-On Service. An Add-On Service can implement multiple extensions for the same Extension Point, ex. offer 3 translation engines for the MT extension point.
+
+
+Add-On Descriptor
+The Add-On Descriptor is a JSON formatted document that describes an Add-On. The Stoplight documentation can be found at https://language-cloud-public-api-proposal.docs.stoplight.io/lc/api-docs/extensibility-api/models/addondescriptor. Fields are documented to explain their usage.
+
+The less documented feature is how to define extension endpoints. This is done under the configuration → endpoints element of an extension (in extensions). The path for each endpoint is defined for the property which is the name in the stoplight for that endpoint. Ex:
+
+
+
+ "configuration":{
+ "endpoints":{
+ "sdl.lc.extensionpoint.machinetranslationprovider.translate":"/translate",
+ "sdl.lc.extensionpoint.machinetranslationprovider.engines":"/translation-engines"
+ }
+ }
+
+**baseUrl** property in the descriptor sets the base path for all endpoints defined. All other URLs are relative to this.
+
+The descriptor should be accessible at an URL that starts with baseUrl, as it will be called on at scheduled intervals to check for updates.
+
+## Endpoints
+When thinking about the endpoints that need to be implemented by the Add-On service, they are split into two:
+
+- Standard endpoints
+- Extension endpoints
+
+**Standard endpoints** are required to be implemented by all Add-On Services. These are operations that will be called on by the Add-On Management Service. Not all of them are required but it's recommended to provide them. Check in the Stoplight which are required (can be found in the documentation for the AddOnDescriptor model).
+
+**Extension endpoints** are implemented depending on the Extension Points supported by the Service.
+
+The list of standard endpoints and Extension endpoints (grouped by extension) can be found in [Stoplight](https://language-cloud-public-api-proposal.docs.stoplight.io/lc/api-docs/extensibility-api/).
+
+
+
+In the previous image, which captures the endpoints for an Add-On from the Stoplight, are visible the list of standard endpoints, as well as the two endpoints under the "Machine Translation Provider" Extension Point. If the Add-On service is providing an Extension for that Extension Point, it must implement both endpoints (Translate and Get Translation Engines).
+
+The path for each extension endpoint is described in the Stoplight content and has the format of a namespace. Please see Stoplight for more details on each Extension Point.
+
+## Add-On Lifecycle
+This section attempts to explain what is the order of the endpoints that should be expected to be invoked in the lifecycle of the Add-On Service.
+
+An ordinary Add-On registration and activation lifecycle should look like that:
+
+
+
+- **GET /descriptor** is the very first endpoint that will be executed when the add-on owner tries to register it in Language Cloud.
+- **POST /addon-lifecycle** will be the next in order, with an identifier of "REGISTER", meaning that the Add-On has been registered. From that moment on, administrators can activate the Add-On on their accounts.
+- **POST /addon-lifecycle** will be again invoked when the Add-On is activated on an account. This time the payload will provide a "tenantId" (Account ID), and "publicKey" which will be used for validating future request. That data should be stored in the Add-On system.
+- **GET /configuration** - will be invoked to get the list of configuration settings (including default values, current values) that need to be provided by the administrator that activated the Add-On on their tenantId.
+- **POST /configuration** - will set the configuration values for the tenantId. Note: not all settings can be sent in a single request. There might be multiple requests setting different config values. The Add-On should keep these settings safe.
+Also note that this endpoint can be called any time after activation if the administrator decides to change any of the settings.
+
+The lifecycle for de-activation of the Add-On from an account:
+
+- **POST /account-lifecyle** will notify the Add-On Service, by providing the identifier "DEACTIVATED". The tenantId, in this case will be provided in the header "X-LC-Tenant" which is standard for all request that are related to an account. The Add-On should delete any account related data.
+
+The lifecycle for un-registering an Add-On from RWS Language Cloud:
+
+- **POST /addon-lifecycle** will be invoked with identifier "UNREGISTERED". If there are accounts that haven't been previously deactivated, they should be considered so, and all related data be deleted.
+
+There are also endpoints that can be called at any point in time:
+
+- **GET /descriptor** - can be called before registration, during registration, after registration, on scheduled intervals, etc.
+- **GET /health** - will be called during and after registration. It is scheduled to be checked periodically.
+- **GET /documentation** - can be called at any time.
+
+Of course there are also the Extension endpoints which are invoked in the business life-cycle.
+
+## Understanding the incoming request
+There are two types of endpoint invocations:
+
+Related to the Add-On - ex: registering, health checks, documentation, does not know and doesn't make sense to be related to a tenant
+Related to an account (tenant) - operations that only make sense in relation with a tenant: activating, getting/setting configurations, extensions
+Only the endpoints relating to an account are authenticated, as the authentication is account-bounded. The only exception is "activating" which will receive the public key for signature validation, which needs to be saved for that account.
+
+Two headers are defined in the Stoplight that need to be handled:
+
+TR_ID - represent the trace identifier that is sent from the RWS Language Cloud, and should be propagated through all the stacks and added to the logs. When making requests to RWS Language Cloud in the context of an extension, the same TR_ID should be used (if it's a synchronous operation)
+X-LC-Tenant - provided only for the endpoints which are related to an account. Provides the tenant ID (account ID) to which the request is related.
+Implementing extensions
+Extensions Points are defined in Stoplight, and are defined by a number of endpoints that together support an extension. For example the Extension Point "Machine Translation Provider" has two endpoints defined:
+
+/sdl.lc.extensionpoint.machinetranslationprovider.translate
+/sdl.lc.extensionpoint.machinetranslationprovider.engines
+Implementing these endpoints, will allow for the Add-On to provide the extension that implements support for "Machine Translation Provider" Extension Point.
+
+Note: the path for these endpoints does not necessary have to be the same as defined in the Stoplight. The path is configurable from the descriptor, and can be set to any path, under the base path that is also defined in the descriptor.
+
+Multiple Extensions can be implemented that support the same Extension Point. All that's needed is to define a set of endpoints for each Extension. Meaning, if you want to implement Extension Point "Machine Translation Provider", by providing 3 machine translation options, you'll need to create 3 sets of endpoints, which is 6 endpoints. In the descriptor, for each extension, you'll define which endpoints are used.
+
+## Asynchronous endpoints
+Some extensions will require you to implement asynchronous endpoints. An example is the Automatic Task Extension: https://language-cloud-public-api-proposal.docs.stoplight.io/lc/api-docs/extensibility-api/automatic-task-type-provider/automatictasktypeexecutetask
+
+In this case the '/lc.automatictask.submit' endpoint will need to accept a task, execute it on a separate thread and then call the provided callback url with the result. The sequence diagram below explains this flow:
+
+
+
+## Multitenancy
+Unless an Add-On is developed to be used only in Developers Account, Multitenancy must be supported. Primarily that means ensuring that data from one account does not transpire to another account. Sharing data between two accounts should be avoided.
+
+Requests that are account specific contain the header X-LC-Tenant, with the account ID. It can be used to store the data, compartmentalized by account, and also to filter the requested data.
+
+## Security
+The Add-On Service should provide all endpoints with HTTPS support, with a minimum version of TLS 1.2. The scope of this is to protected client information from eavesdropping.
+
+Any stored data should be kept safe and used only for fulfilling the advertised actions. Data should be compartmentalized per tenant.
+
+### Signature Validation
+The blueprints will provide mechanisms to simplify signature validation.
+
+Headers that are required for signature validation:
+
+- **X-LC-Transmission-Time** - the transmission time in ISO-8601 format
+- **X-LC-Tenant** - the account ID
+- **X-LC-Signature-Algo** - the algorithm for signature generation. Currently the only valid value is SHA256withRSA .
+- **X-LC-Signature** - the signature that needs to be validated
+
+Steps for signature validation:
+
+1. Get the previously stored public key for the given account ID (X-LC-Tenant).
+2. Generate a CRC32 checksum of the message body.
+3. part is composed of the request URL minus basePath, as defined in the descriptor. must begin with a slash "/". (All paths in Descriptor must start with a slash).
+4. Generate the concatenation |||, where the - represents the value from the header, or calculated. | - is an actual character used for separating the values, and should be included in the final string.
+5. Validating the signature is done by verifying the signature using the public key and generated concatenation using the algorithm from X-LC-Signature-Algo.
+
+## Health Checks
+The health endpoint will be invoked regularly to ensure the health of the Add-On Service. The only expected response is a HTTP code 200, any other code will be considered as a service failure. Any content will be ignored.
+
+## Versioning
+Add-Ons should be designed with versioning in mind. Versioning is applied to the descriptor, allowing changing features in the Add-On without impacting users that might be using an older version of the Add-On.
+
+Things to consider:
+
+- Multiple versions of the Add-On can point to the same endpoints only if the changes are compatible.
+- If there are breaking changes in a new version of the Add-On (changes in the endpoint, changes in the models, changes in behaviour), new endpoints should be created for the new version.
+- Version number is set in the descriptor field "version". It should follow * * Semantic Versioning principles, and should consist of no more then 4 numeric groups separated by dots, ex.: "1.0", "1.3.5".
+
+In order for new changes in the descriptor to be detected, the descriptor must have it's version incremented. Changes in the descriptor will not be automatically detected if the version is the same as the last one.
+
+### Retiring older versions
+When an older version of the Add-On needs to be retired the following steps need to be taken:
+
+While deploying a new version with a new version number in the descriptor, the "minimumVersion" field should also be set to the minimum version that is still supported. It can also be set to the version that is being deployed - meaning that only this version will be supported.
+After deploying and getting the new version Published, a grace period of 30 days will be given to the users to update to the new version. In that period the older versions MUST be supported (the endpoints should be up, the functionality unchanged, etc.)
+After 30 days the old functionality can be decommissioned.
\ No newline at end of file
diff --git a/articles/LCPublicAPI/docs/Export-quote-report.md b/articles/LCPublicAPI/docs/Export-quote-report.md
new file mode 100644
index 0000000..00f9c16
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Export-quote-report.md
@@ -0,0 +1,468 @@
+# Export quote report
+The export quote mechanism has been updated and
+it is now composed of three relevant endpoints.
+The old export quote endpoint is deprecated, you can read about it in this section [`What's new`](https://languagecloud.sdl.com/lc/api-docs/16d216d6237ee-what-s-new#12-august-2022).
+
+The next endpoints would need to be executed in this specific order:
+
+1. To trigger a quote report generation for a given project, make a `POST` request to the [`/projects/{projectId}/quote-report/export`](../api/Public-API.v1-fv.html#/operations/ExportQuoteReport) endpoint. If successful, the response will contain an "Accepted" status, and you can proceed to the next step.
+
+2. To verify the status of the quote report generation, make a `GET` request to the [`/projects/{projectId}/quote-report/export`](../api/Public-API.v1-fv.html#/operations/PollQuoteReportExport) endpoint. As soon as the response body contains a "completed" status, then you can proceed to the next step.
+
+3. To download the generated project quote, make a `GET` request to the [`/projects/{projectId}/quote-report/download`](../api/Public-API.v1-fv.html#/operations/DownloadQuoteReport) endpoint.
+
+
+## Report format
+
+There are two available file formats for exporting the quote:
+- **PDF**
+- **Excel**
+
+By default, the quote report is exported as a `PDF` file. The format of the file can be changed by specifying the `format` query parameter.
+
+## Report language
+
+The report can be localized in one of the following languages, by specifying the `languageId` query parameter:
+- **English - `en`**
+- **German - `de`**
+- **French - `fr`**
+- **French (Canada) - `fr-CA`**
+- **Japanese - `ja`**
+- **Spanish - `es`**
+- **Simplified Chinese - `zh-CN`**
+- **Dutch - `nl`**
+- **Italian - `it`**
+
+The next screenshot illustrates a sample of an exported PDF quote.
+
+
+
+
+
+
+# Update project quote
+To update a quote, make a `PUT` request to the [`/projects/{projectId}`](../api/Public-API.v1-fv.html#/operations/UpdateProject) endpoint, and specify the `quote` field.
+
+## Cost types
+
+Two types of translation costs can be updated using the Trados Cloud Platform API:
+- **Language Costs**
+ - Costs that are applied at language level: *volume, percentage, hourly, per page, conditional*
+- **Project Costs**
+ - Costs that are applied at project level as additional cost: *volume, percentage, hourly, per page, conditional, per file, per target language*
+
+
+## Cost types available at project and language level
+
+> Note: Both language costs and project costs have identical request/response bodies, but for `languageCosts`, the `targetLanguage` field is required.
+
+
+The examples below use the following translation costs:
+
+```json
+...
+{
+ "translationCosts": [{
+ "total": 85.4,
+ "targetLanguage": {
+ "languageCode": "fr-FR",
+ "englishName": "French (France)"
+ },
+ "new": {
+ "count": 854.0,
+ "rate": 0.1,
+ "total": 85.4,
+ "runningTotal": 85.4
+ }
+ }
+ ]
+}
+...
+```
+
+### Volume
+
+This is a fixed per word/character cost.
+
+***Request***:
+```json
+...
+{
+ "name": "Volume Cost",
+ "costOrder": 0,
+ "cost": 0.5,
+ "volumeUnitType": "Words",
+ "costType": "volume"
+ ...
+}
+...
+```
+
+The total cost is calculated as `number of words/characters` * `cost of a unit`:
+
+**`total = count * cost`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Volume Cost",
+ "count": 854.0,
+ "total": 427.0,
+ "cost": 0.5,
+ "costType": "volume",
+ "volumeUnitType": "words",
+ "costOrder": 0,
+ "runningTotal": 512.4
+ ...
+}
+...
+```
+
+The running total up until this point is equal to `total cost of the current additional cost` + `translation costs`.
+Using the data above, we can get the following running total:
+
+**`85.4 + 427 = 512.4`**
+
+### Percentage
+
+This is a percentage cost calculated against the current cost (current language-level cost or current project-level cost).
+
+***Request***:
+
+```json
+...
+{
+ "name": "Percentage Cost",
+ "costOrder": 1,
+ "count": -10,
+ "costType": "percentage"
+ ...
+}
+...
+```
+
+The `total cost of the current additional cost` is calculated using the value from the `count` field as a percentage from the previous `running total`.
+
+**`total = count% * previousRunningTotal`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Percentage Cost",
+ "count": -10.0,
+ "total": -51.24,
+ "cost": 0.0,
+ "costType": "percentage",
+ "costOrder": 1,
+ "runningTotal": 461.16
+ ...
+}
+...
+```
+
+Since the previous `running total` is **512.4**, the total cost of the `current additional cost` is calculated as follows:
+
+**`total = -10% * 512.4 = -51.24`**
+
+As a result, the new running total becomes:
+
+**`runningTotal = 512.4 - 51.24 = 461.16`**
+
+### Hourly
+
+This is a fixed cost per hour.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Hourly Cost",
+ "costOrder": 2,
+ "count": 5,
+ "cost": 1.5,
+ "costType": "hourly"
+ ...
+}
+...
+```
+
+The total cost is calculated as `number of hours` * `cost of an hour`:
+
+**`total = count * cost`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Hourly Cost",
+ "count": 5.0,
+ "total": 7.5,
+ "cost": 1.5,
+ "costType": "hourly",
+ "costOrder": 2,
+ "runningTotal": 468.66
+ ...
+}
+...
+```
+
+**`total = 5 * 1.5 = 7.5`**
+
+**`runningTotal = 461.16 + 7.5 = 468.66`**
+
+### Per Page
+
+This is a fixed cost per page.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Per Page Cost",
+ "costOrder": 3,
+ "count": 10,
+ "cost": 0.2,
+ "costType": "perPage"
+ ...
+}
+...
+```
+
+
+The total cost is calculated as `number of pages` * `cost of a page`:
+
+**`total = count * cost`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Per Page Cost",
+ "count": 10.0,
+ "total": 2.0,
+ "cost": 0.2,
+ "costType": "perPage",
+ "costOrder": 3,
+ "runningTotal": 470.66
+ ...
+}
+...
+```
+
+**`total = 10 * 0.2 = 2`**
+
+**``runningTotal = 468.66 + 2 = 470.66``**
+
+### Conditional
+
+This is a cost that is applied conditionally, for example:
+
+***Request***:
+
+```json
+...
+{
+ "name": "Conditional Cost",
+ "costOrder": 4,
+ "conditionalCostVariable": "wordCount",
+ "conditionalCostOperator": "less",
+ "conditionalCostThreshold": 1000,
+ "cost": 100,
+ "conditionalCostType": "relative",
+ "costType": "conditional"
+ ...
+}
+...
+```
+
+If `[conditionalCostVariable]` `[conditionalCostOperator]` `[conditionalCostThreshold]`, then add/set `[cost]` `[conditionalCostType]`.
+
+This formula translates to the following:
+
+If `wordCount < 1000`, then add `100 relative`.
+
+***Response***:
+
+```json
+...
+{
+ "name": "Conditional Cost",
+ "count": 854.0,
+ "total": 100.0,
+ "cost": 100.0,
+ "costType": "conditional",
+ "costOrder": 4,
+ "conditionalCostType": "relative",
+ "conditionalCostOperator": "less",
+ "conditionalCostVariable": "wordCount",
+ "conditionalCostThreshold": 1000.0,
+ "runningTotal": 570.66
+ ...
+}
+...
+```
+Since the word count (`count`) is 854 (in the example above), the condition becomes:
+
+If `854 < 1000` then add `100 relative`. => `true`
+
+**`total = cost = 100`**
+
+**`runningTotal = 470.66 + 100 = 570.66`**
+
+The total cost depends on the `conditionalCostType` field and on whether the condition evaluates to `true` or `false`.
+When the condition evaluates to `false`, the total will be 0, and the running total will not change.
+
+If `854 > 1000`, then add `100 relative`. => `false`
+
+**`total = cost = 0`**
+**`runningTotal = 470.66`**
+
+
+For the same values as above, and the `conditionalCostType` set to `percentage`, the `total` and `runningTotal` values will change to:
+
+**`total = 100% * 470.66 = 470.66`**
+
+**`runningTotal = 470.66 + 470.66 = 941.32`**
+
+When the `conditionalCostType` is set to `absolute`, the total will be equal to the difference between the `cost` and the `runningtotal`:
+
+**`total = 100 - 470.66 = -370.66`**
+
+**`runningTotal = 100`**
+
+> **Note:** Setting `conditionalCostType` to `absolute` will cancel all the previous costs for the project or the target language.
+
+## Cost types available ONLY at project level
+
+### Per Target Language
+
+This is an additional cost that is calculated based on the number of target languages in the project.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Per Target Language",
+ "costOrder": 5,
+ "cost": 5,
+ "costType": "perTargetLanguage"
+}
+...
+```
+
+The total cost is calculated as `number of target languages` * `cost of a target language`:
+
+***Response***:
+```json
+...
+{
+ "name": "Per Target Language",
+ "count": 1.0,
+ "total": 5.0,
+ "cost": 5.0,
+ "costType": "perTargetLanguage",
+ "costOrder": 5,
+ "runningTotal": 575.66
+}
+...
+```
+
+Since there is only one target language in the example above, the total cost becomes:
+**`total = 1 * 5 = 5`**
+**`runningTotal = 570.66 + 5 = 575.66`**
+
+### Per File
+
+This is an additional cost that is calculated based on the number of files in the project.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Per File",
+ "costOrder": 6,
+ "cost": 3,
+ "costType": "perFile"
+}
+...
+```
+
+The total cost is calculated as `number of files` * `cost of a file`:
+
+***Response***:
+```json
+...
+{
+ "name": "Per File",
+ "count": 2.0,
+ "total": 6.0,
+ "cost": 3.0,
+ "costType": "perFile",
+ "costOrder": 6,
+ "runningTotal": 581.66
+}
+...
+```
+**`total = 2 * 3 = 6`**
+**`runningTotal = 575.66 + 6 = 581.66`**
+
+## Cost order
+
+The `costOrder` field defines the order in which costs are calculated.
+
+For example, if there are two additional costs defined in the quote (see below), the percentage cost is calculated based on the running total from the volume cost.
+
+```json
+...
+{
+ "name": "Volume Cost",
+ "total": 427.0,
+ "costType": "volume",
+ "costOrder": 0,
+ "runningTotal": 512.4
+...
+},
+{
+ "name": "Percentage Cost",
+ "total": -51.24,
+ "count": -10.0,
+ "costType": "percentage",
+ "costOrder": 1,
+ "runningTotal": 461.16
+...
+}
+...
+```
+
+When the `costOrder` field is switched, the `total` percentage cost value will be calculated based on the previous running total, which in this case is the translation cost (**85.4**):
+```json
+...
+{
+ "name": "Percentage Cost",
+ "count": -10.0,
+ "total": -8.54,
+ "costType": "percentage",
+ "costOrder": 0,
+ "runningTotal": 76.86
+...
+},
+{
+ "name": "Volume Cost",
+ "total": 427.0,
+ "costType": "volume",
+ "costOrder": 1,
+ "runningTotal": 503.86
+...
+}
+...
+```
diff --git a/articles/LCPublicAPI/docs/File-formats.md b/articles/LCPublicAPI/docs/File-formats.md
new file mode 100644
index 0000000..a7bc483
--- /dev/null
+++ b/articles/LCPublicAPI/docs/File-formats.md
@@ -0,0 +1,69 @@
+# File formats
+A file used in the Trados Cloud Platform API can have one of the three supported formats: native, SDLXLIFF or [BCM](https://developers.rws.com/languagecloud-api-docs/articles/BCM.NET_client_API.html):
+
+- Native represents the format of the file that is attached to a project by the user. The project's associated File Type Configuration specifies if the native file extensions can be attached to that project.
+
+- To download files for translation or review in offline mode, the *.sdlxliff format can be used. SDLXLIFF files have XML format.
+
+- BCM (Bilingual Content Model) documents are files used for handling content internally. BCM files have JSON content and are stored in .json format.
+
+## File formats in a workflow
+In a workflow, each task has a supported input file type that describes which input file types are allowed for that task. A new file version can be added only if the format of this new version respects the input file type supported by the task. You can check what the supported input file types are for tasks on the [Rules for sequencing tasks correctly](https://docs.rws.com/791595/885137/trados-enterprise/rules-for-sequencing-tasks-correctly) page.
+
+A few input file types and examples of tasks that support them are listed below:
+
+- nativeSource: the task handles source file versions in their uploaded native format (e.g.: *FileTypeDetection*, *Engineering*, *FileFormatConversion*)
+- bcmSource: the task can process source files in their BCM format (e.g.: *DocumentContentAnalysis*, *CopySourceToTarget*)
+- bcmTarget: the task accepts target files in their BCM format (e.g.: *Translation*, *Linguistic Review*, *MachineTranslation*, *TranslationMemoryMatching*, *TranslationMemoryUpdate*, *TargetFileGeneration*)
+- nativeTarget: the task handles target files in their native "generated" form (e.g.: *DTP*, *FinalCheck*)
+- sdlxliffTarget: the task processes target files in their SDLXLIFF form. Specifically for Import tasks.
+- none: the task does not read or modify the content of a file.
+
+Using the Trados Cloud Platform API, the source and target files in different formats can be viewed, downloaded and added (via import operations), based on the task and its status in the project's workflow.
+
+### Handling Source Files
+
+#### Upload Source Files
+Source files can be added to a project using the [Add Source File](../api/Public-API.v1-fv.html#/operations/AddSourceFile) endpoint or the [Attach Source Files](../api/Public-API.v1-fv.html#/operations/AddSourceFiles) endpoint (for multiple files). If the file's extension is supported by the File Type Configuration, the project will follow the workflow and a new version of the source file in BCM format will be automatically created in the *File Format Conversion* task.
+
+
+#### Upload Source File Versions
+New source file versions can be added in native or BCM format using the [Add Source File Version](../api/Public-API.v1-fv.html#/operations/AddSourceFileVersion) endpoint. You can add source file versions:
+* in the *Engineering* task
+* in custom tasks created by users having the task type set to *Engineering*
+* in extension tasks that handle source files.
+
+If a project having attached a native source file with an unsupported extension is started, an error task will be generated in the *File Type Detection* task and the workflow is interrupted.
+
+>Note: For adding a source file version using an extension task, the configuration of the task type must declare the `scope`'s value as "file".
+
+
+#### Download Source File Versions
+Any of the source file versions (in native or BCM format) can be downloaded using the [Download Source File Version](../api/Public-API.v1-fv.html#/operations/DownloadSourceFileVersion) endpoint. The *Engineering* task, for instance, is an example of a task where download can be performed.
+
+
+
+### Handling Target Files
+The *Copy source to target* task converts the native file to a new target file version in BCM format.
+
+#### Upload Target File Versions
+Adding a new version for a target file in native or BCM format can be executed with the [Add Target File Version](../api/Public-API.v1-fv.html#/operations/AddTargetFileVersion) endpoint.
+
+>Note: For adding a target file version using an extension task, the configuration of the task type must declare the `scope`'s value as "file".
+
+
+#### Download Target File Versions
+The BCM and native target file versions can be downloaded by using [Download Target File Version](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion) endpoint, while the project is, for example, in the *Translation* task.
+
+
+#### Export Target File Versions
+The BCM target file versions can be exported in native or SDLXLIFF format by calling the [Export Target File Version](../api/Public-API.v1-fv.html#/operations/ExportTargetFileVersion) endpoint. This operation triggers a conversion of the BCM target file version in a native or SDLXLIFF format based on the value of the `format` query parameter used. The endpoint starts an export operation which can be monitored using the [polling endpoint](../api/Public-API.v1-fv.html#/operations/PollTargetFileVersionExport). After the export is done, the files can be downloaded using the [Download Exported Target File Version](../api/Public-API.v1-fv.html#/operations/DownloadExportedTargetFileVersion) endpoint.
+
+> Note: The export endpoint is dedicated to file versions of BCM format and cannot be used on files in native or SDLXLIFF format. The export operation can only be executed on tasks where the supported output file is a bilingual target file. You can consult the output file types for tasks on the [Rules for sequencing tasks correctly](https://docs.rws.com/791595/885137/trados-enterprise/rules-for-sequencing-tasks-correctly) page from the official RWS Documentation Center.
+>
+>In order to download file versions of BCM or native type, please use the [Download Target File Version](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion) endpoint.
+
+
+#### Import Target File Versions
+Target file versions downloaded in SDLXLIFF format can be processed and afterwards replaced by using [Import Target File Version](../api/Public-API.v1-fv.html#/operations/ImportTargetFileVersion) endpoint. The import operation triggers internally the update of the BCM file associated with the imported SDLXLIFF file. This endpoint should mostly be used for offline work.
+
diff --git a/articles/LCPublicAPI/docs/Headers-considerations.md b/articles/LCPublicAPI/docs/Headers-considerations.md
new file mode 100644
index 0000000..ecaf4ff
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Headers-considerations.md
@@ -0,0 +1,52 @@
+# Headers considerations
+
+The purpose of this page is to showcase the header types that could capture your interest.
+
+> Headers must be treated as [case-insensitive](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
+
+The Trados Cloud Platform API response headers can be classified as follows:
+
+Header type | Example
+---------|----------
+ Standard | `Content-Type`
+ Custom | `X-LC-TraceId`
+ Endpoint specific | `Content-Disposition`
+
+## Content-Type header
+
+The `application/octet-stream` content type is used to indicate that a body contains arbitrary binary data. The recommended action for a consumer that receives an
+`application/octet-stream` entity is to simply offer to put the data
+in a file, read more in the [RFC2046](https://www.rfc-editor.org/rfc/rfc2046#section-4.5.1) space.
+
+## Content-Disposition header
+
+For operations expected to return content that can be handled as a file, the `Content-Disposition` header can be sent in the response headers to provide more information about the response payload. The Trados Cloud Platform API will provide this header in certain situations, and its primary goal is to supply a file name for the content being downloaded or exported.
+You can read more about the `Content-Disposition` header on the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) website or in the [RFC6266](https://www.rfc-editor.org/rfc/rfc6266) space.
+
+The `Content-Disposition` response header can be usually found on various download API endpoints like [Download Source File Version](../api/Public-API.v1-fv.html#/operations/DownloadSourceFileVersion), [Download Target File Version](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion), [Download Exported Quote Report](../api/Public-API.v1-fv.html#/operations/DownloadQuoteReport) and others.
+
+> Please note that both `Content-Type` and `Content-Disposition` are **not required** and APIs might not include them in the response. There are no guarantees that an endpoint that used to return a `Content-Type` or `Content-Disposition` header will still do so, under any circumstance. Please treat these headers as **optional** for all APIs.
+
+### Retrieving the file name
+
+Here's an example of how the `Content-Type` and the `Content-Disposition` headers look like:
+```
+Content-Type: application/octet-stream
+Content-Disposition: attachment; filename="Public API Download.pdf"; filename*=UTF-8''Public%20API%20Download.pdf
+```
+
+The parameters `filename` and `filename*`, to be matched case-
+insensitively, provide information on how to construct a filename for
+storing the message payload.
+
+The parameters `filename` and `filename*` differ only in that
+`filename*` uses the encoding defined in [RFC5987](https://www.rfc-editor.org/rfc/rfc5987), allowing the use of characters not present in the ISO-8859-1 character set.
+
+> When both `filename` and `filename*` are present in a single header field value, you **must** pick `filename*` and ignore `filename`.
+
+If the `Content-Disposition` header is missing or you simply want to have a different file name, you need to provide a name and the file extension. The extension can be usually inferred from the required `Content-Type` header and also from the operation that is invoked.
+
+
+## Deprecation and sunset headers
+
+These types of headers are used in our endpoint retirement process and are covered broadly in the [Public API Management Process](../docs/Public-API-Management-Process.md#endpoint-retirement-process) page.
diff --git a/articles/LCPublicAPI/docs/How-to-multipart.md b/articles/LCPublicAPI/docs/How-to-multipart.md
new file mode 100644
index 0000000..34ce72d
--- /dev/null
+++ b/articles/LCPublicAPI/docs/How-to-multipart.md
@@ -0,0 +1,48 @@
+---
+stoplight-id: 1hfz3c15wpkbf
+---
+
+# Multipart considerations
+
+This page goes into deeper details for uploading files. Generally you might be interested in this subject when not using the provided SDKs and are implementing your own SDK. This page should help you debug potential problems you might encounter.
+
+> Our APIs follows standard HTTP/1.1 protocol as described in [RFC2616](https://www.rfc-editor.org/rfc/rfc2616) and subsequent RFCs. This page does not describe any custom HTTP behavior.
+
+## How to perform POST requests with multipart
+
+Whenever you make use of endpoints that do file uploads using `multipart/form-data`, some additional details may be required to be sent alongside the file, for example a `properties` part.
+
+Let's take as an example the [Add Source File Version](../api/Public-API.v1-fv.html#/operations/AddSourceFileVersion) endpoint. The API specifies that the request content is `multipart/form-data` and has a `properties` part that should be serialized as a JSON (this might not be mentioned explicitly in the documentation, but any structures in multiparts should be serialized as JSON). The second property is `file` and though it is of type `string`, that means that the raw content of the file should be sent in that part.
+
+> The order of parts is important! Please send the parts in the order these are specified in the API contract.
+
+To confirm that you are sending the correct content, you can intercept the request and view the raw request (this can be done in many ways, with either built in tools if available in your IDE/tooling or even free software).
+
+A simplified raw HTTP request is presented bellow:
+
+```http
+POST /tasks//source-files//versions HTTP/1.1
+HOST: host.example.com
+Content-Type: multipart/form-data; boundary=--------------------------818668410602542750275539
+
+----------------------------818668410602542750275539
+Content-Disposition: form-data; name="properties"
+Content-Type: application/json
+
+{
+â€â€"type":"native",
+â€â€"fileTypeSettingsId": ""
+}
+----------------------------818668410602542750275539
+Content-Disposition: form-data; name="file"; filename=""
+Content-Type:
+
+
+----------------------------818668410602542750275539--
+
+```
+
+For the file, there is usually the filename that needs to be sent, along with file `Content-type` and finally the content.
+
+
+
diff --git a/articles/LCPublicAPI/docs/How-to-report-an-issue.md b/articles/LCPublicAPI/docs/How-to-report-an-issue.md
new file mode 100644
index 0000000..088d648
--- /dev/null
+++ b/articles/LCPublicAPI/docs/How-to-report-an-issue.md
@@ -0,0 +1,78 @@
+---
+stoplight-id: h5oizt92tuhtg
+---
+
+# How to report an issue
+
+When reporting an issue it is important to include as much information as you can.
+
+## Use this template
+
+Here below is a template that we recommend using when raising a new ticket:
+
+```
+- Endpoint:
+- X-LC-Tenant:
+- X-LC-TraceId:
+- Request URL:
+- Request body:
+- Response status code:
+- Response body:
+- Expected result:
+- Actual result:
+- Description:
+```
+
+You don't have to fill in all the fields, but the more details you provide, the easier it will be to investigate and get to a solution faster. Besides these details you can also add anything that you consider helpful for the investigation.
+
+## Obtaining the details
+
+- Endpoint - identify the endpoint where the issue was observed from the [Trados Cloud Platform API](https://languagecloud.sdl.com/lc/api-docs/9033e3227d21f-rws-language-cloud-api) and paste the link to it.
+- X-LC-Tenant - is the tenant identifier as sent in the request headers. This is required on all endpoints.
+- X-LC-TraceId - is a unique identifier for the request and it can be found in the response headers. It is very useful when investigating the issue, thus it **should always be provided**, if possible.
+- Request URL - the URL in the request as sent from your application (including the domain, endpoint path and any query parameters). If that is not available, at least include the query parameters used to perform the request. Some of the most relevant ones are: `fields`, `top`, `skip`, `location`, `locationStrategy` and others, depending on the case.
+- Request body - the `json` content sent.
+- Response status code - the HTTP status code returned.
+- Response body - the response received. Error responses are also relevant.
+- Expected result - what was the expected outcome.
+- Actual result - what was the actual outcome.
+- Description - a short description about what you are trying to achieve and possible answers to questions like "How did you end up in the current situation?" or "Did you find a workaround?"
+
+## Example
+
+You can simply copy the format from above and fill in the details. For example:
+
+- Endpoint: https://eu.cloud.trados.com/lc/api-docs/025707d21ecc0-create-project
+- X-LC-Tenant:
+- X-LC-TraceId: 90d9147c-6afd-4d19-b0ac-99cac9ece970
+- Request URL: https://api.eu.cloud.trados.com/public-api/v1/projects?fields=dueBy,status,customer.name
+- Request body:
+ ```json
+ {
+ "name": "Invalid projectTemplate",
+ "description": "How to report an issue",
+ "projectTemplate": {
+ "id": "invalid_project_template_id"
+ }
+ }
+ ```
+- Response status code: 404
+- Response body:
+ ```json
+ {
+ "errorCode": "notFound",
+ "message": "Invalid input on create project.",
+ "details": [
+ {
+ "name": "project.template.id",
+ "code": "notFound",
+ "value": "invalid_project_template_id"
+ }
+ ]
+ }
+ ```
+- Expected result: The project is created.
+- Actual result: The project is not created due to `projectTemplate.id` not being found.
+- Description: When attempting to create a new project I get the error mentioned above.
+
+> Check the [Multi-Region](../docs/Multi-region.md) page for regional API details.
\ No newline at end of file
diff --git a/articles/LCPublicAPI/docs/How-to-use-location-and-folders.md b/articles/LCPublicAPI/docs/How-to-use-location-and-folders.md
new file mode 100644
index 0000000..60be9c8
--- /dev/null
+++ b/articles/LCPublicAPI/docs/How-to-use-location-and-folders.md
@@ -0,0 +1,164 @@
+# How to use location and folders
+
+The Trados Cloud Platform API supports [folder-based](https://docs.rws.com/791595/984983/trados-enterprise/how-do-folder-structure-and-inheritance-help-you-get-organized-) access management to all resources. The users have access to resources based on the permissions associated with the group (role) they belong to. For information about creating a user you can check the [Service credentials](../docs/Service-credentials.md) page.
+
+
+### Concepts we use
+
+Detailed information about specific concepts used in inheritance context can be found on the [
+Concepts we use](https://docs.rws.com/791595/984976/trados-enterprise/concepts-we-use) page from the official Trados Cloud Platform Documentation Center.
+
+
+### Setting a location for a user
+
+The folders structure in Trados Cloud Platform API is hierarchical. For more information on how to organize folders and set up a location for a user, visit the [Customers](https://docs.rws.com/791595/707420/trados-enterprise/customers) page.
+
+
+## User rights in folders
+
+Depending on how the account was provisioned, configured and on the groups which the user belongs to, the rights for a user can be more restrictive or permissive.
+
+Users can learn where they were created, the exact folder, and what groups they belong to, by executing a [Get My User](../api/Public-API.v1-fv.html#/operations/GetMyUser) call with the `fields` query parameters set to *"location.name,location.path,groups"*.
+
+For example, let's assume that an account has the following hierarchy of folders (with associated unique identifiers simplified for readability):
+
+- **Root** (60b...fb0)
+ - **Customers** (fea...a0b)
+ - **Customer1** (ed7...623)
+ - **Customer3** (4f0...206)
+ - **Customer4** (e73...4a8)
+ - **Customer2** (48b...5d0)
+ - **Customer5** (bbc...c21)
+ - **Vendors** (a16...29f)
+ - **Vendor1** (b02...281)
+ - **Vendor2** (d46...839)
+
+If a user is created in Customer5 and is assigned to the "Project Managers Customer5" group, performing the above request will receive the following response:
+```json
+{
+ "id": "62b...d56",
+ "location": {
+ "id": "bbc...c21",
+ "name": "Customer5",
+ "path": [
+ {
+ "id": "48b...5d0",
+ "location": "fea...a0b",
+ "name": "Customer2",
+ "hasParent": true
+ },
+ {
+ "id": "fea...a0b",
+ "location": "60b...fb0",
+ "name": "Customers",
+ "hasParent": true
+ },
+ {
+ "id": "60b...fb0",
+ "name": "Root",
+ "hasParent": false
+ }
+ ]
+ },
+ "groups": [
+ {
+ "id": "60b...2be",
+ "name": "Project Managers Customer5"
+ }
+ ]
+}
+```
+In the above example `location.id` describes the exact folder where the resource is situated.
+The array under `location.path` presents a bottom-up hierarchical arrangement of all the parent folders leading up to `Root`, where the array ends, this being signaled by the `"hasParent": false` field.
+
+### Creating resources in folders
+
+The users' access to resources depends on the folder where they were created and on the groups they belong to. Detailed information about what actions can be executed with specific roles can be checked [here](https://docs.rws.com/en-US/trados-enterprise-%26-accelerate-791595/account-structure%2C-folders%2C-inheritance-796862).
+
+When creating a resource, it is strongly recommended to send in the request the `location` field. When `location` is not set, the system will try to create the resource in the higher folder in the hierarchy, the Root folder. It might not have access to that folder and the request will fail with forbidden error.
+
+
+For example:
+
+- If Customer2 tries to create a project with location values set to "48b...5d0":\
+ **Where will the project be created?**
+ - in Customer2 folder
+
+- If Customer2 tries to create a project with no value set for location:\
+ **Where will the project be created?**
+ - In Root folder, if the user has access in Root
+ - If the user does not have access in Root, the request will fail with forbidden error
+
+- If Customer4 tries to create a project with location value set to "e73...4a8":\
+ **Where will the project be created?**
+ - in Customer4 folder
+
+- If Customer4 tries to create a project with no value set for location:\
+ **Where will the project be created?**
+ - In Root folder, if the user has access in Root
+ - If the user does not have access in Root, the request will fail with forbidden error
+
+More examples of accessing resources based on their location are listed on the [Inheritance within the account](https://docs.rws.com/791595/797020/trados-enterprise/inheritance-within-the-account) page.
+
+
+### Retrieve resources using location strategy
+
+List endpoints can have a 'location' query parameter that is used to filter items by location. `Location` is the value of the folder id. Some endpoints accept an array rather than a single location. Additionally, this parameter can be used together with 'locationStrategy' which can have the following values:
+- *location*: all resources located strictly in the folders from the folder parameter (default value for `locationStrategy`) are returned
+- *lineage*: resources located in the folder specified by the folder parameter, as well as any of its subfolders, are returned
+- *bloodline*: resources located in the folder specified by the folder parameter, as well as any of its ancestor folders, are returned
+- *genealogy*: resources located in the folder specified by the folder parameter together with its subfolders and its ancestor folders
+
+The `location` field can be an array of folder identifiers containing multiple identifiers separated by commas. In this case, the `locationStrategy` applies for all of them and the result will contain all resources that fulfill the strategy, but, if a resource is duplicated in response for two, or more location identifiers, it will be returned only once.
+
+For example, let's see how `location` and `locationStrategy` query parameters work on an account that has the hierarchy defined in the earlier example:
+
+- **Root** (60b...fb0) - **Project1**
+ - **Customers** (fea...a0b) - **Project2**
+ - **Customer1** (ed7...623)
+ - **Customer3** (4f0...206) - **Project3**
+ - **Customer4** (e73...4a8)
+ - **Customer2** (48b...5d0)
+ - **Customer5** (bbc...c21) - **Project4**
+ - **Vendors** (a16...29f)
+ - **Vendor1** (b02...281)
+ - **Vendor2** (d46...839)
+
+If the list project endpoint is used with:
+
+- `location` = "fea...a0b" (Customers folder identifier)
+
+ Project2 is listed because the default value for `locationStrategy` is "location".
+
+
+- `locationStrategy` = "lineage"
+
+ All projects are listed because sending the `locationStrategy` without `location` does not filter anything.
+
+
+- `location` = "fea...a0b" (Customers folder identifier) AND `locationStrategy` = "location"
+
+ Project2 is listed because it is similar with the first case.
+
+
+- `location` = "fea...a0b" (Customers folder identifier) AND `locationStrategy` = "lineage"
+
+ Project2, Project3 and Project4 are returned.
+
+
+- `location` = "4f0...206" (Customer3 folder identifier) AND `locationStrategy` = "bloodline"
+
+ Project1, Project2 and Project3 are returned.
+
+
+- `location` = "fea...a0b" (Customers folder identifier) AND `locationStrategy` = "genealogy"
+
+ Project1, Project2, Project3 and Project4 are returned.
+
+
+- `location` = "fea...a0b,fea...0a0" (Customers and Customer3 folder identifiers) AND `locationStrategy` = "lineage"
+
+ Project2, Project3 (only once) and Project4 are returned.
+
+
+
diff --git a/articles/LCPublicAPI/docs/Interact-with-tasks.md b/articles/LCPublicAPI/docs/Interact-with-tasks.md
new file mode 100644
index 0000000..9d72927
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Interact-with-tasks.md
@@ -0,0 +1,31 @@
+# Interact with tasks
+
+Once the project is started, you can interact with tasks in several ways:
+
+### Find the task identifier
+
+Make a `GET` request to the [`/tasks/assigned`](../api/Public-API.v1-fv.html#/operations/ListTasksAssignedToMe) endpoint and identify the `id` of the task you want to interact with.
+
+### Reclaim tasks
+
+If you make a `PUT` request to the [`/tasks/{taskId}/reclaim`](../api/Public-API.v1-fv.html#/operations/ReclaimTask) endpoint, the owner of task is removed and another user from the assignee's list can accept it. The task is not reassigned automatically.
+
+### Complete tasks
+
+To complete a task, make a `PUT` request to the [`/tasks/{taskId}/complete`](../api/Public-API.v1-fv.html#/operations/CompleteTask) endpoint.
+
+### Assign tasks
+
+If the tasks is rejected by all its assignees, you can update the list of assignees. Make a `GET` request to the [`/users`](../api/Public-API.v1-fv.html#/operations/ListUsers) or [`/groups`](../api/Public-API.v1-fv.html#/operations/ListGroups) endpoints and remember their identifiers. Then, make a `PUT` request to the [`/tasks/{taskId}/assign`](../api/Public-API.v1-fv.html#/operations/AssignTask) endpoint and provide the identifiers.
+
+### List all the tasks in a project
+
+Make a `GET` call to the [`/projects/{projectId}/tasks`](../api/Public-API.v1-fv.html#/operations/ListProjectTasks) endpoint to list all the tasks in a project by projectId. The response returns a total count of the tasks, and several details for each task: `taskId`, the input and outcome per task, the owner and assignees, the creation and due dates.
+
+
+### Upload/Import a target file version
+
+Make a `POST` call to the [`/projects/{projectId/target-files/{targetFileId}/versions/imports`](../api/Public-API.v1-fv.html#/operations/ImportTargetFileVersion) endpoint to upload (import) a new file version that can be used as part of a task. The response returns the `importId` which you can further use to check the import result by making a `GET` call to the [`/projects/{projectId}/target-files/{targetFileId}/versions/imports/{importId}`](../api/Public-API.v1-fv.html#/operations/PollTargetFileVersionImport) endpoint. The `projectId` can be retrieved by making a `POST` call to the [`/projects`](../api/Public-API.v1-fv.html#/operations/CreateProject) endpoint, while the `targetFileId` can be retrieved by making a `GET` call to the [`/projects/{projectId}/target-files`](../api/Public-API.v1-fv.html#/operations/ListTargetFiles) endpoint.
+
+
+
diff --git a/articles/LCPublicAPI/docs/Introduction.md b/articles/LCPublicAPI/docs/Introduction.md
new file mode 100644
index 0000000..27d1918
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Introduction.md
@@ -0,0 +1,29 @@
+# Trados Cloud Platform API
+
+The Trados Cloud Platform API enables external applications to interact with Trados Cloud Platform.
+
+## Product Configurations
+
+This applies to all products that are based on Trados Cloud Platform. Note that, depending on the product and its configuration, certain features may not be available or the rate might be limited through the API. In general, when a certain feature is available in your specific product configuration, the corresponding endpoints will also be available in the API.
+
+## Features Overview
+
+At present, the API contains mainly capabilities that enable the creation, management and tracking of cloud translation projects.
+
+Resources like termbases and translation memories can also be created using the Trados Cloud Platform API. Any other resources, such as pricing models need to be set up beforehand, using the user interface.
+
+## Types of Integrations
+
+At the moment the Trados Cloud Platform API can be called by custom (integration) applications on behalf of service users (non-human users). The ability to call the API on behalf of real end users will be supported at a later date.
+
+## Creating Your First Project
+
+Follow these steps to create your first project using the API:
+### 1. Create a service user, an application and authenticate
+
+Follow the instructions under the [Service users and custom applications](../docs/Service-users-and-custom-applications.md) and the [Service Credentials](../docs/Service-credentials.md) pages to create a service user and an application, and then authenticate, following the [Authentication](../docs/Authentication.md) page, by using the application's `client_id` and `client_secret`.
+
+### 2. Create your first project
+
+See [Create projects](../docs/Create-projects.md) and [Basic project creation flow](../docs/Basic-project-creation-flow.md) for a walk-through of the required steps to create a project.
+
diff --git a/articles/LCPublicAPI/docs/Known-Issues.md b/articles/LCPublicAPI/docs/Known-Issues.md
new file mode 100644
index 0000000..2304413
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Known-Issues.md
@@ -0,0 +1,13 @@
+# Known issues
+
+This page lists the known bugs and issues for Trados Cloud Platform API.
+
+> Note: 5xx status codes might be returned on any endpoint. This means that the server has encountered an unexpected error. If the error persists, use the [How to report an issue](../docs/How-to-report-an-issue.md) guideline to gather the needed information for reporting the issue.
+
+### Download Exported Quote Report
+
+The [Download Exported Quote Report](../api/Public-API.v1-fv.html#/operations/DownloadQuoteReport) endpoint is designed to be a one-time operation. After a download attempt, the file is deleted and it's no longer available for download. If the file needs to be downloaded again, the user needs to request a new export of the quote report by using the [Export Quote Report](../api/Public-API.v1-fv.html#/operations/ExportQuoteReport) and [Poll Quote Report Export](../api/Public-API.v1-fv.html#/operations/PollQuoteReportExport) endpoints.
+
+### Export Quote report
+When the export is not using a Quote Template, the response for this call will be empty.
+
diff --git a/articles/LCPublicAPI/docs/Language-Cloud-APIs-for-Postman.md b/articles/LCPublicAPI/docs/Language-Cloud-APIs-for-Postman.md
new file mode 100644
index 0000000..7ba6f9a
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Language-Cloud-APIs-for-Postman.md
@@ -0,0 +1,69 @@
+# Trados Cloud Platform APIs for Postman
+
+We provide a [Postman](https://www.postman.com/) collection for quick and easy usage of our RESTful APIs.
+
+## Installation
+
+You can download the Postman collection from [here](https://github.com/sdl/language-cloud-public-api-postman/blob/develop/postmanCollection.json?raw=true).
+
+If you make use of multi-region, we also provide the [EU](https://raw.githubusercontent.com/RWS/language-cloud-public-api-postman/refs/heads/develop/Trados%20EU.postman_environment.json?raw=true) and [CA](https://raw.githubusercontent.com/RWS/language-cloud-public-api-postman/refs/heads/develop/Trados%20CA.postman_environment.json?raw=true) Postman Environments.
+
+There are 3 setup options:
+- Copy the collection URL from above and import it into Postman using `Import > Link`.
+- Copy the entire file content and import it into Postman using `Import > Raw Text`.
+- Save it as a `JSON` file on your computer and import it into Postman using `Import > File`.
+
+
+
+
+
+
+## Configuration
+
+The imported collection is already set up for you to get started as fast as possible.
+
+We make use of collection level variables and an inherited authentication mechanism.
+
+For example, authentication is already set up to use the Bearer Token scheme and will use the token value provided by `{{lc-access-token}}` variable. This token is populated with the correct value, each time you `Obtain a client credentials access token`, via the Tests tab.
+
+One thing you need to do before proceeding is to fill in the `{{lc_tenant}}` variable with your own tenant ID. Prepend the ID with LC- so the final value looks like this `LC-00000000000000000`.
+
+Don't forget to save the collection!
+
+
+
+
+
+
+## Multi-region environments
+If you have imported the regional Postman Environments, please note that any environment-level variables (e.g., `baseUrl`) will overwrite collection variables. This means that when you have an environment selected in Postman, the value of `baseUrl` will be the one defined in the environment, not the value defined at the collection level.
+
+
+## Authentication
+To start working with the Trados Cloud Platform API, you first need to authenticate.
+
+You can find the authentication call under the `Authentication (Start Here)` folder. Fill in your `client_id` and `client_secret` and perform the request.
+
+If the authentication is successful, the token will be extracted automatically from the response and saved to the `{{lc-access-token}}` variable.
+
+
+
+
+
+
+
+## Usage
+
+After you have authenticated successfully, you can start interacting with the Trados Cloud Platform API.
+
+For example, we can get information about a project by using the **GetProject** request from the **Project** folder.
+
+Simply fill in your `projectId` and click SEND. Optionally, you can supply values to the `fields` parameter to receive only data that is of interest.
+
+
+
+
+> IMPORTANT: make sure you are not sending any query parameters with default Postman values. If you are sending any parameters, make sure you are sending valid data or else you will get an API Error.
+
+
+
diff --git a/articles/LCPublicAPI/docs/Language-codes.md b/articles/LCPublicAPI/docs/Language-codes.md
new file mode 100644
index 0000000..5c73090
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Language-codes.md
@@ -0,0 +1,13 @@
+# Language Codes
+
+When getting a response that contains language codes, the case of the language code is not guaranteed and should be treated as case insensitive.
+
+For example the Trados Cloud Platform API can return the same language code but with different casing on different endpoints:
+
+- en-US
+- en-us
+- EN-US
+
+All 3 variants are equivalent.
+
+When making a request to the Trados Cloud Platform API, you should still ensure the correct casing of language codes, to avoid any unexpected situations.
\ No newline at end of file
diff --git a/articles/LCPublicAPI/docs/Multi-region.md b/articles/LCPublicAPI/docs/Multi-region.md
new file mode 100644
index 0000000..4977dd5
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Multi-region.md
@@ -0,0 +1,23 @@
+---
+stoplight-id: nfdrob1smwn00
+---
+
+# Multi-region
+
+Trados Cloud Platform operates in multiple regions, and it's essential to know how to use the Public API correctly for each region.
+
+Each region has a unique Public API host, and all requests must be specific to that region. If you try to access accounts or data not available in a region, you will encounter errors.
+
+## Legacy integrations
+
+The domains for the Trados Cloud Platform API have been updated. If you are using the old domain `lc-api.sdl.com` in a legacy integration, please consider the following options:
+- Use the new endpoints to discover the correct Public API host for your desired region.
+- If you are only integrating with the EU region (legacy), update the host to: `api.eu.cloud.trados.com`
+
+## Supporting multi-region
+
+This information is especially relevant if you are building multi-tenant integrations.
+
+The provided .NET and Java SDKs already support multiple regions. For details on using these SDKs, refer to their documentation.
+
+> If you're building your own client, avoid hard-coding Trados Cloud Platform API hosts, as new regions may be added in the future, requiring updates to hard-coded hosts. You can discover all available regions and their corresponding Public API hosts using the [List Regions](../api/Global-Public-API.v1-fv.html#/operations/ListRegions) endpoint from the new Global Public API, which is accessible on a new global host `api.cloud.trados.com`.
diff --git a/articles/LCPublicAPI/docs/Public-API-Management-Process.md b/articles/LCPublicAPI/docs/Public-API-Management-Process.md
new file mode 100644
index 0000000..5d3c92b
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Public-API-Management-Process.md
@@ -0,0 +1,61 @@
+# Trados Cloud Platform API Management Process
+
+
+## Overview
+By using continuous delivery, our team regularly updates the Trados Cloud Platform API with new functionality, bug fixes and performance improvements.
+
+Find below the defined process (lifecycle policy) we use that enables us to maintain a set of stable APIs.
+
+Every release is announced on the [What's new](../docs/Whats-New.md) page in our API Docs.
+
+## What is a breaking change?
+- Changing the type of a field
+- Modifying a field name
+- Marking an existing field as required with no default value
+- Introducing a new validation
+- Enforcing validations
+- Removing or renaming enum values
+- Removing fields from response
+
+## What isn't a breaking change?
+- Adding new endpoints
+- Adding optional request fields
+- Adding new fields in responses
+- Adding new field as required with default value
+- Changing of error messages description
+- Adding enum values
+
+## Endpoint retirement process
+Retirement of an endpoint will happen in two phases: deprecation and sunset.
+
+Deprecation will be marked accordingly with IETF's [deprecation http-response-header-field](https://datatracker.ietf.org/doc/draft-dalal-deprecation-header/) with:
+- a date in the future: representing the date, when the endpoint will be marked as deprecated
+- a date in the past: representing the date, when the endpoint was marked as deprecated
+- true: simply signal to the clients, that the endpoint is deprecated
+
+The deprecation period is six months.
+
+Sunset marks the point in time where the endpoint will not return the expected response. The endpoint will still be functional until sunset.
+
+Together with the deprecation header, a new sunset-header will be introduced to mark the date of the sunset.
+
+## How will we communicate an eventual breaking change or endpoint retirement?
+An eventual breaking change or an endpoint retirement will be announced:
+- on the [What's new](../docs/Whats-New.md) page in our API Docs
+- on the [What's deprecated](../docs/Whats-deprecated.md) page in our API Docs
+- on the developers [GitHub](https://developers.rws.com/languagecloud-api-docs/index.html) page
+- on a new blog post in the [Language Developers Blog](https://community.rws.com/developers-more/developers/language-developers/b/language-developers-blog) and [Trados Blog](https://community.rws.com/product-groups/trados-portfolio/trados-live/b/blog)
+
+Any breaking change will be announced six months in advance.
+
+
+> #### Info
+>
+> We may introduce breaking changes for critical bugs or security vulnerabilities.
+
+## What is our process for testing changes before releasing them to the Trados Cloud Platform API?
+All changes undergo comprehensive testing and validation, following our deployment chronology in both non-customer and customer facing environments.
+
+As part of development, unit and contract tests are built as appropriate and undergo in-depth code review before being merged into master.
+
+As part of testing, once the changes are merged, they are tested according to our testing strategy, where testing scope and test coverage are identified. A test plan for the changes is created and quality assurance engineers decide upon manual and automation testing percentage to ensure the feature is implemented according to the specifications. On top of this we make sure regressions are not introduced by running the automated tests we have in place, as part of the release pipeline. Before new code is deployed to an environment (either customer or non-customer facing), all smoke tests must pass.
diff --git a/articles/LCPublicAPI/docs/Service-credentials.md b/articles/LCPublicAPI/docs/Service-credentials.md
new file mode 100644
index 0000000..75e7290
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Service-credentials.md
@@ -0,0 +1,43 @@
+# Service Credentials
+
+Before service users can authenticate with the Trados Cloud Platform API, they need to get their client credentials from a Trados Cloud Platform administrator. Service users can then use their client credentials to authenticate with the API via an Auth0 access token.
+
+## Step 1: Trados Cloud Platform administrators add service users to the Trados Cloud Platform account.
+
+1. Log in to the Trados UI as a human **Administrator** user type or contact the administrator to perform the operations in this section.
+2. Go to the **Users** view and select the **Service Users** sub-tab.
+3. Select **New Service User** and enter the following information:
+ - **Name** – Enter a unique name for your service user.
+ - **Location** – Select a location (the **Root** folder or any of its children) for your service user. A location is a folder in your account hierarchy where resources are stored and managed.
+ - **Groups** – Select one or more groups (from the same **Location** as the one selected above) where you want to include your service user. Each group corresponds to a predefined role, and each predefined role has a set of permissions. Resource access is influenced by the role you choose.
+ - (Optional) **Description** – Enter any other relevant details.
+4. Select **Create**.
+
+## Step 2: Trados Cloud Platform administrators add additional notification options for service users
+
+1. Log in to the Trados UI as a human **Administrator** user type or contact the administrator to perform the operations in this section.
+2. Go to the **Users** view and select the **Service Users** sub-tab.
+3. Select the service user to be edited
+4. **Additional users to notify** - Add existing users to be notified of actions via email.
+4. Select **Save**.
+
+## Step 3: Trados Cloud Platform administrators create a custom application, assign the service user to it, and retrieve the client credentials from within this application.
+
+1. Log in to the Trados UI as a human **Administrator** user type or contact the administrator to perform the operations in this section.
+2. Expand the account menu on the top right-hand corner and select **Integrations**.
+3. Select the **Applications** sub-tab.
+4. Select **New Application** and enter the following information:
+ - **Name** – Enter a unique name for your custom application.
+ - (Optional) **URL** – Enter your custom application URL.
+ - (Optional) **Description** – Enter any other relevant details.
+ - **Service User** – Select a service user from the dropdown menu.
+5. Select **Add**.
+6. Back in the **Applications** sub-tab, select the check box corresponding to your application.
+7. Select **Edit**.
+8. On the **Overall Information** page you can change any of the following, if necessary: name, URL, description.
+9. On the **Webhooks** page you can:
+ - Enter a default callback URL for your application Webhooks (all Webhooks defined in Trados Cloud Platform).
+ - Enter a value for **Webhook URL** (this is your Webhook endpoint URL which you expose and which Trados Cloud Platform calls), select one or more event types, and hit Enter. You can create a separate webhook for every event you are interested in or combine notifications for multiple event types to one webhook. If you delete your application, all its associated webhooks are also deleted.
+10. Finally, from the **API Access** page you can retrieve your **Client ID** and **Client Secret**.
+
+> Although you have the option to change the **Service User** later on, it is not recommended. Due to the caching layers, changes from one **Service User** to another can take between 10 to 20 minutes to fully take effect. During this period, calls made with this **Application**'s credentials may randomly use either the new or the old **Service User.** If you can't stop your services to wait for the cache to expire, it's recommended to create a new **Application** with the new **Service User** and delete the old one.
\ No newline at end of file
diff --git a/articles/LCPublicAPI/docs/Service-users-and-custom-applications.md b/articles/LCPublicAPI/docs/Service-users-and-custom-applications.md
new file mode 100644
index 0000000..2a1b398
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Service-users-and-custom-applications.md
@@ -0,0 +1,20 @@
+# Service users and custom applications
+
+Service users are special users created when developing custom applications that integrate with the Trados Cloud Platform API.
+
+Service users:
+- Are non-human users
+- Don’t have login credentials
+- Can only access Trados Cloud Platform via the Trados Cloud Platform API
+
+### Who can create service users?
+
+Service users are managed by administrators within a Trados Cloud Platform account. Administrators add service users to one or more groups. Once service users become part of a group, they automatically get a role, namely the group role which is associated with a predefined set of permissions. Service users access resources based on the permissions associated with the group (role) they belong to.
+
+### How are service users assigned to custom applications?
+
+When Trados Cloud Platform administrators create a custom application from the Trados UI, they assign one service user per application.
+
+### How does the authentication process of service users work?
+
+Whenever a third-party client authenticates with the application credentials, calls against the Trados Cloud Platform API will assume the identity of the service user within the platform for the purpose of authorizing access to data.
diff --git a/articles/LCPublicAPI/docs/Track-projects.md b/articles/LCPublicAPI/docs/Track-projects.md
new file mode 100644
index 0000000..0d36e1c
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Track-projects.md
@@ -0,0 +1,6 @@
+# Track projects
+
+After you create a project, you can track it by making a `GET` request to the [`/projects/{projectId}`](../api/Public-API.v1-fv.html#/operations/GetProject) endpoint to obtain information such as: creation date, due date, status, and resources used.
+
+When requesting a list of projects, you can filter out projects that have a file download restriction by sending the `excludeOnline` query parameter.
+
diff --git a/articles/LCPublicAPI/docs/Update-project-quote.md b/articles/LCPublicAPI/docs/Update-project-quote.md
new file mode 100644
index 0000000..93983e6
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Update-project-quote.md
@@ -0,0 +1,426 @@
+# Update project quote
+To update a quote, make a `PUT` request to the [`/projects/{projectId}`](../api/Public-API.v1-fv.html#/operations/UpdateProject) end point, and specify the `quote` field.
+
+## Cost types
+
+There are two types of translation costs that can be updated using the Trados Cloud Platform API:
+- **Language Costs**
+ - Costs that are applied at language level: *volume, percentage, hourly, per page, conditional*
+- **Project Costs**
+ - Costs that are applied at project level as additional cost: *volume, percentage, hourly, per page, conditional, per file, per target language*
+
+
+## Cost types available at project and language level
+
+> Note: Both language costs and project costs have identical request/response bodies, but for `languageCosts`, the `targetLanguage` field is required.
+
+
+The examples below use the following translation costs:
+
+```json
+...
+{
+ "translationCosts": [{
+ "total": 85.4,
+ "targetLanguage": {
+ "languageCode": "fr-FR",
+ "englishName": "French (France)"
+ },
+ "new": {
+ "count": 854.0,
+ "rate": 0.1,
+ "total": 85.4,
+ "runningTotal": 85.4
+ }
+ }
+ ]
+}
+...
+```
+
+### Volume
+
+This is a fixed per word/character cost.
+
+***Request***:
+```json
+...
+{
+ "name": "Volume Cost",
+ "costOrder": 0,
+ "cost": 0.5,
+ "volumeUnitType": "Words",
+ "costType": "volume"
+ ...
+}
+...
+```
+
+The total cost is calculated as `number of words/characters` * `cost of a unit`:
+
+**`total = count * cost`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Volume Cost",
+ "count": 854.0,
+ "total": 427.0,
+ "cost": 0.5,
+ "costType": "volume",
+ "volumeUnitType": "words",
+ "costOrder": 0,
+ "runningTotal": 512.4
+ ...
+}
+...
+```
+
+The running total up until this point is equal to `total cost of the current additional cost` + `translation costs`.
+Using the data above, we can get the following running total:
+
+**`85.4 + 427 = 512.4`**
+
+### Percentage
+
+This is a percentage cost calculated against the current cost (current language-level cost or current project-level cost).
+
+***Request***:
+
+```json
+...
+{
+ "name": "Percentage Cost",
+ "costOrder": 1,
+ "count": -10,
+ "costType": "percentage"
+ ...
+}
+...
+```
+
+The `total cost of the current additional cost` is calculated using the value from the `count` field as a percentage from the previous `running total`.
+
+**`total = count% * previousRunningTotal`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Percentage Cost",
+ "count": -10.0,
+ "total": -51.24,
+ "cost": 0.0,
+ "costType": "percentage",
+ "costOrder": 1,
+ "runningTotal": 461.16
+ ...
+}
+...
+```
+
+Since the previous `running total` is **512.4**, the total cost of the `current additional cost` is calculated as follows:
+
+**`total = -10% * 512.4 = -51.24`**
+
+As a result, the new running total becomes:
+
+**`runningTotal = 512.4 - 51.24 = 461.16`**
+
+### Hourly
+
+This is a fixed cost per hour.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Hourly Cost",
+ "costOrder": 2,
+ "count": 5,
+ "cost": 1.5,
+ "costType": "hourly"
+ ...
+}
+...
+```
+
+The total cost is calculated as `number of hours` * `cost of an hour`:
+
+**`total = count * cost`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Hourly Cost",
+ "count": 5.0,
+ "total": 7.5,
+ "cost": 1.5,
+ "costType": "hourly",
+ "costOrder": 2,
+ "runningTotal": 468.66
+ ...
+}
+...
+```
+
+**`total = 5 * 1.5 = 7.5`**
+
+**`runningTotal = 461.16 + 7.5 = 468.66`**
+
+### Per Page
+
+This is a fixed cost per page.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Per Page Cost",
+ "costOrder": 3,
+ "count": 10,
+ "cost": 0.2,
+ "costType": "perPage"
+ ...
+}
+...
+```
+
+
+The total cost is calculated as `number of pages` * `cost of a page`:
+
+**`total = count * cost`**
+
+***Response***:
+
+```json
+...
+{
+ "name": "Per Page Cost",
+ "count": 10.0,
+ "total": 2.0,
+ "cost": 0.2,
+ "costType": "perPage",
+ "costOrder": 3,
+ "runningTotal": 470.66
+ ...
+}
+...
+```
+
+**`total = 10 * 0.2 = 2`**
+
+**``runningTotal = 468.66 + 2 = 470.66``**
+
+### Conditional
+
+This is a cost that is applied conditionally, for example:
+
+***Request***:
+
+```json
+...
+{
+ "name": "Conditional Cost",
+ "costOrder": 4,
+ "conditionalCostVariable": "wordCount",
+ "conditionalCostOperator": "less",
+ "conditionalCostThreshold": 1000,
+ "cost": 100,
+ "conditionalCostType": "relative",
+ "costType": "conditional"
+ ...
+}
+...
+```
+
+If `[conditionalCostVariable]` `[conditionalCostOperator]` `[conditionalCostThreshold]`, then add/set `[cost]` `[conditionalCostType]`.
+
+This formula translates to the following:
+
+If `wordCount < 1000`, then add `100 relative`.
+
+***Response***:
+
+```json
+...
+{
+ "name": "Conditional Cost",
+ "count": 854.0,
+ "total": 100.0,
+ "cost": 100.0,
+ "costType": "conditional",
+ "costOrder": 4,
+ "conditionalCostType": "relative",
+ "conditionalCostOperator": "less",
+ "conditionalCostVariable": "wordCount",
+ "conditionalCostThreshold": 1000.0,
+ "runningTotal": 570.66
+ ...
+}
+...
+```
+Since the word count (`count`) is 854 (in the example above), the condition becomes:
+
+If `854 < 1000` then add `100 relative`. => `true`
+
+**`total = cost = 100`**
+
+**`runningTotal = 470.66 + 100 = 570.66`**
+
+The total cost depends on the `conditionalCostType` field and on whether the condition evaluates to `true` or `false`.
+When the condition evaluates to `false`, the total will be 0, and the running total will not change.
+
+If `854 > 1000`, then add `100 relative`. => `false`
+
+**`total = cost = 0`**
+**`runningTotal = 470.66`**
+
+
+For the same values as above, and the `conditionalCostType` set to `percentage`, the `total` and `runningTotal` values will change to:
+
+**`total = 100% * 470.66 = 470.66`**
+
+**`runningTotal = 470.66 + 470.66 = 941.32`**
+
+When the `conditionalCostType` is set to `absolute`, the total will be equal to the difference between the `cost` and the `runningtotal`:
+
+**`total = 100 - 470.66 = -370.66`**
+
+**`runningTotal = 100`**
+
+> **Note:** Setting `conditionalCostType` to `absolute` will cancel all the previous costs for the project or target language.
+
+## Cost types available ONLY at project level
+
+### Per Target Language
+
+This is an additional cost that is calculated based on the number of target languages in the project.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Per Target Language",
+ "costOrder": 5,
+ "cost": 5,
+ "costType": "perTargetLanguage"
+}
+...
+```
+
+The total cost is calculated as `number of target languages` * `cost of a target language`:
+
+***Response***:
+```json
+...
+{
+ "name": "Per Target Language",
+ "count": 1.0,
+ "total": 5.0,
+ "cost": 5.0,
+ "costType": "perTargetLanguage",
+ "costOrder": 5,
+ "runningTotal": 575.66
+}
+...
+```
+
+Since there is only one target language in the example above, the total cost becomes:
+**`total = 1 * 5 = 5`**
+**`runningTotal = 570.66 + 5 = 575.66`**
+
+### Per File
+
+This is an additional cost that is calculated based on the number of files in the project.
+
+***Request***:
+
+```json
+...
+{
+ "name": "Per File",
+ "costOrder": 6,
+ "cost": 3,
+ "costType": "perFile"
+}
+...
+```
+
+The total cost is calculated as `number of files` * `cost of a file`:
+
+***Response***:
+```json
+...
+{
+ "name": "Per File",
+ "count": 2.0,
+ "total": 6.0,
+ "cost": 3.0,
+ "costType": "perFile",
+ "costOrder": 6,
+ "runningTotal": 581.66
+}
+...
+```
+**`total = 2 * 3 = 6`**
+**`runningTotal = 575.66 + 6 = 581.66`**
+
+## Cost order
+
+The `costOrder` field defines the order in which costs are calculated.
+
+For example, if there are two additional costs defined in the quote (see below), the percentage cost is calculated based on the running total from the volume cost.
+
+```json
+...
+{
+ "name": "Volume Cost",
+ "total": 427.0,
+ "costType": "volume",
+ "costOrder": 0,
+ "runningTotal": 512.4
+...
+},
+{
+ "name": "Percentage Cost",
+ "total": -51.24,
+ "count": -10.0,
+ "costType": "percentage",
+ "costOrder": 1,
+ "runningTotal": 461.16
+...
+}
+...
+```
+
+When the `costOrder` field is switched, the `total` percentage cost value will be calculated based on the previous running total, which in this case is the translation cost (**85.4**):
+```json
+...
+{
+ "name": "Percentage Cost",
+ "count": -10.0,
+ "total": -8.54,
+ "costType": "percentage",
+ "costOrder": 0,
+ "runningTotal": 76.86
+...
+},
+{
+ "name": "Volume Cost",
+ "total": 427.0,
+ "costType": "volume",
+ "costOrder": 1,
+ "runningTotal": 503.86
+...
+}
+...
+```
diff --git a/articles/LCPublicAPI/docs/Updating-data-with-PUT.md b/articles/LCPublicAPI/docs/Updating-data-with-PUT.md
new file mode 100644
index 0000000..6918108
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Updating-data-with-PUT.md
@@ -0,0 +1,18 @@
+# Updating data with PUT
+
+All update endpoints follow the rules listed in [JSON Merge Patch Semantics](https://tools.ietf.org/html/rfc7386).
+
+### Pay special attention when updating array fields
+
+The update overrides the entire array, not just the elements that are sent. See the following example:
+
+| ORIGINAL | PATCH | RESULT |
+|:--- | :--- | :--- |
+|`{"a" :[{"b": "c"}]}`| `{"a" :[1]}` | `{"a" :[1]}`|
+
+
+If you don't send the "b" element from array "a", the element "b" will be removed from result after the update operation.
+
+If you send a new array element `[1]`, this element will be added into the result.
+
+Updating an existing array element requires that you send the original array with a new value for the desired element.
\ No newline at end of file
diff --git a/articles/LCPublicAPI/docs/Use-fields-in-your-requests.md b/articles/LCPublicAPI/docs/Use-fields-in-your-requests.md
new file mode 100644
index 0000000..c0951e4
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Use-fields-in-your-requests.md
@@ -0,0 +1,54 @@
+# Use fields in your requests
+
+All the endpoints that return a resource representation allow the `fields` query parameter. Fields are used to specify the property values you want returned for your entities.
+
+When you make a call using the `fields` query parameter, make sure that you:
+- Separate the fields by commas.
+- Query by `properties` and/or `subproperties`. Write `subproperties` in the following format: `propertyname.subpropertyname`.
+- Familiarize yourself with the elements that get returned:
+ - The fields marked as “**required**” are always returned.
+ - If fields are not customized for a given level and the requested field is non null then the default fields will be returned.
+ - If fields are customized for a given level and the requested field is non null, the fields you requested will be returned.
+ - The rules above are applied at nested level as well.
+
+Let’s look at an example to understand how the `fields` parameter can be used.
+We will perform a `GET` request to the [`/projects/projectId`](../api/Public-API.v1-fv.html#/operations/GetProject) endpoint and we will consider that in our example the `projectId`= 101.
+
+#### 1. Fields consist of properties and subproperties. Here are some examples:
+- `Properties`: `id`; `name`; `customer`; `createdBy` and so on
+- `Subproperties`: `customer.name`; `customer.keyContact`; `customer.Location`; `createdBy.email` and so on
+
+#### 2. You can make calls in several ways:
+- No field customization
+
+Request: `GET/projects/101`
+
+Response: the project **identifier**, the project **name**, the project **language directions**
+
+
+
+
+* Field customization (no nesting)
+
+Request: `GET/projects/101?fields=customer`
+
+Response: the project **identifier**; the customer **identifier**; the customer **name**; the customer’s **key contact**; the customer **location**
+
+
+
+
+* Field customization (nesting)
+
+Request: `GET/projects/101?fields=customer.keyContact,customer.name`
+
+Response: the project **identifier**; the customer **name**; the customer’s **key contact**
+
+
+
+
diff --git a/articles/LCPublicAPI/docs/Use-paging-and-sorting-for-lists.md b/articles/LCPublicAPI/docs/Use-paging-and-sorting-for-lists.md
new file mode 100644
index 0000000..4ed1872
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Use-paging-and-sorting-for-lists.md
@@ -0,0 +1,26 @@
+# Use paging and sorting for lists
+
+When the outcome of a `GET` call is a list of items (item properties and total count), you can control the number of results displayed on a page as well as sort the results.
+
+To control the number of results displayed on a page, do the following:
+
+- To retrieve the full size of an entity, make a `GET` call to its corresponding endpoint.
+
+For example, make a `GET` call to the [`/projects`](../api/Public-API.v1-fv.html#/operations/ListProjects) endpoint. The result consists in a list of all the projects (and their details) as well as a project count. The project count field returns the same value even if you further apply the `top` or `skip` query parameters.
+
+- To display only the first 10, 20, 30 (and so on) results in your list, use the `top` query parameter.
+
+For example, for the [`/projects`](../api/Public-API.v1-fv.html#/operations/ListProjects) endpoint, your query may look like this if you are interested in the first 10 projects: `/projects?top=10`
+
+- To get to a particular set of retrieved results in your list, use the `skip` query parameter.
+
+For example, for the [`/projects`](../api/Public-API.v1-fv.html#/operations/ListProjects) endpoint, if you want to skip the first 100 results, your query will look like this: `/projects?skip=100`.
+
+- To sort your list by certain properties, use the `sort` query parameter.
+
+The default sorting strategy is ascending. Add unary operators for ascending (+) and descending (-) sorting. If you do not add any operator, the default ascending strategy kicks in.
+
+For example, if you want to sort results by due date (-) and name (+), your query will look like this: `/projects?sort=-dueBy,name`.
+
+Note that sorting can be performed only on first-level fields (not nested fields), for naturally comparable types like strings, numbers, and dates.
+
diff --git a/articles/LCPublicAPI/docs/Whats-New.md b/articles/LCPublicAPI/docs/Whats-New.md
new file mode 100644
index 0000000..8f7da76
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Whats-New.md
@@ -0,0 +1,383 @@
+# What's new
+
+
+
+## 10 September 2025
+- With this release we deliver [Lookup](../api/Public-API.v1-fv.html#/operations/TranslationsLookup), [Concordance](../api/Public-API.v1-fv.html#/operations/TranslationsConcordanceSearch), [Add](../api/Public-API.v1-fv.html#/operations/TranslationsAdd) and [Update](../api/Public-API.v1-fv.html#/operations/TranslationsUpdate) translation units to a translation memory. See [this](./translations/Translations.md) page for more details.
+- You can now [obtain](../api/Public-API.v1-fv.html#/operations/GetTranslationEngine) and [update](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) the resources sequence information for a Translation Engine.
+- A new project event `PROJECT.STARTED` has been added. See [this](./webhooks/Webhooks-payload.md) page for more details.
+
+
+## 18 August 2025
+
+- The new, modernized Trados Cloud Platform SDK for Java is now available. See the upgrade guide [here](../docs/api-clients/java/Java-Client-Upgrade-Guide.md).
+
+## 12 August 2025
+
+- You can now get word count and cost estimation analysis of files without the need to create a project. The functionality is accessible via the [Request File Analysis](../api/Public-API.v1-fv.html#/operations/RequestFileAnalysis) and [Poll File Analysis](../api/Public-API.v1-fv.html#/operations/PollFileAnalysis) endpoints.
+- As previously announced, the `languageProcessingRuleId` parameter is now mandatory for [Update Translation Engine](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) endpoint.
+- We fixed various bugs.
+
+## 15 July 2025
+- You can now add the `systemStatus` property on termbase entries. See [Update Termbase Entry](../api/Public-API.v1-fv.html#/operations/UpdateTermbaseEntry).
+- We've improved the documentation around zip files on [Add Source File](../api/Public-API.v1-fv.html#/operations/AddSourceFile) and [Attach Source File](../api/Public-API.v1-fv.html#/operations/AddSourceFiles) endpoints.
+- As a reminder, we want to let our users know that the field `languageProcessingRuleId` under [Update Translation Engine](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) endpoint will be mandatory.
+- [Import Termbase](../api/Public-API.v1-fv.html#/operations/ImportTermbase) and [Poll Termbase Import](../api/Public-API.v1-fv.html#/operations/PollTermbaseImport) endpoints will return `pending` instead of `queued` for the status. This change is scheduled to take effect no sooner than six months from now.
+
+## 8 May 2025
+- You can now download the target files associated with a project in a ZIP format. This functionality is accessible through three endpoints: [Export](../api/Public-API.v1-fv.html#/operations/ExportProjectFiles), [Poll](../api/Public-API.v1-fv.html#/operations/ExportProjectFilesStatus), and [Download](../api/Public-API.v1-fv.html#/operations/DownloadFile).
+- With this release we deliver the [Create](../api/Public-API.v1-fv.html#/operations/CreatePricingModel), [Update](../api/Public-API.v1-fv.html#/operations/UpdatePricingModel) and [Delete](../api/Public-API.v1-fv.html#/operations/DeletePricingModel) pricing model endpoints. Together with these, several changes were required to correct the pricing model response:
+ - `name` : changed from required to default.
+ - `additionalCosts.volumeUnitType` changed from required to non required.
+ - `additionalCosts.conditionalCostType` changed from required to non required.
+ - `additionalCosts.costOperator` changed from required to non required.
+ - `additionalCosts.costVariable` changed from required to non required.
+ - `additionalCosts.operand` changed from required to non required.
+ - `perTargetLanguage` and `perFile` cost types have been removed from `languageCosts` to clean up the structure.
+
+- We have expanded the cost types by introducing two new values: **adhoc** and **adhoc volume**.
+- Import and Export TM endpoints are now subject to API limits. For more details, please refer to [this page](../docs/API-rate-limits.md).
+- We updated the [Java Client samples](../docs/api-clients/java/Java-Samples.md) to reflect the usage of the latest version.
+- We fixed various bugs.
+
+## 1 April 2025
+- As part of the Connected AI feature, we have added the following updates and new endpoints:
+ - We have introduced a new endpoint for listing [Large Language Models](../api/Public-API.v1-fv.html#/operations/ListLlmConfigurations) (LLMs).
+ - We have added the functionality to [update your translation engines](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) with the new LLM resource type.
+- We have added the source word count to the [List Source Files](../api/Public-API.v1-fv.html#/operations/ListSourceFiles) endpoint.
+- We fixed various bugs.
+
+
+## 10 March 2025
+
+- We've introduced the concept of [Batched Webhooks](../docs/webhooks/Batched-webhooks.md).
+- We've updated the models for [Import Translation Memory](../api/Public-API.v1-fv.html#/operations/ImportTranslationMemory), [Export Translation Memory](../api/Public-API.v1-fv.html#/operations/ExportTranslationMemory) and [Get Translation Memory Import History](../api/Public-API.v1-fv.html#/operations/GetTMImportHistory).
+ - As part of this, the existing `status` field is now marked as deprecated in the response model of [Import Translation Memory](../api/Public-API.v1-fv.html#/operations/ImportTranslationMemory) and [Export Translation Memory](../api/Public-API.v1-fv.html#/operations/ExportTranslationMemory).
+ - Additionally, the fields `importAsPlainText` and `triggerRecomputeStatistics` are marked as deprecated in the request model of [Import Translation Memory](../api/Public-API.v1-fv.html#/operations/ImportTranslationMemory) and in the response model of [Get Translation Memory Import History](../api/Public-API.v1-fv.html#/operations/GetTMImportHistory), alongside the `traceId` field.
+ - Their decommissioning is scheduled at a minimum of six months from now.
+
+
+## 10 December 2024
+- You can now associate existing users with a service user to notify them of actions via email, using Trados UI. More details [here](../docs/Service-credentials.md#step-2-trados-cloud-platform-administrators-add-additional-notification-options-for-service-users).
+- We have officially rebranded from RWS Language Cloud API to Trados Cloud Platform API. All references to our previous brand name will now reflect our new identity, Trados.
+- Provided [Postman Environments](../docs/Language-Cloud-APIs-for-Postman.md) for multi-region.
+
+## 18 November 2024
+- As part of our multi-region support, we have added global endpoints to facilitate the discovery of available regions and hosts. For more details, see the [Multi-region](../docs/Multi-region.md) page.
+- We have updated the documentation on how to use the new SDK with multi-region features.
+- Additionally, we made various minor contract corrections.
+- As a reminder, we want to let our users know that the field `languageProcessingRuleId` under [Update Translation Engine](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) endpoint will become mandatory.
+
+## 6 November 2024
+- We are planning to transition the hosting of our API from **lc-api.sdl.com** to **api.eu.cloud.trados.com** on November 9th:
+
+ - **lc-api.sdl.com** for API and integrations will remain active.
+
+ - Existing integrations will continue to work as before. We do recommend planning to change the URL when possible.
+
+ - For new integrations, we recommend using the new URL to avoid additional work in the future.
+
+- You now have the ability to add notes to customer quotes.
+
+ - We have updated the deprecated types for the `language` and `targetLanguages` fields in the [Add Source File Request](../api/Public-API.v1-fv.html#/schemas/source-file-request) model, which now reference [Language Request](../api/Public-API.v1-fv.html#/schemas/language-request) model. In the updated API contract, these fields have been changed from simple strings to structured objects containing a `languageCode` property, enhancing clarity and consistency in language handling.
+
+ > We will provide backwards compatibility until May 2025. However, starting with this release, SDKs will be updated to use the new types. Please ensure your integration is updated to use the new [Language Request](../api/Public-API.v1-fv.html#/schemas/language-request) model.
+
+- We fixed various bugs.
+## 11 September 2024
+
+- With this release we deliver the [PerfectMatch](https://docs.rws.com/791595/1155478/trados-enterprise---accelerate/perfectmatch-general-information) functionality. You can apply PerfectMatch either at the start of a project or midway through the translation process. These capabilities are accessible via the [PerfectMatch Mapping](../api/Public-API.v1-fv.html#/operations/CreatePerfectMatchMapping) menu.
+- We've improved filtering for projects lists. See the [List Projects](../api/Public-API.v1-fv.html#/operations/ListProjects) endpoint.
+- A recent update has been made to the [Webhooks Setup](../docs/webhooks/Webhooks-setup.md) page, informing the customers that the order of webhook event deliveries cannot be guaranteed. Please take this into consideration using the `timestamp` field to determine the event generation time.
+- You can now set due dates for tasks during project creation.
+- We fixed various bugs.
+
+
+## 28 August 2024
+- We have introduced a new option which allows users to switch to a different pricing model at the Customer Quote Review task using the dedicated endpoint [Update Project Pricing Model](../api/Public-API.v1-fv.html#/operations/UpdateProjectPricingModel).
+- You now have the ability to view the locking color options for MTQE segments by utilizing the [Get Project Template](../api/Public-API.v1-fv.html#/operations/GetProjectTemplate) endpoint.
+- The parameter `termbaseStructure.fields.type` in the [Get Termbase](../api/Public-API.v1-fv.html#/operations/GetTermbase) endpoint is no longer marked as mandatory.
+- We fixed various bugs.
+
+## 1 July 2024
+- We updated the folder/resource locations to the new format, which now includes the [path](../api/Public-API.v1-fv.html#/schemas/folder).
+- We fixed various bugs.
+
+## 9 May 2024
+
+- You can configure the number of days after which projects are given the Completed or Archived status automatically using the `completionConfiguration` option under the following endpoints: [Create](../api/Public-API.v1-fv.html#/operations/CreateProject) and [Update](../api/Public-API.v1-fv.html#/operations/UpdateProject) Project, [Create](../api/Public-API.v1-fv.html#/operations/CreateProjectTemplate) and [Update](../api/Public-API.v1-fv.html#/operations/UpdateProjectTemplate) Project Template.
+- The field `languageProcessingRuleId` under [Update Translation Engine](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) endpoint will become mandatory. The enforcement is scheduled at a minimum of six months from now.
+- As a reminder, we want to let our users know that we updated the folder/resource locations to the new format, which now includes the [path](../api/Public-API.v1-fv.html#/schemas/folder-v2). The old fields are marked as deprecated and their decommissioning is planned for near future. Please ensure you update the implementation if you are using fields that are marked as deprecated.
+- We fixed various bugs.
+
+## 8 April 2024
+
+- We extended the information available on the webhooks setup page, [Circuit Breaker](../docs/webhooks/Webhooks-setup.md#circuit-breaker) section.
+- We removed the `languageId` allowed values for the [Export Quote Report](../api/Public-API.v1-fv.html#/operations/ExportQuoteReport) endpoint.
+- As a reminder, we want to let our users know that we updated the folder/resource locations to the new format, which now includes the [path](../api/Public-API.v1-fv.html#/schemas/folder-v2). The old fields are marked as deprecated and their decommissioning is planned for near future. Please ensure you update the implementation if you are using fields that are marked as deprecated.
+- We fixed various bugs.
+
+## 27 February 2024
+
+- With this release we deliver the [Update](../api/Public-API.v1-fv.html#/operations/UpdateProjectTemplate) and [Delete Project Template](../api/Public-API.v1-fv.html#/operations/DeleteProjectTemplate) endpoints. Subsequent iterations with new implementations will follow, ensuring continuous enhancement for project template update.
+- We published a new page about [multipart considerations](../docs/How-to-multipart.md)
+- We fixed various bugs.
+
+## 13 December 2023
+
+- With this release we deliver the [Create Project Template](../api/Public-API.v1-fv.html#/operations/CreateProjectTemplate) endpoint. Subsequent iterations with new implementations will follow, ensuring continuous enhancement for project template creation.
+- We enhanced the response model for the [Get Project Template](../api/Public-API.v1-fv.html#/operations/GetProjectTemplate) endpoint, which now includes settings for verification and batch tasks. The existing `forceOnline` and `quoteTemplate` fields from root level are now marked as deprecated, as they have been moved to the `settings` section. Their decommissioning is scheduled at a minimum of six months from now.
+- Webhooks will stop trying to send on urls that cause timeouts, retrying later. Read more [here](../docs/webhooks/Webhooks-setup.md#circuit-breaker).
+- We fixed various bugs.
+
+## 16 November 2023
+- We introduced the `applicableOutcomes` field under the [get task](../api/Public-API.v1-fv.html#/operations/GetTask) endpoint to be used when completing the tasks.
+- You can now change the folder visibility when updating a customer.
+- We fixed various bugs.
+
+## 17 October 2023
+- This release delivers more integrations for the customer resource type. You can now [create](../api/Public-API.v1-fv.html#/operations/CreateCustomer), [update](../api/Public-API.v1-fv.html#/operations/UpdateCustomer) and [delete](../api/Public-API.v1-fv.html#/operations/DeleteCustomer) customers.
+- We enhanced the response model for [pricing](../api/Public-API.v1-fv.html#/operations/ListPricingModels) endpoints.
+- As previously announced, we made the `dueBy`, the `location` and the `languageDirections` fields mandatory for [creating a project](../api/Public-API.v1-fv.html#/operations/CreateProject).
+- We added `deliveredBy` as a new field for the [update project](../api/Public-API.v1-fv.html#/operations/UpdateProject) capabilities.
+- We extended the information available on the [webhooks setup](../docs/webhooks/Webhooks-setup.md) page.
+- We fixed various bugs.
+
+## 06 September 2023
+- With this release we deliver the [create](../api/Public-API.v1-fv.html#/operations/CreateScheduleTemplate), [read](../api/Public-API.v1-fv.html#/operations/GetScheduleTemplate), [update](../api/Public-API.v1-fv.html#/operations/UpdateScheduleTemplate) and [delete](../api/Public-API.v1-fv.html#/operations/DeleteScheduleTemplate) endpoints of the new schedule template resource. You will find the endpoints under the [schedule templates](../api/Public-API.v1-fv.html#/operations/ListScheduleTemplates) menu. You can also retrieve the schedule template attached to a [project](../api/Public-API.v1-fv.html#/operations/GetProject) or to a [project template](../api/Public-API.v1-fv.html#/operations/GetProjectTemplate) using the relevant fields.
+- Additionally, the [create project](../api/Public-API.v1-fv.html#/operations/CreateProject) now supports the schedule template resource, either individually or from the project template.
+- We added the `apiInternalId` to [task type](../api/Public-API.v1-fv.html#/schemas/task-type) and [workflow task template](../api/Public-API.v1-fv.html#/schemas/workflow-task-template) to easily identify custom tasks.
+- We fixed various bugs.
+
+## 17 August 2023
+- We updated the folder/resource locations to the new format, which now includes the [path](../api/Public-API.v1-fv.html#/schemas/folder-v2). The old fields are marked as deprecated and their decommissioning is scheduled at a minimum of six months from now. Please ensure you update the implementation if you are using fields that are marked as deprecated.
+- Enhanced [project configuration](../api/Public-API.v1-fv.html#/operations/UpdateProjectConfiguration) now includes new choices for updating translation memory settings.
+- We fixed various bugs.
+- As a reminder, we want to let our users know that validations related to the following fields used at project creation: `dueBy`, `location` and `languageDirections` will become **required** in near future.
+
+## 02 August 2023
+- With this release we provide a new endpoint to allow integrators to update only one [custom field](../api/Public-API.v1-fv.html#/operations/UpdateCustomField) of a project
+- We extended the information available on the [webhooks](../docs/webhooks/Webhooks-payload.md) page
+- You can now update a translation engine as a stand alone resource or one that is linked to a live project. Read this [page](../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine) for more details.
+- We fixed various bugs.
+
+## 15 June 2023
+- We extended the information provided for both [source](../api/Public-API.v1-fv.html#/operations/ListSourceFileVersions) and [target](../api/Public-API.v1-fv.html#/operations/ListTargetFileVersions) files in a task with the `name`, the `version` and `originatingTaskId` details
+- We made available a new [rate-limits](../api/Public-API.v1-fv.html#/operations/ListRateLimits) endpoint and a new header which includes the relevant policy name, namely, the `X-RateLimit-Policy` header. Read the [API-rate-limits](../docs/API-rate-limits.md) page for more details.
+- We improved descriptions for the `default` and `required` fields [here](../docs/Use-fields-in-your-requests.md).
+- We updated the JAVA samples to reflect changes in the SDK.
+- We fixed various bugs.
+
+
+## 19 May 2023
+- We replaced the `friendlyId` on all Project Group endpoints with `shortId` and we've exposed it on all Project endpoints too.
+- As a security enhancement, we will restrict some characters in naming projects and project files. The unsupported characters are: `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*`.
+- In 6 months we will introduce the following breaking change: on the [Export Quote Report](../api/Public-API.v1-fv.html#/operations/ExportQuoteReport) endpoint, if the quote is not generated using a Quote Template, the response will be an empty object.
+- We will enforce validations related to the following fields at project creation: `dueBy`, `location` and `languageDirections`. These fields will become **required** in 3 months.
+- As a reminder, we want to let our users know that for security issues or bugs we may introduce breaking changes at any time.
+
+
+
+## 20 April 2023
+- With this release we enforce validations listed in the documentation for the Create and Update Project endpoints. This impacts the SDKs, so please update your integration accordingly.
+- We extended the [webhooks](../docs/Webhooks.md) functionality to support error tasks
+- We introduced the `customFields` field for project webhooks, and the `dueBy` field for task webhooks
+- We added the `name` of the `customFields` under the response for the Get Project endpoint
+- We fixed various bugs.
+
+## 21 March 2023
+- We extended the list of [webhooks](../docs/Webhooks.md) available for tasks, projects, project files, project templates and enabled the first webhook for project group
+- We fixed several bugs.
+
+## 03 March 2023
+- We introduced fields displaying the project status history and the `completedAt` date for a task.
+- We exposed the project creator as a sorting option on list projects.
+- We fixed several bugs
+- We want to remind our users we will enforce validations listed in the documentation for the Create and Update Project endpoints.
+
+## 15 February 2023
+- We enabled support for the Trados Enterprise Quote Template functionality
+- We introduced the `projectManagers` field to enable the selection of individuals or of users groups at [project creation](../api/Public-API.v1-fv.html#/operations/CreateProject).
+- We removed unnecessary outcome values for the [Task Completed Request](../api/Public-API.v1-fv.html#/schemas/task-complete-request) model on the [Complete Task](../api/Public-API.v1-fv.html#/operations/CompleteTask) operation. This impacts the SDKs, so update your integration accordingly.
+- You can now specify the `projectCreator` as an assignee type for a task when [updating a project](../api/Public-API.v1-fv.html#/operations/UpdateProject).
+- We will enforce validations related to the following fields at project creation: `dueBy`, `location` and `languageDirections`. These fields will become **required** in 6 months.
+
+
+## 11 January 2023
+
+- You can now [create](../api/Public-API.v1-fv.html#/operations/CreateProjectGroup), [read](../api/Public-API.v1-fv.html#/operations/GetProjectGroup), [update](../api/Public-API.v1-fv.html#/operations/UpdateProjectGroup) and [delete](../api/Public-API.v1-fv.html#/operations/DeleteProjectGroup) Project Groups
+- We've improved filtering for projects lists, namely by status and by creation date
+- We've introduced fields displaying more details for error tasks
+- We fixed various bugs
+
+
+## 22 November 2022
+- To enable support for the Trados Enterprise multi-source resources functionality, we're introducing an important breaking change: when creating workflows with multi-source languages from the TE UI, please use the new `languageDirection`Â scope value. As the new feature may limit previously working functionality, inconsistencies within applications or certain products may appear. For integrations that are impacted, please contact their developers to update the integrations.
+- We've made 3 new endpoints available for [TM export](../api/Public-API.v1-fv.html#/operations/ExportTranslationMemory)
+- We removed the old 10 MB size limitations for files, termbases and translation memories. We now support [these values](https://docs.rws.com/791595/815967/trados-enterprise---accelerate/file-and-project-size-limit) for files and [these values](https://docs.rws.com/791595/741139/trados-enterprise---accelerate/importing-tm-content) for importing translation memory content.
+- Users can now retrieve task comments.
+- We've added the [TM Import history](../api/Public-API.v1-fv.html#/operations/GetTMImportHistory) endpoint.
+- We are postponing the breaking change in the `LanguageDirectionRequest` model, previously announced for November, and consequently the model can be used until the end of 2022.
+- 4 new endpoints are subject to [API limits](https://languagecloud.sdl.com/lc/api-docs/d2266fabaa1bf-api-rate-limits#project-files-rate-limits)
+- We fixed various bugs.
+
+## 28 October 2022
+- You can [import translation memories](../docs/translation-memory/Translation-memory-import-export.md) using the [import](../api/Public-API.v1-fv.html#/operations/ImportTranslationMemory) and [poll](../api/Public-API.v1-fv.html#/operations/PollTMImport) endpoints. Note that the maximum size for an imported translation memory is 10 MB.
+- We added traceability fields for terminology entries: createdAt, createdBy, lastModifiedAt, lastModifiedBy
+- We added recommendations for [HTTP headers](../docs/Headers-considerations.md)
+- We updated the recommendations for [Authentication](../docs/Authentication.md) and the [API rate limits](../docs/API-rate-limits.md) with token values and other details
+- We fixed various bugs
+
+## 15 September 2022
+- We introduced a new [Export Quote Report](../docs/Export-quote-report.md) mechanism and deprecated the older endpoint
+- We updated the constrains for the 'name' and 'description' fields for the [Create Project](../api/Public-API.v1-fv.html#/operations/CreateProject) and [Update Project](../api/Public-API.v1-fv.html#/operations/UpdateProject) endpoints that will be enforced starting December 2022
+- We introduced a new page for the currently [Known issues](../docs/Known-Issues.md)
+- We fixed various bugs
+
+
+## 22 August 2022
+- You can now read [language processing rules](../api/Public-API.v1-fv.html#/operations/ListLanguageProcessingRules) and [translation memory field templates](../api/Public-API.v1-fv.html#/operations/ListFieldTemplates)
+- You can now [create](../api/Public-API.v1-fv.html#/operations/CreateTranslationMemory), [read](../api/Public-API.v1-fv.html#/operations/GetTranslationMemory), [update](../api/Public-API.v1-fv.html#/operations/UpdateTranslationMemory), [delete](../api/Public-API.v1-fv.html#/operations/DeleteTranslationMemory) and [copy](../api/Public-API.v1-fv.html#/operations/CopyTranslationMemory) translation memories
+
+## 12 August 2022
+- Retiring of the Export Quote endpoint will happen in 6 months. You can read more about it [here](../docs/Public-API-Management-Process.md#endpoint-retirement-process).
+- We now support the Export Quote Report functionality with 3 new endpoints: [Poll Quote Export Report](../api/Public-API.v1-fv.html#/operations/PollQuoteReportExport), [Export Quote](../api/Public-API.v1-fv.html#/operations/ExportQuoteReport) and [Download Exported Quote](../api/Public-API.v1-fv.html#/operations/DownloadQuoteReport).
+- You can now upload [source](../api/Public-API.v1-fv.html#/operations/AddSourceFileVersion) and [target](../api/Public-API.v1-fv.html#/operations/AddTargetFileVersion) file versions
+- We published a new page about [File formats](../docs/File-formats.md)
+- We fixed various bugs
+
+## 28 July 2022
+- We published a new page about [How to use location and folders](../docs/How-to-use-location-and-folders.md)
+- We published a new page about [How to report an API issue](../docs/How-to-report-an-issue.md)
+- We fixed various bugs
+
+## 19 July 2022
+
+- You can now update [source](../api/Public-API.v1-fv.html#/operations/UpdateSourceFile) and [target](../api/Public-API.v1-fv.html#/operations/UpdateTargetFile) file names
+- We fixed various bugs
+
+## 28 June 2022
+
+- You can now [read](../api/Public-API.v1-fv.html#/operations/GetProjectConfiguration) and [update](../api/Public-API.v1-fv.html#/operations/UpdateProjectConfiguration) translation memory settings for a project's configuration
+- We updated the user guide page for [using fields](../docs/Use-fields-in-your-requests.md) with new animated gifs
+- We fixed various bugs
+
+
+## 07 June 2022
+- We have increased the API limits, you can find the new limits on [this page](../docs/API-rate-limits.md).
+- Deprecation of the language direction code will happen in 6 months. You can read more about it [here](../docs/Whats-deprecated.md).
+- Enforce validations related to the length of the *name* and *description* fields and the accepted input values for the Create and Update Project endpoints will be delivered in 6 months.
+
+## 24 May 2022
+- To address potentially infected files, we've updated our API contracts to support In-Product Antivirus scanning
+
+## 04 May 2022
+- You can now upload a .zip archive using [this](../api/Public-API.v1-fv.html#/operations/UploadZipFile) endpoint and then [poll](../api/Public-API.v1-fv.html#/operations/PollUploadZipFile) for the extracted files. After extraction, you can upload multiple source files to a project using a [single call](../api/Public-API.v1-fv.html#/operations/AddSourceFiles). The maximum size for an imported .zip file is 10 MB.
+- Our Java SDK client is now available in **public beta**. [Here](../docs/api-clients/java/Java-Client.md) are more details on how to start integrating it into your solution
+- We published the API limits [here](../docs/API-rate-limits.md)
+- We updated the Custom fields [page](../docs/Custom-Fields.md) with useful gifs
+- We fixed various bugs
+
+**We update the .NET and Java client versions with each API release.**
+
+## 11 March 2022
+- You can now export a termbase and a termbase template in Trados Enterprise using the Trados Cloud Platform API
+- We fixed various bugs
+
+## 22 February 2022
+- You can now convert an xdt file into a termbase structure using [this](../api/Public-API.v1-fv.html#/operations/ConvertTermbaseTemplate) dedicated endpoint
+- When updating a termbase entry you will have to provide either the name or the identifier for the `termbaseFieldValues`
+- We fixed various bugs
+
+## 2 February 2022
+- You can now import a termbase in Trados Enterprise using the Trados Cloud Platform API. The supported extensions are `xml` and `tbx`. The maximum size for an imported termbase is 10 MB.
+- Our .NET SDK client is now available in **public beta**. [Here](../docs/api-clients/net/NET-Client.md) are more details on how to start integrating it into your solution.
+- We updated the [basic project creation](../docs/Basic-project-creation-flow.md) page with useful gifs and added a small Postman collection to help you get started quickly
+- We fixed various bugs
+
+
+## 15 December 2021
+- You can now create, read, update and delete terminology termbases, termbase templates and termbase entries
+- We fixed various bugs
+
+## 18 November 2021
+- You can now update the configurations of future tasks using the `projectPlan` field, in the [`update project`](../api/Public-API.v1-fv.html#/operations/UpdateProject) endpoint
+- Fixed various bugs
+
+## 20 October 2021
+- Basic project creation flow added
+- Fixed various bugs
+
+## 04 October 2021
+- Added multiple date formats
+- Added pagination for [`List File Processing Configurations`](../api/Public-API.v1-fv.html#/operations/ListFileProcessingConfigurations) endpoint
+- Fixed various bugs
+
+## 08 September 2021
+- Added support for downloading quote files
+- Enum values updated to follow camelCase convention
+- Updated documentation for projectTemplate in create project request
+- Renamed customProperty to customFields in error responses
+- Improved documentation for [Reclaim Task](../docs/Interact-with-tasks.md)
+- Updated documentation for [Quotes](../docs/Export-quote-report.md)
+
+## 26 August 2021
+- Added support to restrict file downloads
+- When creating/updating projects using a project template which has mandatory custom fields, you must supply those custom fields
+- Fixed various bugs
+
+**We will remove deprecated fields from the [`ErrorResponse`](../api/Public-API.v1-fv.html#/schemas/error-response) model in an upcoming release. Please ensure you are not using fields marked as deprecated!**
+
+## 29 July 2021
+- Added endpoints for custom field definitions.
+- Added support for custom fields on projects and project templates.
+- The `translationEngine`, `fileProcessingConfiguration`, `workflow` fields are now required on the [`/projects`](../api/Public-API.v1-fv.html#/operations/CreateProject) endpoint.
+- The `isSkipped` field is now marked as required on the [`/workflow/updateworkflow`](../api/Public-API.v1-fv.html#/operations/UpdateWorkflow) endpoint.
+- Added new assignee type `projectCreator` when retrieving workflows.
+- Improved contract documentation on TQA endpoints.
+- Fixed various bugs.
+
+## 08 June 2021
+* For endpoints that return multiple items, the `top` query parameter has a default value of `100` and a maximum value of `100`; `skip` has a default value of `0`.
+* The `Authorization` and `X-LC-Tenant` headers are now required for all endpoints.
+* Improved the returned error structure.
+* Fixed various issues with incorrect contract.
+* Added new conditional cost fields (`costOrder`, `conditionalCostType`, `conditionalCostOperator`, `conditionalCostVariable`, `conditionalCostThreshold`) when working with project quotes.
+* Added currency types for quote model.
+
+## 17 May 2021
+A Postman Collection is now available for integrators. Check out [this](../docs/Language-Cloud-APIs-for-Postman.md) page for details.
+
+## 10 February 2021
+
+* **Target File** > **Download File Version** endpoint
+
+When you make a `GET` request to the [`/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/download`](../api/Public-API.v1-fv.html#/operations/DownloadFileVersion) endpoint, you can now perform a direct download of the native file as well as of the `BCM` file version.
+
+* **Target File** > **Export Target File Version** endpoint
+
+When you make a `POST` request to the [`/projects/{projectId}/target-files/{targetFileId}/versions/{fileVersionId}/exports`](../api/Public-API.v1-fv.html#/operations/ExportTargetFileVersion) endpoint, you now have a query parameter where you can specify whether the file version export should be a native file or an `sdlxliff` file. The default value is `native`.
+
+## 28 January 2021
+
+* **Project** > **List Project’s Tasks** endpoint
+
+When you make a `GET` request to the [`/projects/{projectId}/tasks`](../api/Public-API.v1-fv.html#/operations/ListProjectTasks) endpoint, you can now retrieve the available project tasks and their details.
+
+
+* **Retrieving tasks**
+
+Retrieving tasks provides the following new additional details:
+
+- the Vendor Order Quote information
+- the translation status for each task: the type of matches, the number of segments, the number of words/characters.
+
+* **Specifying target languages for source files**
+
+When adding source files to a project, you can specify their target languages via the `targetLanguages` and `path` elements.
+
+
+
+
+₍^. .^₎⟆
+
diff --git a/articles/LCPublicAPI/docs/Whats-deprecated.md b/articles/LCPublicAPI/docs/Whats-deprecated.md
new file mode 100644
index 0000000..22584fe
--- /dev/null
+++ b/articles/LCPublicAPI/docs/Whats-deprecated.md
@@ -0,0 +1,33 @@
+# What's Deprecated
+
+
+## 1 July 2024
+We have removed the old fields in the folder/resource structure and are no longer available. Use the [path](../api/Public-API.v1-fv.html#/schemas/folder-v2) field going forward.
+
+## 13 December 2023
+- The `Export Quote` endpoint has been removed.
+- In the Get Project Template model we deprecated:
+ - `forceOnline` field from root level and we added `forceOnline` to the settings → general
+ - `quoteTemplate` field from root level and we added `quoteTemplate` to the settings → general
+ They will only be available for use until July 2024.
+
+## 17 August 2023
+
+We updated the folder/resource locations to the new format, which now includes the [path](../api/Public-API.v1-fv.html#/schemas/folder-v2). The old fields are marked as deprecated and their decommissioning is scheduled at a minimum of six months from now.
+
+## 12 August 2022
+In the `Quote` code, we deprecated the `Export Quote` endpoint. It will only be available for use until December 2022.
+
+
+## 7 June 2022
+
+In the `LanguageDirectionRequest` model we deprecated:
+- the `sourceLanguageCode` field and introduced `sourceLanguage` as an object containing the `languageCode` field;
+- the `targetLanguageCode` field and introduced `targetLanguage` as an object containing the `languageCode` field.
+
+They will no longer be available to use starting with November 2022.
+
+## 8 September 2021
+
+We removed deprecated fields from the ErrorResponse model.
+
diff --git a/articles/LCPublicAPI/docs/api-clients/java/Java-Client-Upgrade-Guide.md b/articles/LCPublicAPI/docs/api-clients/java/Java-Client-Upgrade-Guide.md
new file mode 100644
index 0000000..e0c2359
--- /dev/null
+++ b/articles/LCPublicAPI/docs/api-clients/java/Java-Client-Upgrade-Guide.md
@@ -0,0 +1,169 @@
+---
+stoplight-id: b309fcde3938d
+---
+
+
+# Trados Cloud Platform SDK - Migration Guide v25.x.x
+
+## Executive Summary
+
+The Trados Cloud Platform API SDK has transitioned from a "fat JAR" to a "light JAR" architecture, delivering faster downloads, improved dependency management, and better build performance. For most users, migration requires only a version update in your build configuration.
+
+
+**What Changed:**
+1. **Modernized Dependencies:** JUnit 4 → 5, Apache HttpClient 4 → 5, Commons Lang 2→3
+2. **OpenAPI Generator:** Version 6.5.0 → 7.14.0 with enhanced nullability annotations
+3. **Enhanced Features:** New `LCContext.executeInScope()` methods for improved tenant/trace context management
+4. **Updated Tooling:** Latest versions of Jackson, Feign, and other core libraries
+
+## Step-by-Step Migration Guide
+
+### For Standard API Usage (Most Users):
+
+If you're using the generated SDK classes like `ProjectApi`, `SourceFileApi`, etc., migration is straightforward:
+
+1. Update SDK version to 25.x.x in your build configuration.
+2. Run your build command to verify everything works.
+3. Review and update your code for compatibility with the new OpenAPI Generator output (see the section [OpenAPI Generator & Generated Code Changes](#openapi-generator--generated-code-changes) below for details).
+4. Your API calls should work as before, but review and resolve any compilation issues related to the above changes.
+
+```java
+// Your existing code continues to work
+ProjectApi projectApi = languageCloudClientProvider.getProjectClient();
+Project project = projectApi.createProject(projectCreateRequest, queryParams);
+```
+## Troubleshooting
+
+**Most Common Issue**: Build fails after version update
+**Solution**: Run `mvn dependency:tree` to check for dependency conflicts
+
+**Issue**: `ClassNotFoundException: feign.Client`
+**Solution**: Verify Feign dependencies: `mvn dependency:tree | grep feign`
+
+**Issue**: `NoClassDefFoundError` for HTTP client classes
+**Solution**: Update imports from `org.apache.http` to `org.apache.hc.core5.http`
+
+**Issue**: Commons Lang methods not found
+**Solution**: Update imports from `org.apache.commons.lang` to `org.apache.commons.lang3`
+
+## Success Validation
+
+**For Standard Users:**
+1. Clean build: `mvn clean install` succeeds
+2. API functionality works as before
+3. Faster builds and smaller downloads
+
+**For Advanced Users:**
+- Run `mvn dependency:tree` - no conflicts shown
+- Test application startup and core functionality
+
+### Advanced Scenarios
+
+
+Click here if you use direct dependency imports or custom configurations
+
+#### Direct Dependency Usage:
+- Update HttpClient imports: `org.apache.http` → `org.apache.hc.core5.http`
+- Update Commons Lang imports: `org.apache.commons.lang` → `org.apache.commons.lang3`
+- Use dependency exclusions if you encounter version conflicts
+
+#### Custom Classpath Management:
+1. Review current JAR collection and identify SDK dependencies
+2. Ensure all transitive dependencies are included in classpath
+3. Test application startup and core functionality
+4. Consider migrating to Maven/Gradle for simplified dependency management
+
+#### Test Framework Updates:
+- **JUnit Migration**: JUnit 4 → JUnit 5 (Jupiter)
+ - Update test annotations: `@Test` imports change from `org.junit.Test` → `org.junit.jupiter.api.Test`
+ - Replace `@Before/@After` with `@BeforeEach/@AfterEach`
+ - Update assertion imports: `org.junit.Assert` → `org.junit.jupiter.api.Assertions`
+- **Mockito Updates**: Version 3.x → 5.x
+ - Update imports if using `mockito-junit-jupiter` directly
+ - Verify mock behavior with newer Mockito features
+
+#### OpenAPI Generator & Generated Code Changes:
+- **OpenAPI Generator**: Version 6.5.0 → 7.14.0 (major version upgrade)
+- **Generated Code Improvements**: Enhanced code generation with:
+ - **New Nullability Annotations**: `@javax.annotation.Nullable` and `@javax.annotation.Nonnull` annotations for better null safety
+ - **Bean Validation Support**: Enhanced validation annotations for API parameters
+ - **Improved Code Quality**: Updated Mustache templates producing cleaner, more maintainable generated code
+ - **Better Method Naming**: Collection helper methods use improved naming conventions for better readability
+ - **Enhanced Enum Handling**: Improved enum comparison and naming with configurable case sensitivity support
+ - **Modernized Templates**: Generated classes follow current Java best practices
+
+#### Benefits:
+- Generated classes are easier to use and understand
+- Better IDE support with improved nullability annotations
+- More consistent naming conventions across generated code
+- Enhanced type safety and validation
+
+
+
+## Validation & Success Criteria
+
+**For Standard Users:**
+1. **Clean Build**: Your project builds successfully
+2. **API Functionality**: SDK operations work as before - no code changes needed
+3. **Performance**: Faster builds and smaller downloads
+
+**Advanced Validation:**
+- **Dependency Check**: `mvn dependency:tree` shows no conflicts
+- **Custom Configurations**: Test application startup and functionality
+
+## Reference: Key Dependencies
+
+### High-Impact Dependencies (Most Likely to Affect You)
+
+| Library | Previous | New | Notes |
+|---------------------|----------|--------|------------------------------|
+| Feign (HTTP Client) | 10.11 | 13.6 | Core SDK communication |
+| Jackson (JSON) | 2.10.3 | 2.19.1 | API serialization |
+| Apache HttpClient | 4.5.8 | 5.5 | HTTP transport |
+| JUnit (Tests) | 4.13 | 5.13.2 | Test framework modernization |
+
+
+View Complete Dependency List
+
+**All Updated Dependencies:**
+
+| GroupId | ArtifactId | Previous Version | New Version | Impact |
+|-----------------------------------|---------------------------|------------------|-------------|------------|
+| io.github.openfeign | feign-core | 10.11 | 13.6 | **High** |
+| io.github.openfeign | feign-jackson | 10.11 | 13.6 | **High** |
+| io.github.openfeign | feign-slf4j | 10.11 | 13.6 | **High** |
+| io.github.openfeign | feign-form | 3.8.0 | 13.6 | **High** |
+| io.github.openfeign | feign-okhttp | 10.11 | 13.6 | **High** |
+| com.fasterxml.jackson.core | jackson-core | 2.10.3 | 2.19.1 | **Medium** |
+| com.fasterxml.jackson.core | jackson-annotations | 2.10.3 | 2.19.1 | **Medium** |
+| com.fasterxml.jackson.core | jackson-databind | 2.10.3 | 2.19.1 | **Medium** |
+| org.apache.httpcomponents.client5 | httpclient5 | 4.5.8* | 5.5 | **Medium** |
+| com.fasterxml.jackson.datatype | jackson-datatype-jsr310 | 2.10.3 | 2.19.1 | Low |
+| com.fasterxml.jackson.datatype | jackson-datatype-joda | 2.0.4 | 2.19.1 | Low |
+| org.openapitools | jackson-databind-nullable | 0.2.1 | 0.2.6 | Low |
+| org.apache.commons | commons-lang3 | 2.6* | 3.18.0 | Low |
+| com.github.spotbugs | spotbugs-annotations | 3.0.2* | 4.9.3 | Low |
+| javax.annotation | javax.annotation-api | 1.0* | 1.3.2 | Low |
+| org.projectlombok | lombok | RELEASE | 1.18.38 | Low |
+| org.slf4j | slf4j-simple | - | 2.0.13 | Low |
+
+
+
+*Different groupId or artifactId in previous version
+
+### Test Dependencies
+
+| GroupId | ArtifactId | Previous Version | New Version | Impact |
+|-------------------|-----------------------|------------------|-------------|----------|
+| org.junit.jupiter | junit-jupiter-engine | 4.13* | 5.13.2 | **High** |
+| org.mockito | mockito-junit-jupiter | 3.12.1* | 5.18.0 | **High** |
+
+*Different groupId or artifactId in previous version
+
+### Most Important Changes
+
+**Critical**: Maven Shade Plugin removed (enables fat→light JAR transition)
+**Modernization**: All dependencies updated to current versions
+**Code Quality**: OpenAPI Generator 6.5.0 → 7.14.0 with better nullability support
+
+
diff --git a/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md b/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md
new file mode 100644
index 0000000..3d6d9f2
--- /dev/null
+++ b/articles/LCPublicAPI/docs/api-clients/java/Java-Client.md
@@ -0,0 +1,91 @@
+# Java Client
+
+This client library targets Java 11 and above. It provides API clients organized by API documentation sections.
+
+The generated Java clients are based on [OpenFeign](https://spring.io/projects/spring-cloud-openfeign).
+
+
+> The Java Client library is auto-generated from the current API contracts, so any updates to the contract will reflect as changes in the SDK client. Minor version increases do not guarantee backwards compatibility.
+
+## Installation
+You can add this library to your project as a [Maven](https://search.maven.org/artifact/com.rws.lt.lc.public-api/lc-public-api-sdk/24.0.9/jar) dependency.
+
+Include the client library in the `pom.xml`:
+
+```java
+
+ com.rws.lt.lc.public-api
+ lc-public-api-sdk
+ 24.0.9
+
+```
+> Make sure to always reference the latest available version. Check the [Maven Central Repository](https://search.maven.org/artifact/com.rws.lt.lc.public-api/lc-public-api-sdk) for more info.
+
+
+## Usage
+We will use the project creation flow as an example to show how the API clients can be used.
+
+API clients can be initialized individually based on the endpoints you need to target.
+If authorization was provided when instantiating the client, it's not required again when calling its methods.
+
+Trados Cloud Platform operates in multiple regions; ensure you select the correct region for your integration.
+*See the [Multi Region](../../../docs/Multi-Region.md) page for more details.*
+
+The default region for `LanguageCloudClientProvider` is `eu`, but you can override it.
+For example, to use Project features, instantiate a Project client like this:
+
+```java
+
+// define credentials
+ServiceCredentials serviceCredentials = new ServiceCredentials("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET", "YOUR_TENANT_ID");
+
+// instantiate the LanguageCloudClientProvider
+LanguageCloudClientProvider languageCloudClientProvider = LanguageCloudClientProvider.builder()
+ .withRegionCode("ca") // default is "eu"
+ .withServiceCredentials(serviceCredentials)
+ .build();
+
+// instantiate the client
+ProjectApi projectApi = languageCloudClientProvider.getProjectClient();
+```
+
+#### 1. Create a new project:
+
+```java
+ProjectCreateRequest projectCreateRequest = new ProjectCreateRequest();
+projectCreateRequest.setName("YOUR_PROJECT_NAME");
+projectCreateRequest.setDueBy(DateTime.parse("2025-01-01T00:00:00.000Z"));
+projectCreateRequest.setProjectTemplate(new ObjectIdRequest().id("YOUR_PROJECT_TEMPLATE_ID"));
+
+// Set the `fields` query parameter so the response is populated with `projectPlan.taskConfigurations`
+ProjectApi.CreateProjectQueryParams queryParams = new ProjectApi.CreateProjectQueryParams();
+queryParams.fields("projectPlan.taskConfigurations");
+Project projectCreateResponse = projectApi.createProject(projectCreateRequest, queryParams);
+```
+
+#### 2. Attach a source file to the project:
+
+Projects that do not contain source files cannot be started.
+
+```java
+SourceFileApi sourceFileApi = languageCloudClientProvider.getSourceFileClient();
+
+SourceFileRequest properties = new SourceFileRequest();
+properties.setLanguage(new LanguageRequest("en-US"));
+properties.setName("YOUR_TEXT_SOURCE_FILE");
+properties.setRole(SourceFileRequest.RoleEnum.TRANSLATABLE);
+properties.setType(SourceFileRequest.TypeEnum.NATIVE);
+File file = new File("YOUR_TEXT_SOURCE_FILE_PATH");
+
+SourceFile sourceFile = sourceFileApi.addSourceFile("YOUR_PROJECT_ID", properties, file);
+```
+
+#### 3. Start the project:
+```java
+projectApi.startProject("YOUR_PROJECT_ID");
+```
+
+#### 4. Get the project details:
+```java
+Project project = projectApi.getProject("YOUR_PROJECT_ID", "status,quote.totalAmount");
+```
diff --git a/articles/LCPublicAPI/docs/api-clients/java/Java-Samples.md b/articles/LCPublicAPI/docs/api-clients/java/Java-Samples.md
new file mode 100644
index 0000000..f1af7f6
--- /dev/null
+++ b/articles/LCPublicAPI/docs/api-clients/java/Java-Samples.md
@@ -0,0 +1,280 @@
+# Trados Cloud Platform SDK Samples for Java
+
+## Console Application Sample
+
+The console application sample is available for download on [GitHub](https://github.com/RWS/language-cloud-public-api-samples/tree/main/Java/PublicApi.Sample.Console.Java).
+
+The sample contains three examples of how to instantiate and work with an API client provided by the Trados Cloud Platform SDK. You can either use the supplied provider or handle the authentication yourself:
+
+#### 1. Instantiating a client using service credentials
+
+You can instantiate a client using the provided `LanguageCloudClientProvider.builder()` pattern.
+
+This method requires you to provide a `ServiceCredentials` object containing your `clientID`, `clientSecret`, and `tenant`. *See the [Authentication](../../../docs/Authentication.md) page for more details.*
+
+```java
+import com.rws.lt.lc.publicapi.sdk.api.GroupApi;
+import com.rws.lt.lc.publicapi.sdk.auth.ServiceCredentials;
+import com.rws.lt.lc.publicapi.sdk.client.LanguageCloudClientProvider;
+import com.rws.lt.lc.publicapi.sdk.model.Group;
+import com.rws.lt.lc.publicapi.sdk.model.ListGroupsResponse;
+
+import java.util.stream.Collectors;
+...
+
+//instantiate the credentials
+ServiceCredentials serviceCredentials = new ServiceCredentials("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET", "YOUR_TENANT_ID");
+
+// instantiate the LanguageCloudClientProvider
+LanguageCloudClientProvider languageCloudClientProvider = LanguageCloudClientProvider
+ .builder()
+ .withRegion("eu") // optional (default is "eu")
+ .withServiceCredentials(serviceCredentials)
+ .build();
+
+// instantiate the client
+GroupApi groupApi = languageCloudClientProvider.getGroupClient();
+
+// use the client
+ListGroupsResponse groupsResponse = groupApi.listGroups(new GroupApi.ListGroupsQueryParams());
+System.out.println("Groups:");
+System.out.println(
+ groupsResponse.getItems().stream()
+ .map(Group::getName)
+ .collect(Collectors.joining("\n")));
+```
+
+*\*Using this method, a unique TraceID will be generated for each request.*
+
+
+
+> #### Info
+>
+> Make sure you always keep your credentials safe.
+
+
+#### 2. Instantiating a client using context scoping
+
+This method allows you to make API calls with multiple different service credentials using the same client instance.
+
+We provide an `LCContext` which exposes scoping options. You can use this to scope your API calls in different contexts. The sample contains an example with two different service credentials:
+
+```java
+import com.rws.lt.lc.publicapi.sdk.api.UserApi;
+import com.rws.lt.lc.publicapi.sdk.auth.ServiceCredentials;
+import com.rws.lt.lc.publicapi.sdk.client.LanguageCloudClientProvider;
+import com.rws.lt.lc.publicapi.sdk.context.ContextKeys;
+import com.rws.lt.lc.publicapi.sdk.context.LCContext;
+import com.rws.lt.lc.publicapi.sdk.model.ListUsersResponse;
+import com.rws.lt.lc.publicapi.sdk.model.User;
+
+import java.util.stream.Collectors;
+...
+
+// define credentials for your first user
+ServiceCredentials credentials_1 = new ServiceCredentials("YOUR_CLIENT_ID_1", "YOUR_CLIENT_SECRET_1", "YOUR_TENANT_ID_1");
+
+// define credentials for your second user
+ServiceCredentials credentials_2 = new ServiceCredentials("YOUR_CLIENT_ID_2", "YOUR_CLIENT_SECRET_2", "YOUR_TENANT_ID_2");
+
+// instantiate the LanguageCloudClientProvider
+LanguageCloudClientProvider languageCloudClientProvider_contextAuth = LanguageCloudClientProvider
+ .builder()
+ .withRegion("eu") // optional (default is "eu")
+ .build();
+
+// instantiate the client without credentials
+UserApi userApi = languageCloudClientProvider_contextAuth.getUserClient();
+
+
+Runnable listUsersExecutable = () -> {
+ ListUsersResponse usersResponse = userApi.listUsers(new UserApi.ListUsersQueryParams());
+ System.out.println(LCContext.getFromLCContext(ContextKeys.TRACE_ID_KEY) + " >> Users for tenant " + LCContext.getFromLCContext(ContextKeys.TENANT_ID_KEY) + " are:");
+ System.out.println(usersResponse.getItems().stream().map(User::getId).collect(Collectors.joining("\n")));
+};
+
+// create a context scope and execute inside with tenant 1
+LCContext.executeInScope(listUsersExecutable, serviceCredentials1, "trace-id-1");
+
+System.out.println("--------------------------------------------------");
+// create a context scope and execute inside with tenant 2
+LCContext.executeInScope(listUsersExecutable, serviceCredentials2, "trace-id-2");
+```
+
+#### 3. Instantiating a client with App service credentials
+
+This method allows you to make an API call from an App for different tenants using the same client instance. See more at [Extensibility Docs](https://eu.cloud.trados.com/lc/extensibility-docs/937a747af31a0-concepts#apps).
+
+
+We provide an `LCContext` which exposes scoping options. You can use this to scope your API calls in different contexts. The sample contains an example with an App installed in multiple tenants:
+
+```java
+import com.rws.lt.lc.publicapi.sdk.api.UserApi;
+import com.rws.lt.lc.publicapi.sdk.auth.ServiceCredentials;
+import com.rws.lt.lc.publicapi.sdk.client.LanguageCloudClientProvider;
+import com.rws.lt.lc.publicapi.sdk.context.ContextKeys;
+import com.rws.lt.lc.publicapi.sdk.context.LCContext;
+import com.rws.lt.lc.publicapi.sdk.model.ListUsersResponse;
+import com.rws.lt.lc.publicapi.sdk.model.User;
+
+import java.util.stream.Collectors;
+...
+
+//instantiate the credentials
+ServiceCredentials serviceCredentials = new ServiceCredentials("YOUR_CLIENT_ID_1", "YOUR_CLIENT_SECRET_1");
+
+// instantiate the LanguageCloudClientProvider
+LanguageCloudClientProvider languageCloudClientProvider_contextAuth = LanguageCloudClientProvider
+ .builder()
+ .withRegion("eu") // optional (default is "eu")
+ .withServiceCredentials(serviceCredentials)
+ .build();
+
+// instantiate the client without credentials
+UserApi userApi = languageCloudClientProvider_contextAuth.getUserClient();
+
+
+Runnable listUsersExecutable = () -> {
+ ListUsersResponse usersResponse = userApi.listUsers(new UserApi.ListUsersQueryParams());
+ System.out.println(LCContext.getFromLCContext(ContextKeys.TRACE_ID_KEY) + " >> Users for tenant " + LCContext.getFromLCContext(ContextKeys.TENANT_ID_KEY) + " are:");
+ System.out.println(usersResponse.getItems().stream().map(User::getId).collect(Collectors.joining("\n")));
+};
+
+// create a context scope and execute inside with tenant 1
+LCContext.executeInScope(listUsersExecutable, TENANT_VALUE_1, "trace-id-1");
+
+System.out.println("--------------------------------------------------");
+// create a context scope and execute inside with tenant 2
+LCContext.executeInScope(listUsersExecutable, TENANT_VALUE_2, "trace-id-2");
+
+```
+#### 4. Instantiating a client using custom authentication
+
+If you want complete control over client authentication, you can provide a `CustomServiceAuthenticationHandler`:
+
+```java
+import com.rws.lt.lc.publicapi.sdk.api.ProjectApi;
+import com.rws.lt.lc.publicapi.sdk.auth.AuthenticationService;
+import com.rws.lt.lc.publicapi.sdk.auth.CustomServiceAuthenticationHandler;
+import com.rws.lt.lc.publicapi.sdk.auth.ServiceCredentials;
+import com.rws.lt.lc.publicapi.sdk.client.LanguageCloudClientProvider;
+import com.rws.lt.lc.publicapi.sdk.model.ListProjectsResponse;
+
+import java.util.List;
+import java.util.UUID;
+...
+
+AuthenticationService authenticationService = AuthenticationService.getInstance();
+
+CustomServiceAuthenticationHandler customServiceAuthenticationHandler = new CustomServiceAuthenticationHandler(authenticationService) {
+ @Override
+ public ServiceCredentials getServiceCredentials() {
+ return new ServiceCredentials(CLIENT_ID, CLIENT_SECRET);
+ }
+
+ @Override
+ public String getTraceId() {
+ return UUID.randomUUID().toString();
+ }
+
+ @Override
+ public String getTenantId() {
+ return TENANT_VALUE;
+ }
+};
+
+LanguageCloudClientProvider languageCloudCustomClientProvider = LanguageCloudClientProvider
+ .builder()
+ .withRegion("eu") // optional (default is "eu")
+ .withRequestInterceptors(List.of(customServiceAuthenticationHandler))
+ .build();
+
+// instantiate the client
+ProjectApi projectApi = languageCloudCustomClientProvider.getProjectClient();
+
+// use the client
+ListProjectsResponse projectsResponse = projectApi.listProjects(new ProjectApi.ListProjectsQueryParams());
+System.out.println("Projects:");
+System.out.println(projectsResponse.getItems());
+```
+
+
+
+## Web API Sample
+The web API sample is available for download on [GitHub](https://github.com/RWS/language-cloud-public-api-samples/tree/main/Java/PublicApi.Sample.Web.Java).
+
+The sample contains two examples of how to instantiate and work with an API client provided by the Trados Cloud Platform SDK for Java:
+
+- *If you want to use the provided authentication mechanism, create a custom handler that inherits from `CustomServiceAuthenticationHandler`.*
+
+In our example, we created the `CustomAuthenticationHandler` class, which inherits from `CustomServiceAuthenticationHandler`. The `CustomServiceAuthenticationHandler` class already provides an authentication mechanism.
+
+We have overridden the `getServiceCredentials`, `getTraceId`, and `getTenantId` methods and provided our implementations, as these will be called by `CustomAuthenticationHandler`:
+
+```java
+// Provide your implementation. A possible example can be:
+@Override
+public ServiceCredentials getServiceCredentials() {
+ return repository.getServiceCredentialsById(getCurrentUser().getUserId());
+}
+
+// serviceCredentials may or may not be bound to a tenant
+@Override
+public String getTenantId() {
+ return repository.getServiceCredentialsById(getCurrentUser().getUserId()).getTenantId();
+ // or
+ // return repository.getTenantForUserId(getCurrentUser().getUserId());
+}
+
+@Override
+public String getTraceId() {
+ return UUID.randomUUID().toString();
+}
+
+private User getCurrentUser() {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ return (User) authentication.getPrincipal();
+}
+```
+
+We registered an instance of `LanguageCloudClientProvider` as a bean in the `ConfigClass` class and created beans for all exposed API clients:
+```java
+// the LanguageCloudClientProvider instance
+@Bean
+public LanguageCloudClientProvider getPublicApiClient(CustomAuthenticationHandler customAuthenticationHandler) {
+ return LanguageCloudClientProvider.builder()
+ .withRegion("eu") // optional (default is "eu")
+ .withRequestInterceptors(List.of(customAuthenticationHandler)).build();
+}
+
+//the AccountApi bean
+@Bean
+public AccountApi getAccountApi(LanguageCloudClientProvider languageCloudClientProvider) {
+ return languageCloudClientProvider.getAccountClient();
+}
+```
+
+We can then use the registered client in the controller (or any other class resolved through Dependency Injection):
+
+```java
+@RestController
+public class AccountController extends ResponseEntityExceptionHandler {
+
+ @Autowired
+ private AccountApi accountApi;
+
+ @GetMapping("/getAccounts/{userId}")
+ public List listAccounts(@PathVariable("userId") int userId) {
+ User user = new User(userId);
+ Authentication authentication = new UsernamePasswordAuthenticationToken(user, null);
+ SecurityContext sc = SecurityContextHolder.getContext();
+ sc.setAuthentication(authentication);
+
+ ListMyAccountsResponse listMyAccountsResponse = accountApi.listMyAccounts();
+
+ return listMyAccountsResponse.getItems();
+ }
+}
+```
+
+
diff --git a/articles/LCPublicAPI/docs/api-clients/net/NET-Client.md b/articles/LCPublicAPI/docs/api-clients/net/NET-Client.md
new file mode 100644
index 0000000..7c8a51d
--- /dev/null
+++ b/articles/LCPublicAPI/docs/api-clients/net/NET-Client.md
@@ -0,0 +1,180 @@
+# .NET Client
+
+.NET Client is a collection of API clients structured in accordance with the API documentation, meaning each section will have its own client.
+
+It is built on .NET Standard 2.0. For compatibility information, see the [Microsoft implementation support page](https://docs.microsoft.com/en-us/dotnet/standard/net-standard?tabs=net-standard-2-0#net-implementation-support).
+
+
+> The .NET Client library is auto-generated from the current API contracts, so any updates to the contract will reflect as changes in the SDK client. Minor version increases do not guarantee backwards compatibility.
+
+## Installation
+
+You can add the .NET Client library to your project from [Rws.LanguageCloud.Sdk NuGet](https://www.nuget.org/packages/Rws.LanguageCloud.Sdk).
+
+## Usage
+
+We will take the project creation flow as an example to show how the API clients can be used.
+
+#### 1. Add the `using` statement:
+
+```csharp
+using Rws.LanguageCloud.Sdk;
+```
+#### 2. Get a new Project client:
+
+First step is to get an instance of `LanguageCloudClientProvider`. The constructor has 2 optional parameters `region` and `baseUrl`. When using the constructor with no parameters, the provider will be instantiated for the `eu` region. Any clients created by this instance will be calling on the EU region. If you need to specify a different region, instantiate it with the `region` specified. Region is specified by it's code, ex: `eu`, `ca`, etc,
+
+The second optional parameter `baseUrl` is used if you want to test the client with a mock server.
+
+You can request a new API client from the `LanguageCloudClientProvider` instance. There are 3 methods exposed for each client:
+
+ - ```csharp
+ GetProjectClient (ServiceCredentials credentials, params DelegatingHandler[] handlers)
+ This method accepts a `ServiceCredentials` object which will be used to perform authentication using an implicit authentication handler. Custom handlers are also accepted.
+
+ - ```csharp
+ GetProjectClientNoAuth (params DelegatingHandler[] handlers)
+ This method accepts custom handlers and does not perform any authentication implicitly. You must handle authentication in a custom handler when using this method.
+
+ - ```csharp
+ GetProjectClient (params DelegatingHandler[] handlers)`
+ This method accepts custom handlers and can be used to authenticate using scoping/context.
+
+
+> On each call to GetProjectClient or GetProjectClientNoAuth a new instance is created. That means a new HttpClient for each one. You should avoid having more than one instance - and should share that using Dependency Injection or other mechanisms.
+
+In this example we will use the credentials options to get a new Project Client and we won't supply any additional handlers:
+
+```csharp
+
+ // define credentials
+ServiceCredentials credentials = new ServiceCredentials("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET", "YOUR_TENANT_ID");
+
+// instantiate the provider
+var clientProvider = new LanguageCloudClientProvider("eu");
+
+// instantiate the client
+var projectClient = clientProvider.GetProjectClient(credentials);
+```
+
+Since each client exposes its available operations according to the API documentation, you can find the GetProject operation in the Project client.
+
+#### 3. Create a new project:
+
+```csharp
+var projectCreateRequest = new ProjectCreateRequest
+{
+ Name = "YOUR_PROJECT_NAME",
+ DueBy = DateTime.Now.AddDays(7),
+ ProjectTemplate = new ObjectIdRequest
+ {
+ Id = "YOUR_PROJECT_TEMPLATE_ID"
+ }
+};
+
+var projectCreateResponse = await projectClient.CreateProjectAsync(projectCreateRequest);
+```
+
+
+#### 4. Attach a source file to the project via the SourceFiles client:
+
+Projects that do not contain source files cannot be started.
+
+First, `GET` the SourceFiles client:
+
+```csharp
+ // define credentials
+ServiceCredentials credentials = new ServiceCredentials("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET", "YOUR_TENANT_ID");
+
+// instantiate the provider
+var clientProvider = new LanguageCloudClientProvider("eu");
+
+// instantiate the client
+var sourceFileClient = clientProvider.GetSourceFileClient(credentials);
+```
+Then, attach a source file to the project:
+
+```csharp
+using (FileStream SourceStream = File.Open("YOUR_TEXT_SOURCE_FILE", FileMode.Open))
+{
+ FileParameter file = new FileParameter(SourceStream, "YOUR_TEXT_SOURCE_FILE", "text/plain");
+
+ SourceFileRequest properties = new SourceFileRequest
+ {
+ Name = "YOUR_TEXT_SOURCE_FILE",
+ Role = SourceFileRequestRole.Translatable,
+ Type = SourceFileRequestType.Native,
+ Language = "en-US",
+ };
+
+ await sourceFileClient.AddSourceFileAsync("YOUR_PROJECT_ID", properties ,file);
+}
+```
+
+#### 5. Start the project:
+
+```csharp
+await projectClient.StartProjectAsync("YOUR_PROJECT_ID");
+```
+
+#### 6. `GET` the project details using the Project client:
+```csharp
+var myProject = await projectClient.GetProjectAsync("YOUR_PROJECT_ID");
+```
+
+#### 7. (Optional) Supply the `fields` parameter and retrieve specific data about the project:
+
+```csharp
+var myProject = await projectClient.GetProjectAsync("YOUR_PROJECT_ID", "status,quote.totalAmount");
+```
+
+
+## Error handling
+The SDK may throw the following exceptions:
+
+Exception Type | Exception description
+---------|----------
+**ModelDeserializationException** | Response could not be deserialized
+**ApiUnauthorizedException** | The user could not be identified
+**ApiPermissionException** | The user does not have permission to access this resource
+**ApiForbiddenException** | The user does not have access to the resource
+**ApiErrorException** | Something went wrong when performing the action
+**ApiConnectionException** | Something went wrong when connecting to the server
+**[TaskCanceledException](https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcanceledexception?view=netstandard-2.0)** | A timeout occurred. This exception is provided by Microsoft in System.Threading.Tasks namespace.
+
+All these exceptions inherit from `ApiClientException` and provide an `ApiErrorResponse` object which contains details about the error that occurred.
+You may use this object in combination with the ErrorCode class to perform exception handling:
+
+```csharp
+try
+{
+ // your API Client interaction code
+}
+catch (ApiForbiddenException e)
+{
+ // handle exception...
+}
+catch (ApiUnauthorizedException e)
+{
+ // handle exception...
+}
+// we can limit what specific API Errors we want to handle:
+catch (ApiErrorException e) where (e.ApiError.ErrorCode == ErrorCodes.MaxSize)
+{
+ // One of the fields in your call, has value higher then allowed
+ // We get the summary message:
+ string summary = e.ApiError.Message;
+
+ // Next we can get the list of fields that failed validation:
+ foreach (var detail in e.ApiError.Details)
+ {
+ // TODO
+ }
+}
+```
+Additionally, the `ApiErrorResponse.Details` object contains specific error data that may be useful.
+
+
+### Error Codes
+
+The `ErrorCodes` static class provides a series of constant strings suitable to be used for error code validation. Please check the Rest API documentation for specific codes any endpoint may return and what that value means in the specific context.
diff --git a/articles/LCPublicAPI/docs/api-clients/net/Net-Samples.md b/articles/LCPublicAPI/docs/api-clients/net/Net-Samples.md
new file mode 100644
index 0000000..92cd0cf
--- /dev/null
+++ b/articles/LCPublicAPI/docs/api-clients/net/Net-Samples.md
@@ -0,0 +1,232 @@
+# Trados Cloud Platform SDK Samples for .NET
+
+This document is designed to help developers get started with the Trados Cloud Platform SDK in .NET applications. You'll find practical sample code and clear guidance for instantiating API clients using credentials, context scoping, or custom handlers. The examples also show how to integrate the SDK into ASP.NET Web API projects, including tips for dependency injection and custom authentication. Use these samples to quickly implement Trados Cloud Platform features in your console or web API projects.
+
+Here is some guidance to help you decide which sample to follow:
+
+- If your application targets a single tenant, the quickest way to get started is the [Instantiating a client using credentials (single tenant)](#instantiating-a-client-using-credentials-single-tenant) sample.
+- For background processes that must handle multiple tenants, see the [Instantiating a client using context scoping](#instantiating-a-client-using-context-scoping) sample.
+- If you're building a multi-tenant web application and need Dependency Injection that depends on the current user, start with the [Web API Dependency Injection Sample](#web-api-dependency-injection-sample).
+- If you require a custom authentication flow, the SDK supports supplying your own handler — see [Instantiating a client using a custom handler](#instantiating-a-client-using-a-custom-handler).
+
+## Console Application Sample
+
+The console application sample is available for download on [GitHub](https://github.com/RWS/language-cloud-public-api-samples/tree/main/.Net/PublicApi.Sample.Console).
+
+It contains three examples of how to instantiate and work with an API client provided by the Trados Cloud Platform SDK. You can either use the supplied provider, or handle the client instantiation on your own:
+
+### Instantiating a client using credentials (single tenant)
+
+You can instantiate a client using the supplied `LanguageCloudClientProvider` class. This method requires you to provide a `ServiceCredentials` object, which contains your `clientID`, `clientSecret` and the `tenant`. *See the [Authentication](../../../docs/Authentication.md) page for more details.*
+
+```csharp
+using Rws.LanguageCloud.Sdk;
+
+...
+
+// define credentials
+ServiceCredentials credentials = new ServiceCredentials("client-id", "client-secret", "tenant");
+
+// instantiate the provider
+var clientProvider = new LanguageCloudClientProvider("eu");
+
+// Instantiate the client
+var projectClient = clientProvider.GetProjectClient(credentials);
+
+// use the client
+var projectsResponse = await projectClient.ListProjectsAsync();
+```
+
+*Using this method, a unique TraceId will be generated for each request.*
+
+
+
+> #### Info
+>
+> Make sure you always keep your credentials safe.
+
+### Instantiating a client using context scoping
+
+This method lets you make API calls as two different users using the same client instance.
+
+We provide an `ApiClientContext` which exposes scoping options. You can use it to scope API calls for different users; the sample shows an example with two users:
+
+```csharp
+using Rws.LanguageCloud.Sdk;
+using Sdl.ApiClientSdk.Core;
+...
+
+// define credentials for your first user
+ServiceCredentials credentials_1 = new ServiceCredentials("client-id-1", "client-secret-1", "tenant-1");
+
+// define credentials for your second user
+ServiceCredentials credentials_2 = new ServiceCredentials("client-id-2", "client-secret-2", "tenant-2");
+
+// instantiate the provider
+var clientProvider = new LanguageCloudClientProvider("eu");
+
+// instantiate the client without credentials
+var projectClient = clientProvider.GetProjectClient();
+
+// create a context scope and use the client. You can also provide your own traceId
+using (ApiClientContext.BeginScope(new LCContext(credentials_1, "trace-id-1")))
+{
+ // the client will use the credentials_1 and "trace-id-1" defined in the scope
+ var projectsResponse = await projectClient.ListProjectsAsync();
+}
+
+// create a context scope and use the client. You can also provide your own traceId
+using (ApiClientContext.BeginScope(new LCContext(credentials_2, "trace-id-2")))
+{
+ // the client will use the credentials_2 and "trace-id-2" defined in the scope
+ var projectsResponse = await projectClient.ListProjectsAsync();
+}
+```
+
+### Instantiating a client using a custom handler
+
+If you would like to control the authentication process, you should use the method which does not perform any authentication implicitly. You can provide your own authentication implementation via a custom handler:
+
+```csharp
+// define credentials
+ServiceCredentials credentials = new ServiceCredentials("client-id", "client-secret", "tenant");
+
+// get an authentication handler
+ServiceAuthenticationHandler handler = new ServiceAuthenticationHandler(credentials);
+
+// instantiate the provider
+var clientProvider = new LanguageCloudClientProvider("eu");
+
+// get a client with the custom handler
+var client = clientProvider.GetProjectClientNoAuth(handler);
+
+// use the client
+var projectsResponse = await projectClient.ListProjectsAsync();
+
+```
+
+## Web API Dependency Injection Sample
+
+The web API sample is available for download on [GitHub](https://github.com/RWS/language-cloud-public-api-samples/tree/main/.Net/PublicApi.WebApiSample).
+
+It contains an example of how to instantiate and work with an API client provided by the Trados Cloud Platform SDK for ASP .Net.
+
+> If you want to use the provided authentication mechanism, a custom handler can be created, which must inherit from `LCCustomAuthenticationHandler`.
+
+> If you want to handle authentication and tracing on you own, you could implement your own `DelegatingHandler`.
+
+In our example, we've created the `LcHandler` class, which inherits from `LCCustomAuthenticationHandler`. The `LCCustomAuthenticationHandler` class already provides an authentication mechanism. We've overridden the `GetServiceCredentials` and `GetTraceId` methods and provided our own implementations; these will be called by `LCCustomAuthenticationHandler`:
+
+```csharp
+// Provide your own implementation. A possible example:
+protected override ServiceCredentials GetServiceCredentials()
+{
+ int accountId = int.Parse(context.HttpContext.User.Claims.Single(x => x.Type.Equals("aid")).Value);
+ ServiceCredentials credentials = repository.GetServiceCredentialsById(accountId);
+
+ return credentials;
+}
+
+...
+
+// Provide your own implementation. A possible example:
+protected override string GetTraceId()
+{
+ return DateTimeOffset.UtcNow.ToString();
+}
+```
+
+We'll need a bit of custom magic to make sure dependency injection works correctly for multi-region. We'll create a custom Factory to provide our clients. An example implementation would be a factory class to provide a per region factory. We'll make sure to have all instances initialized only once, to avoid problems:
+
+```csharp
+
+ class RegionClientContainerFactory
+ {
+ private readonly LanguageCloudClientProvider _languageCloudClientProvider;
+ private readonly IServiceProvider _serviceProvider;
+
+ private IAccountClient _accountClient;
+
+
+ public RegionClientContainerFactory(string region, IServiceProvider serviceProvider)
+ {
+ _languageCloudClientProvider = new LanguageCloudClientProvider(region);
+ _serviceProvider = serviceProvider;
+ }
+
+ public IAccountClient AccountClient {
+ get
+ {
+ // get custom authentication handler
+ LcHandler handler = _serviceProvider.GetRequiredService();
+
+ // ensure account client is instantiated only once
+ return _accountClient ??= _languageCloudClientProvider.GetAccountClient(handler);
+ }
+ }
+ }
+
+ class LanguageCloudClientFactory
+ {
+ private object _lock = new object();
+ private IServiceProvider _serviceProvider;
+
+ ConcurrentDictionary _regionClientContainerFactories = new ConcurrentDictionary();
+
+ LanguageCloudClientFactory(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ public RegionClientContainerFactory Region(string region)
+ {
+ if (!_regionClientContainerFactories.TryGetValue(region, out RegionClientContainerFactory regionClientContainerFactory))
+ {
+ lock (_lock)
+ {
+ if (!_regionClientContainerFactories.TryGetValue(region, out regionClientContainerFactory))
+ {
+ regionClientContainerFactory = new RegionClientContainerFactory(region, _serviceProvider);
+ _regionClientContainerFactories.TryAdd(region, regionClientContainerFactory);
+ }
+ }
+ }
+
+ return regionClientContainerFactory;
+ }
+ }
+
+```
+
+We register our handler `LcHandler` as a transient service and a Factory class with factory, in the `Startup` class:
+
+```csharp
+// Handlers should be registered as transient
+services.AddTransient();
+
+// Register the LanguageCloudClientFactory as a singleton. Resolve the handler from the provider when needed.
+services.AddSingleton(provider => new LanguageCloudClientFactory(provider.GetRequiredService()));
+```
+
+We can then use the registered client in the controller (or any other class resolved through Dependency Injection):
+
+```csharp
+public class LanguageCloudApiSampleController : ControllerBase
+{
+ LanguageCloudClientFactory _factory;
+
+ // inject the client via constructor
+ public LanguageCloudApiSampleController(LanguageCloudClientFactory clientFactory)
+ {
+ this._factory = clientFactory;
+ }
+
+ ...
+
+ // make an API call using a client and the user identity from HttpContext
+ var accountClient = _factory.Region("eu").AccountClient;
+ var accounts = await accountClient.ListMyAccountsAsync();
+
+ ...
+}
+```
diff --git a/articles/LCPublicAPI/docs/termbase/Termbase-entries.md b/articles/LCPublicAPI/docs/termbase/Termbase-entries.md
new file mode 100644
index 0000000..7f40137
--- /dev/null
+++ b/articles/LCPublicAPI/docs/termbase/Termbase-entries.md
@@ -0,0 +1,286 @@
+# Termbase entries
+
+
+## Creating a termbase entry
+
+A termbase entry can be created by making a `POST` request to the [`/termbases/{termbaseId}/entries`](../../api/Public-API.v1-fv.html#/operations/CreateTermbaseEntry) endpoint.
+
+Request example for an entry using language code `en`: `POST /termbases/61b70c0775ed5f14d8190fab/entries`
+```json
+{
+ "humanReadableId": "LC000000000000000000000001",
+ "languages": [
+ {
+ "language": {
+ "languageCode": "en"
+ },
+ "terms": [
+ {
+ "text": "Simple Entry"
+ }
+ ]
+ }
+ ]
+}
+```
+
+The `humanReadableId` is optional and can be any value. If it's not specified it will be autogenerated. The autogenerated value is not guaranteed to adhere to any specific format.
+
+### Creating a termbase entry with cross-references
+
+A termbase entry can contain cross-references. These references can have the following types: `entry`, `term` or `external`, representing the associated element type. For the `external` type you can use as value external URLs.
+For the `entry` type, the `entryId` needed can be retrieved by pressing the `Copy Entry ID` button on the user interface for the entry that should be referred.
+
+ See below an example of how to add a cross-reference of 'entry' type in the user interface:
+
+
+
+
+Equivalent cross-references can be created via API by using `fieldValueLinks` objects. In the next example, `value` is an HTML snippet, where the identifier provided in the value `LC61b7264d877e04258abc7da8` (note that it appears twice in the snippet) is the value from the `humanReadableId` field. This is the same for the UI example, as the "Copy Entry ID" button copies the `humanReadableId`, for the entry, into clipboard.
+
+Request example: `POST /termbases/61b70c0775ed5f14d8190fab/entries`
+```json
+{
+ "humanReadableId": "LC000000000000000000000001",
+ "languages": [
+ {
+ "language": {
+ "languageCode": "en"
+ },
+ "terms": [
+ {
+ "text": "New Simple entry",
+ "termbaseFieldValues": [
+ {
+ "termbaseFieldId": "61b71de9877e04258abc7d9f",
+ "value": "This is an new entry reference<\/a>",
+ "fieldValueLinks": [
+ {
+ "type": "entry",
+ "value": "This is a new entry reference"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+```
+
+> Note: The `termbaseFieldId` should match the field `id` from the termbase.
+
+Response example:
+```json
+{
+ "id": "61b73e4475ed5f14d81ae5e7",
+ "languages": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e8",
+ "language": {
+ "languageCode": "en",
+ "englishName": "English"
+ }
+ }
+ ]
+}
+```
+
+Postman example:
+
+
+
+
+
+
+## Updating a termbase entry
+
+A termbase entry can be updated by making a `PUT` request to the [`/termbases/{termbaseId}/entries/{entryId}`](../../api/Public-API.v1-fv.html#/operations/UpdateTermbaseEntry) endpoint.
+
+The update action changes the entire structure of an entry, it doesn't only update the terms specified in the request body. The terms that are not specified, are deleted. If some terms should not be updated, their structure must be send in the request as it currently is.
+
+The cross-references between terms can be updated using `fieldValueLinks` objects. Postman example:
+
+
+
+
+Request example: `PUT /termbases/61b70c0775ed5f14d8190fab/entries/61b73e4475ed5f14d81ae5e7`
+```json
+{
+ "humanReadableId": "LC000000000000000000000002",
+ "languages": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e8",
+ "language": {
+ "languageCode": "en"
+ },
+ "terms": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e9",
+ "text": "Simple Entry Updated",
+ "termbaseFieldValues": [
+ {
+ "id": "61b73e4475ed5f14d81ae5ea",
+ "termbaseFieldId": "61b71de9877e04258abc7d9f",
+ "value": "This is an updated entry reference<\/a>",
+ "fieldValueLinks": [
+ {
+ "type": "entry",
+ "value": "This is an updated entry reference"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+```
+
+
+## Retrieving a termbase entry
+
+A termbase entry can be retrieved by making a `GET` request to the [`/termbases/{termbaseId}/entries/{entryId}`](../../api/Public-API.v1-fv.html#/operations/GetTermbaseEntry) endpoint. Postman example:
+
+
+
+
+Request example: `GET /termbases/61b70c0775ed5f14d8190fab/entries/61b73e4475ed5f14d81ae5e7?fields=humanReadableId,languages.terms,languages.terms.termbaseFieldValues`
+
+Response example:
+```json
+{
+ "id": "61b73e4475ed5f14d81ae5e7",
+ "humanReadableId": "LC000000000000000000000002",
+ "languages": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e8",
+ "language": {
+ "languageCode": "en",
+ "englishName": "English"
+ },
+ "terms": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e9",
+ "text": "Simple Entry Updated",
+ "termbaseFieldValues": [
+ {
+ "id": "61b73e4475ed5f14d81ae5ea",
+ "name": "Term level field",
+ "termbaseFieldId": "61b71de9877e04258abc7d9f",
+ "value": "This is an updated entry reference"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+```
+
+
+## Retrieving the list of termbase entries
+
+You can retrieve the list of termbase entries by making a `GET` request to the [`/termbases/{termbaseId}/entries`](../../api/Public-API.v1-fv.html#/operations/ListTermbaseEntries) endpoint.
+
+Request example: `GET /termbases/61b70c0775ed5f14d8190fab/entries?fields=humanReadableId,languages.terms,languages.terms.termbaseFieldValues`
+
+Response example:
+```json
+{
+ "items": [
+ {
+ "id": "61b725aa75ed5f14d8190fea",
+ "humanReadableId": "LC61b725aa75ed5f14d8190fee",
+ "languages": [
+ {
+ "id": "61b725aa75ed5f14d8190feb",
+ "language": {
+ "languageCode": "en",
+ "englishName": "English"
+ },
+ "terms": [
+ {
+ "id": "61b725aa75ed5f14d8190fed",
+ "text": "Simple entry",
+ "termbaseFieldValues": [
+ {
+ "id": "61b733ee75ed5f14d81a8602",
+ "name": "Term level field",
+ "termbaseFieldId": "61b71de9877e04258abc7d9f",
+ "value": "This is an entry reference"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "61b7264d877e04258abc7da5",
+ "humanReadableId": "LC61b7264d877e04258abc7da8",
+ "languages": [
+ {
+ "id": "61b7264d877e04258abc7da6",
+ "language": {
+ "languageCode": "en",
+ "englishName": "English"
+ },
+ "terms": [
+ {
+ "id": "61b7264d877e04258abc7da7",
+ "text": "Entry reference",
+ "termbaseFieldValues": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "61b73e4475ed5f14d81ae5e7",
+ "humanReadableId": "LC000000000000000000000002",
+ "languages": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e8",
+ "language": {
+ "languageCode": "en",
+ "englishName": "English"
+ },
+ "terms": [
+ {
+ "id": "61b73e4475ed5f14d81ae5e9",
+ "text": "Simple Entry Updated",
+ "termbaseFieldValues": [
+ {
+ "id": "61b73e4475ed5f14d81ae5ea",
+ "name": "Term level field",
+ "termbaseFieldId": "61b71de9877e04258abc7d9f",
+ "value": "This is an updated entry reference"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "itemCount": 3
+}
+```
+
+
+## Deleting a termbase entry
+
+A termbase entry can be deleted by making a `DELETE` request to the [`/termbases/{termbaseId}/entries/{entryId}`](../../api/Public-API.v1-fv.html#/operations/DeleteTermbaseEntry) endpoint.
+
+Request example: `DELETE /termbases/61b70c0775ed5f14d8190fab/entries/61b73e4475ed5f14d81ae5e7`
+
+
+## Deleting all termbase entries
+
+All termbase entries can be deleted by making a `DELETE` request to the [`/termbases/{termbaseId}/entries`](../../api/Public-API.v1-fv.html#/operations/DeleteTermbaseEntries) endpoint.
+
+Request example: `DELETE /termbases/61b70c0775ed5f14d8190fab/entries`
+
diff --git a/articles/LCPublicAPI/docs/termbase/Termbase-import-export.md b/articles/LCPublicAPI/docs/termbase/Termbase-import-export.md
new file mode 100644
index 0000000..d324065
--- /dev/null
+++ b/articles/LCPublicAPI/docs/termbase/Termbase-import-export.md
@@ -0,0 +1,66 @@
+# Termbase import and export
+
+
+## Importing a termbase
+
+The following termbase formats are supported: `tbx` and `xml`.
+
+> Before importing a termbase, make sure you already created one using the [Create Termbase](../../api/Public-API.v1-fv.html#/operations/CreateTermbase) endpoint. Only empty termbases support importing content.
+
+To import a `tbx` or an `xml` termbase, perform a `POST` request to the [Import Termbase](../../api/Public-API.v1-fv.html#/operations/ImportTermbase) endpoint and provide the `termbaseId` and the termbase file. Optionally, you can specify two import settings via query parameters:
+
+1. `duplicateEntriesStrategy` - It determines how the duplicate entries will be handled and it can have one of the following values:
+
+ - `ignore` The content of the current entry with the same identifier will be kept and the new entry will be ignored.
+
+ - `merge` The content of the current entry with the same identifier will be merged into the imported entry. If the identifier is not provided, the content will be merged by text.
+
+ - `override` The content of the current entry with the same identifier will be replaced by the imported entry.
+
+> If `duplicateEntriesStrategy` is not sent, the default behavior will be `override`.
+
+
+2. `strictImport` - It specifies if the entries are imported only into the exact language that matches your imported file and it can have one of the following values:
+
+ - `true` The import will only occur if the language in your import file matches exactly a language in your termbase.
+
+ - `false` The import will occur even if there are non-matching languages, by trying to match them to a relevant main language or language variant, if available.
+
+> If `strictImport` is not sent, the default behavior will be `true`.
+
+If the import is successful, you will get back an `importId` and the import `status`.
+
+
+
+
+
+
+## Polling a termbase import
+Some imports may take longer, depending on the size of the termbase.
+
+To check if the import finished, you can perform a `GET` request to the [Poll Termbase Import](../../api/Public-API.v1-fv.html#/operations/PollTermbaseImport) endpoint and supply the `importId` and the `termbaseId`. The import is complete when the status is `done`.
+
+
+
+## Exporting a termbase
+The following termbase formats are supported: `tbx` and `xml`.
+
+To export a `tbx` or an `xml` termbase, perform a `POST` request to the [Export Termbase](../../api/Public-API.v1-fv.html#/operations/ExportTermbase) endpoint and provide the `termbaseId`.
+Optionally, you can specify in body, one of the two allowed formats. If none is specified, the default format will be `tbx`. Also, in the body, it can be specified if the download should be compressed (zipped) or not. By default, this property is set to `false`.
+
+If the export is successful, you will get back an `exportId`, the export `status` and the `downloadUrl` for this. If the export did not succeed, the response will contain an `errorMessage`.
+
+
+
+
+
+## Polling a termbase export
+Some exports may take longer, depending on the size of the termbase.
+
+To check if the export finished, you can perform a `GET` request to the [Poll Termbase Export](../../api/Public-API.v1-fv.html#/operations/PollExportTermbase) endpoint and supply the `exportId` and the `termbaseId`. The export is complete when the status is `done`.
+
+
+
+## Downloading a termbase export
+If an export is completed (the status received at the polling is `done`), it can be downloaded by performing a `GET` request to the [Download Exported Termbase](../../api/Public-API.v1-fv.html#/operations/DownloadExportedTermbase) endpoint. Supply as path parameters the `exportId` and the `termbaseId` and the response will contain the exported termbase file.
+
diff --git a/articles/LCPublicAPI/docs/termbase/Termbase-templates.md b/articles/LCPublicAPI/docs/termbase/Termbase-templates.md
new file mode 100644
index 0000000..05d4441
--- /dev/null
+++ b/articles/LCPublicAPI/docs/termbase/Termbase-templates.md
@@ -0,0 +1,178 @@
+# Termbase templates
+
+
+## Creating a termbase template
+
+A termbase template can be created by making a `POST` request to the [`/termbase-templates`](../../api/Public-API.v1-fv.html#/operations/CreateTermbaseTemplate) endpoint.
+
+> Note: If the `location` is not specified, the template will be created in the root folder.
+
+> Note: When `dataType` is `picklist`, the `pickListValues` array must be filled in or the `allowCustomValues` must be set to true.
+
+Postman example:
+
+
+
+
+Request example: `POST /termbase-templates`
+
+``` json
+{
+ "name": "Simple Termbase template",
+ "description": "A simple termbase template.",
+ "location": "5ebcd778b3d9411141eeff7a",
+ "copyright": "RWS",
+ "languages": [{
+ "languageCode": "en-US"
+ }
+ ],
+ "fields": [{
+ "name": "Entry level field",
+ "description": "A simple entry level field description.",
+ "level": "entry",
+ "dataType": "text",
+ "allowMultiple": true,
+ "isMandatory": false
+ }, {
+ "name": "Language level field",
+ "description": "A simple language level field description.",
+ "level": "language",
+ "dataType": "boolean",
+ "allowMultiple": false,
+ "isMandatory": true
+ }, {
+ "name": "Term level field",
+ "description": "A simple term level field description.",
+ "level": "term",
+ "dataType": "picklist",
+ "pickListValues": [
+ "Option 1",
+ "Option 2",
+ "Option 3"
+ ],
+ "allowCustomValues": false,
+ "allowMultiple": false,
+ "isMandatory": false
+ }
+ ]
+}
+
+```
+
+Response example:
+```json
+{
+ "id": "6156bbc7a638696c7686db7f",
+ "name": "Simple Termbase template",
+ "location": {
+ "id": "5ebcd778b3d9411141eeff7a",
+ "name": "RWS"
+ },
+ "type": "userDefined"
+}
+```
+
+
+## Updating a termbase template
+
+A termbase template can be updated by making a `PUT` request to the [`/termbase-templates/{termbaseTemplateId}`](../../api/Public-API.v1-fv.html#/operations/UpdateTermbaseTemplate) endpoint. Postman example:
+
+
+
+
+Request example: `PUT /termbase-templates/6156bbc7a638696c7686db7f`
+```json
+{
+ "name": "[UPDATED] Simple Termbase template",
+ "description": "A simple termbase template.",
+ "copyright": "RWS",
+ "languages": [{
+ "languageCode": "en-US"
+ }
+ ],
+ "fields": [{
+ "name": "[UPDATED] Entry level field",
+ "description": "A simple entry level field description.",
+ "level": "entry",
+ "dataType": "double",
+ "allowMultiple": true,
+ "isMandatory": false
+ }
+ ]
+}
+```
+
+
+## Retrieving a termbase template
+
+A termbase template can be retrieved by making a `GET` request to the [`/termbase-templates/{termbaseTemplateId}`](../../api/Public-API.v1-fv.html#/operations/GetTermbaseTemplate) endpoint.
+
+Request example: `GET /termbase-templates/6156bbc7a638696c7686db7f?fields=name,location,description,languages,fields`
+
+Response example:
+```json
+{
+ "id": "615ae37ac736b8373d19a717",
+ "name": "[UPDATED] Simple Termbase template",
+ "description": "A simple termbase template.",
+ "location": {
+ "id": "5ebcd778b3d9411141eeff7a",
+ "name": "RWS"
+ },
+ "type": "userDefined",
+ "languages": [{
+ "languageCode": "en-US",
+ "englishName": "English (United States)"
+ }
+ ],
+ "fields": [{
+ "id": "615af63ca638696c7687d7fa",
+ "name": "[UPDATED] Entry level field",
+ "type": "userDefined",
+ "level": "entry",
+ "dataType": "double"
+ }
+ ]
+}
+
+```
+
+
+## Retrieving termbase templates
+
+You can retrieve the list of termbase templates by making a `GET` request to the [`/termbase-templates`](../../api/Public-API.v1-fv.html#/operations/ListTermbaseTemplates) endpoint.
+
+Request example: `GET /termbase-templates?fields=name,description`
+
+Response example:
+```json
+{
+ "items": [{
+ "id": "541823689b976a6a9de11dfe",
+ "name": "Basic",
+ "description": "description",
+ "type": "system"
+ }, {
+ "id": "541823689b976a6a9de11dff",
+ "name": "Advanced",
+ "description": "description",
+ "type": "system"
+ }, {
+ "id": "615ae37ac736b8373d19a717",
+ "name": "[UPDATED] Simple Termbase template",
+ "description": "A simple termbase template.",
+ "type": "userDefined"
+ }
+ ],
+ "itemCount": 3
+}
+```
+
+
+## Deleting termbase templates
+
+A termbase template can be deleted by making a `DELETE` request to the [`/termbase-templates/{termbaseTemplateId}`](../../api/Public-API.v1-fv.html#/operations/DeleteTermbaseTemplate) endpoint.
+
+> Note: You can only delete the `userDefined` termbases.
+
+Request example: `DELETE /termbase-templates/6156bbc7a638696c7686db7f`
diff --git a/articles/LCPublicAPI/docs/termbase/Termbase.md b/articles/LCPublicAPI/docs/termbase/Termbase.md
new file mode 100644
index 0000000..9544536
--- /dev/null
+++ b/articles/LCPublicAPI/docs/termbase/Termbase.md
@@ -0,0 +1,185 @@
+# Termbases
+
+
+## Creating a termbase
+
+A termbase can be created by making a `POST` request to the [`/termbases`](../../api/Public-API.v1-fv.html#/operations/CreateTermbase) endpoint.
+
+You can create a termbase based on an existing termbase template by providing the `termbaseTemplateId`. This will create the termbase using the structure described by the template. For details about termbase templates, see [`Termbase Template`](../../docs/termbase/Termbase-templates.md). Postman example:
+
+
+
+
+
+Request example: `POST /termbases`
+```json
+{
+ "name": "Simple Termbase",
+ "description": "A simple termbase",
+ "copyright": "RWS",
+ "location" : "60b0a03152a974047fd46fb0"
+ "termbaseTemplateId": "your-termbase-template-id"
+}
+```
+
+If, however, you wish to provide your own custom termbase structure, you can do so by supplying it via the `termbaseStructure` object in the request body. Postman example:
+
+
+
+
+Request example: `POST /termbases`
+```json
+{
+ "name": "Simple Termbase",
+ "description": "A simple termbase",
+ "copyright": "RWS",
+ "location" : "60b0a03152a974047fd46fb0"
+ "termbaseStructure": {
+ "languages": [
+ {
+ "languageCode": "en-US"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Entry level field",
+ "description": "A simple entry level field description.",
+ "level": "entry",
+ "allowCustomValues": true,
+ "allowMultiple": true,
+ "isMandatory": false
+ "dataType": "picklist",
+ "pickListValues": [
+ "picklist-value-1",
+ "picklist-value-2",
+ "picklist-value-3"
+ ]
+ }
+ ]
+ }
+}
+```
+
+
+Response example:
+```json
+{
+ "id": "6171694efb696c53e5ad726e",
+ "name": "Simple Termbase",
+ "location": {
+ "id": "60b0a03152a974047fd46fb0",
+ "name": "RWS"
+ }
+}
+```
+> Note: If both the `termbaseTemplateId` and the `termbaseStructure` are added in the request, the `termbaseStructure` takes precedence. In other words, the `termbaseTemplateId` is ignored.
+
+
+## Updating a termbase
+> You can update the fields for a termbase only if the termbase you want to update was not created using a termbase template or if it does not already have fields defined.
+
+A termbase can be updated by making a `PUT` request to the [`/termbases/{termbaseId}`](../../api/Public-API.v1-fv.html#/operations/UpdateTermbase) endpoint and providing the `termbaseTemplateId`.
+
+Request example: `PUT /termbases/616d0efa7a11677d6085b0be`
+```json
+{
+ "name": "[UPDATED] Simple Termbase",
+ "description": "A simple termbase",
+ "copyright": "[UPDATED] RWS",
+ "termbaseTemplateId" : "your-termbase-template-id"
+}
+```
+
+If, however, you wish to provide your own custom termbase structure, you can do so by supplying it via the `termbaseStructure` object in the request body. Postman example:
+
+
+
+
+Request example: `PUT /termbases/616d0efa7a11677d6085b0be`
+```json
+{
+ "name": "[UPDATED] Simple Termbase",
+ "description": "A simple termbase",
+ "copyright": "[UPDATED] RWS",
+ "termbaseStructure": {
+ "languages": [
+ {
+ "languageCode": "en-US"
+ }
+ ],
+ "fields": [
+ {
+ "id": "616d0efa7a12676d603b71ad",
+ "name": "[UPDATED] Entry level field",
+ "description": "A simple entry level field description.",
+ "level": "entry",
+ "dataType": "text",
+ "allowMultiple": true,
+ "isMandatory": false
+ }
+ ]
+ }
+}
+```
+> Note: If both the `termbaseTemplateId` and the `termbaseStructure` are added in the request, the `termbaseStructure` takes precedence. In other words, the `termbaseTemplateId` is ignored.
+
+> Note: If you perform an update using a termbase field without an `id`, the field will be added to the termbase.
+
+## Retrieving a termbase
+
+A termbase can be retrieved by making a `GET` request to the [`/termbases/{termbaseId}`](../../api/Public-API.v1-fv.html#/operations/GetTermbase) endpoint.
+
+Request example: `GET /termbases/616d0efa7a11677d6085b0be`
+
+Response example:
+```json
+{
+ "id": "616d28597a11677d60862233",
+ "name": "[UPDATED] Simple Termbase",
+ "copyright": "[UPDATED] RWS",
+ "location": {
+ "id": "60b0a03152a974047fd46fb0",
+ "name": "RWS"
+ }
+}
+```
+
+
+## Retrieving the list of termbases
+
+You can retrieve the list of termbases by making a `GET` request to the [`/termbases`](../../api/Public-API.v1-fv.html#/operations/ListTermbase) endpoint.
+
+Request example: `GET /termbases`
+
+Response example:
+```json
+{
+ "items": [
+ {
+ "id": "616d28597a11677d60862233",
+ "name": "[UPDATED] Simple Termbase",
+ "location": {
+ "id": "60b0a03152a974047fd46fb0",
+ "name": "RWS"
+ }
+ },
+ {
+ "id": "616d0efa7a11677d6085b0be",
+ "name": "New Termbase",
+ "location": {
+ "id": "60b0a03152a974047fd46fb0",
+ "name": "RWS"
+ }
+ }
+ ],
+ "itemCount": 2
+}
+```
+
+> Note: Some properties are not available for this endpoint: `numberOfEntries`, `status`, `createdAt` and `lastModifiedAt`.
+
+## Deleting termbases
+
+A termbase can be deleted by making a `DELETE` request to the [`/termbases/{termbaseId}`](../../api/Public-API.v1-fv.html#/operations/DeleteTermbase) endpoint.
+
+Request example: `DELETE /termbases/616d0efa7a11677d6085b0be`
diff --git a/articles/LCPublicAPI/docs/translation-memory/Translation-memory-import-export.md b/articles/LCPublicAPI/docs/translation-memory/Translation-memory-import-export.md
new file mode 100644
index 0000000..afca740
--- /dev/null
+++ b/articles/LCPublicAPI/docs/translation-memory/Translation-memory-import-export.md
@@ -0,0 +1,77 @@
+# Translation Memory import and export
+
+## Concepts
+
+
+Concept | Explanation |
+---------|----------|
+ Translation Unit | A pair made of source and target segments |
+ Fields | The `fields` contain metadata about the translation unit. |
+
+## Importing a translation memory
+
+The translation memory that you want to import must have one of the following formats: `tmx`, `sdltm`, `zip`, `tmx.gz` or `sdlxliff`.
+
+> Before the import action, make sure you have already created a translation memory using the [Create Translation Memory](../../api/Public-API.v1-fv.html#/operations/CreateTranslationMemory) endpoint.
+
+To import a translation memory, perform a `POST` request to the [Import Translation Memory](../../api/Public-API.v1-fv.html#/operations/ImportTranslationMemory) endpoint and provide these details: `translationMemoryId`, the translation memory file and a couple of properties.
+
+
+> Pay special attention to the order of `properties` and `file`. It must be exactly as described in the contract (properties first).
+
+If you are not sure what properties to include, here's a short description for each of them:
+1. `sourceLanguageCode` and `targetLanguageCode` - These fields represent the language direction of your import. Make sure to provide both of them as they are required fields.
+2. `importAsPlainText` - When true, the translation units will be imported as plain text, excluding any text markup.
+3. `exportInvalidTranslationUnits` - When true, all the translation units that failed to import are saved in a `tmx` file.
+4. `triggerRecomputeStatistics` - When true, will recompute the fuzzy index statistics once the import is done.
+5. `targetSegmentsDifferOption` - Option to specify how to handle translation units in the Translation Memory, if the target segments differ.
+ - `addNew` - Add a new translation unit and leave the original translation unit with the same source untouched.
+ - `overwrite` - Overwrite all the existing translation units where the source segment matches with the new content.
+ - `leaveUnchanged` - Do not change the existing translation units with the same source segment and ignore the new translation unit.
+ - `keepMostRecent` - Delete all the existing translation units with matching source segments and retain only the most recent translation unit
+6. `unknownFieldsOption` - Option to specify how to handle translation units and unknown fields in the Translation Memory.
+ - `addToTranslationMemory` - The translation unit is processed and the unknown user-defined fields are automatically added to the setup.
+ - `skipTranslationUnit` - The translation units containing unknown user-defined fields are skipped.
+ - `ignore` - The translation unit is processed and the unknown user-defined fields are ignored (not added to the setup).
+ - `failTranslationUnitImport` - If any translation unit contains an unknown user-defined field an error is thrown.
+7. `onlyImportSegmentsWithConfirmationLevels` - Only segments with the specified confirmation levels will be imported.
+ - `translated` - The segment has been fully translated, but not yet reviewed.
+ - `approvedTranslation` - The translation has been reviewed and approved, but not signed-off.
+ - `approvedSignOff` - The translation has been approved and signed-off.
+ - `draft` - The target segment may have been changed, but it's not yet considered fully translated.
+ - `rejectedTranslation` - The translation has been reviewed and rejected.
+ - `rejectedSignOff` - The translation was rejected in the sign-off process.
+
+Note that only the `sourceLanguageCode` and `targetLanguageCode` fields are **required**, the others already have default values, so you don't have to set them.
+
+If the import is successful, you will get back the import `id` and the `status`(normally `queued`).
+
+For more details about translation memory imports you can also check out the [Importing TM content](https://docs.rws.com/791595/741139/trados-enterprise/importing-tm-content) page.
+
+
+
+
+## Polling a translation memory import
+Some imports may take longer, depending on the size of the Translation Memory.
+
+To check if the import finished, you can perform a `GET` request to the [Poll Translation Memory Import](../../api/Public-API.v1-fv.html#/operations/PollTMImport) endpoint and supply the `importId` and the `translationMemoryId`. The import is complete when the status is `done`.
+
+
+## Exporting a translation memory
+
+To export a translation memory, perform a `POST` request to the [Export Translation Memory](../../api/Public-API.v1-fv.html#/operations/ExportTranslationMemory) endpoint and provide the `translationMemoryId` and a valid `languageDirection` of your translation memory.
+
+If the export is successful, you will get back an `exportId` and the export `status`. If the export did not succeed, the response will contain an error message.
+
+
+
+## Polling a translation memory export
+
+Some exports may take longer, depending on the size of the Translation Memory.
+
+To check if the export finished, you can perform a `GET` request to the [Poll Translation Memory Export](../../api/Public-API.v1-fv.html#/operations/PollTranslationMemoryExport) endpoint and supply the `exportId`. The export is complete when the status is `done`.
+
+## Downloading a translation memory export
+
+If an export is completed successfully (the status received at the polling is `done`), it can be downloaded by performing a `GET` request to the [Download Exported Translation Memory](../../api/Public-API.v1-fv.html#/operations/DownloadExportedTranslationMemory) endpoint. Just supply as `path` parameter the `exportId` and the response will contain the exported translation memory file in `tmx.gz` format.
+
diff --git a/articles/LCPublicAPI/docs/translations/Translations.md b/articles/LCPublicAPI/docs/translations/Translations.md
new file mode 100644
index 0000000..30e3e12
--- /dev/null
+++ b/articles/LCPublicAPI/docs/translations/Translations.md
@@ -0,0 +1,313 @@
+# Translation API
+
+The Translation API provides endpoints for performing translation operations using translation engines. These endpoints allow you to lookup translations, perform concordance searches, and manage translation units within your translation memories.
+
+## Overview
+
+The Translation API enables you to:
+- **Lookup translations** for text or BCM fragments using translation memories and machine translation
+- **Perform concordance searches** to find similar segments within translation memories
+- **Add new translation units** to translation memories
+- **Update existing translation units** in translation memories
+
+All translation operations require a translation engine that defines which translation memories, machine translation engines, and termbases to use for the translation process.
+
+
+> The BCM fragment format is used for input and output as JSON string, meaning that you will need to serialize and deserialize the BCM fragments when sending requests or processing responses. For .NET you can use the `Sdl.Core.Bcm.API` [nuget package](https://www.nuget.org/packages/Sdl.Core.Bcm.API).
+
+## Endpoints
+
+### Translation Lookup
+
+[`POST /translations/lookup`](../../api/Public-API.v1-fv.html#/operations/TranslationsLookup)
+
+Translates a phrase in plain text or a BCM fragment containing a single segment. The translated content will be returned as a [BCM fragment](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Fragment.html) or [term](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Skeleton.Term.html).
+
+**Use cases:**
+- Get translation suggestions for a source segment
+- Retrieve matches from translation memories
+- Get machine translation proposals
+- Access termbase entries for specific terms
+
+**Key features:**
+- Supports both plain text and BCM fragment input
+- Returns translations from multiple resource types (TM, MT, TB)
+- Configurable match thresholds and penalties
+
+**Request body example:**
+```json
+{
+ "input": {
+ "content": "Hello world",
+ "contentType": "text"
+ },
+ "languageDirection": {
+ "sourceLanguage": {
+ "languageCode": "en-US"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR"
+ }
+ },
+ "definition": {
+ "translationEngineId": "your-translation-engine-id"
+ },
+ "settings": {
+ "translationMemory": {
+ "minimumMatchValue": 70,
+ "penalties": {
+ "standardPenalties": {
+ "missingFormatting": 1,
+ "differentFormatting": 1
+ }
+ }
+ }
+ }
+}
+```
+
+
+> The `translationProposal` field in the response can be either a BCM fragment or a term. You can rely on the `responseType` field to determine the content type and deserialize it accordingly.
+
+### Concordance Search
+
+[`POST /translations/concordance`](../../api/Public-API.v1-fv.html#/operations/TranslationsConcordanceSearch)
+
+Performs a concordance search for a given text within the translation memories linked to the specified translation engine. This helps you find segments that contain specific words or phrases.
+
+**Use cases:**
+- Research how certain phrases have been translated previously
+- Quality assurance and consistency checking
+- Translation memory analysis
+
+**Key features:**
+- Search within source or target segments
+- Support for exact and fuzzy matching
+- Configurable search parameters and penalties
+- Returns matching segments with context
+
+
+> The Translation Memory penalty defined in the Translation Engine will be automatically included in the translation score.
+
+**Request body example:**
+```json
+{
+ "input": {
+ "content": "user interface"
+ },
+ "languageDirection": {
+ "sourceLanguage": {
+ "languageCode": "en-US"
+ },
+ "targetLanguage": {
+ "languageCode": "fr-FR"
+ }
+ },
+ "definition": {
+ "translationEngineId": "your-translation-engine-id"
+ },
+ "targetOnly": false,
+ "settings": {
+ "translationMemory": {
+ "minimumMatchValue": 80
+ }
+ }
+}
+```
+
+### Translation Unit Management
+
+#### Update Translation Unit
+
+[`PUT /translations/translation-unit`](../../api/Public-API.v1-fv.html#/operations/TranslationsUpdate)
+
+Updates an existing translation unit in the translation memories. The system identifies matching translation units based on the `originalTranslationHash` provided in the BCM fragment.
+
+
+> After each update the `targetContent.translationOrigin.originalTranslationHash` is updated. The new values are returned in the response on the `translationHash` field.
+> Subsequent updates can be performed by updating the `targetContent.translationOrigin.originalTranslationHash` in the BCM fragment with the new `translationHash`, otherwise the system will add a new translation unit instead of updating the existing one.
+
+
+> Changing any fields in the `sourceContent` of a BCM fragment will result in a new translation unit being added instead of updating the existing one.
+
+**Use cases:**
+- Correct existing translations
+- Update translation metadata
+- Modify translation unit fields
+- Maintain translation memory quality
+
+**Key features:**
+- Smart matching of existing translation units
+- Preserve or update translation metadata
+- Configurable update behavior
+- Support for custom fields
+
+**Request body example for both add and update:**
+```json
+{
+ "input": {
+ "content": "BCM fragment"
+ },
+ "definition": {
+ "translationEngineId": "your-translation-engine-id"
+ },
+ "settings": {
+ "fields": [
+ {
+ "name": "field-name",
+ "values": [ "field-value" ]
+ }
+ ]
+ }
+}
+```
+
+#### Add Translation Unit
+
+[`POST /translations/translation-unit`](../../api/Public-API.v1-fv.html#/operations/TranslationsAdd)
+
+Adds a new translation unit to the translation memories.
+
+**Use cases:**
+- Add new translations units whose existence in the translation memory is unknown
+- If, however, the translation unit with the same source already exists, it will be updated based on the `ifTargetSegmentsDiffer` field
+- Populate translation memories with approved content
+
+**Key features:**
+- Automatic duplicate handling
+- Field template support for metadata
+- Configurable behavior for existing translations
+- BCM fragment support for rich content
+
+## BCM Fragments
+
+Many Translation API endpoints work with BCM (Binary Content Model) fragments. BCM is RWS's content model that preserves formatting, tags, and metadata within translation content.
+
+**BCM advantages:**
+- Preserves inline formatting and tags
+- Maintains content structure during translation
+- Supports complex document elements
+- Enables accurate translation memory matching
+
+For more information about BCM fragments, see the [BCM documentation](https://developers.rws.com/languagecloud-api-docs/api/bcm/Sdl.Core.Bcm.BcmModel.Fragment.html).
+
+Example of a BCM fragment:
+```json
+{
+ "sourceLanguageCode": "en-US",
+ "targetLanguageCode": "fr-FR",
+ "sourceContent": {
+ "id": "166fbfdd-8e0a-46aa-97bf-7b2b62014e5f",
+ "segmentNumber": "1",
+ "confirmationLevel": "Translated",
+ "type": "segment",
+ "children": [
+ {
+ "id": "c0cff9db-46e4-493d-b578-25e78d578ea7",
+ "placeholderTagDefinitionId": 1,
+ "tagNumber": "50",
+ "type": "placeholderTag",
+ "metadata": {
+ "SDL:IsSoftBreak": "True",
+ "SpecialCharacterPlaceholder": "‌",
+ "frameworkOriginalTagId": "50",
+ "SDL:IsWordStop": "False"
+ }
+ },
+ {
+ "id": "4b5cbfc4-53b1-462c-86a4-dbc061b5f266",
+ "text": "This is a sample text",
+ "type": "text"
+ }
+ ]
+ },
+ "targetContent": {
+ "id": "166fbfdd-8e0a-46aa-97bf-7b2b62014e5f",
+ "segmentNumber": "1",
+ "confirmationLevel": "Translated",
+ "translationOrigin": {
+ "originType": "tm",
+ "originSystem": "Example TM",
+ "matchPercent": 92,
+ "textContextMatchLevel": "None",
+ "originalTranslationHash": "-377851791",
+ "createdBy": "some-user-id",
+ "createdOn": "2023-09-25T14:24:04.000Z",
+ "modifiedBy": "some-user-id",
+ "modifiedOn": "2025-02-12T09:25:57.000Z",
+ "metadata": {
+ "used_on": "04/01/2025 13:56:28",
+ "used_by": "some-user-id",
+ "use_count": "8"
+ }
+ },
+ "type": "segment",
+ "metadata": {
+ "Contexts": [
+ {
+ "Context1": 0,
+ "Context2": 0,
+ "Segment1": null,
+ "Segment2": null,
+ "LeftSource": 0,
+ "LeftTarget": 0
+ }
+ ]
+ },
+ "children": [
+ {
+ "id": "6143602c-5548-43d0-a2fc-1a5a7f2aeb35",
+ "text": "Ceci est un exemple de texte",
+ "type": "text"
+ }
+ ]
+ }
+}
+```
+
+## Translation Memory Penalties
+
+The Translation API supports various penalty types to fine-tune translation matching:
+
+### Standard Penalties
+- **Missing Formatting**: Penalty for matches missing formatting tags
+- **Different Formatting**: Penalty for matches with different formatting
+- **Multiple Translations**: Penalty for segments with multiple translation options
+
+### Translation Unit Status Penalties
+- **Translated**: Penalty for translated but not reviewed segments
+- **Approved Translation**: Penalty for approved translations
+- **Rejected Translation**: Penalty for rejected translations
+
+Learn more about [Translation Memory penalties](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/trados-tm-penalties-1159224) and [Translation Unit status penalties](https://docs.rws.com/en-US/trados-enterprise-accelerate-791595/editing-project-tm-and-verification-settings-800732).
+
+## Best Practices
+
+### Performance Optimization
+- Set appropriate minimum match values to reduce processing time
+- Use reasonable penalty values to balance quality and performance
+
+### Quality Management
+- Configure penalties based on your quality requirements
+- Regularly update translation units to maintain accuracy
+
+### Translation Memory Maintenance
+- Add high-quality translations to build reliable TMs
+- Update outdated translations to keep content current
+- Use appropriate field templates for metadata management
+
+## Related APIs
+
+- **[Translation Memory API](../translation-memory/Translation-memory-import-export.md)**: Bulk import/export of translation memories
+- **[Translation Engine API](../../api/Public-API.v1-fv.html#/operations/UpdateTranslationEngine)**: Manage translation engine configurations
+- **[Termbase API](../termbase/Termbase.md)**: Manage terminology resources
+
+## Examples and Use Cases
+
+### Building a Translation Workflow
+
+1. **Setup**: Configure translation engine with TMs, MT, and termbases
+2. **Lookup**: Use `/translations/lookup` for translation suggestions
+3. **Research**: Use `/translations/concordance` for plain text research
+4. **Quality**: Add/update translation units with the updated BCM fragments retrieved from the previous requests to improve TM quality
+5. **Maintenance**: Regular TM updates and quality checks
diff --git a/articles/LCPublicAPI/docs/webhooks/Batched-webhooks.md b/articles/LCPublicAPI/docs/webhooks/Batched-webhooks.md
new file mode 100644
index 0000000..0a970f2
--- /dev/null
+++ b/articles/LCPublicAPI/docs/webhooks/Batched-webhooks.md
@@ -0,0 +1,56 @@
+# Batched Webhooks
+
+Webhooks can be batched to reduce the number of HTTP requests. Batched webhooks are sent as a single HTTP request to the configured webhook URL.
+The request body follows the [Webhook Batch](../../api/Webhooks.v1-fv.html#/schemas/webhook-batch) structure and contains a set of [Trados Cloud Platform events](../../api/Webhooks.v1-fv.html#/schemas/webhook).
+
+## Considerations for Consuming Batched Webhooks
+
+* Create the webhook endpoint to handle batched webhooks. The endpoint must be capable of processing multiple events in a single request.
+* The same [webhook authenticity](Webhooks-setup.md#webhook-authenticity) rules apply to both batched and single webhooks.
+* The same **success/failure** rules for webhook notifications apply, as described in [notification responses](Webhooks-setup.md#return-notification-responses).
+ * **Note:** A notification delivery is considered successful if the application responds with a 2xx status code within 20 seconds (compared to 3 seconds for individual webhooks).
+* The **retry policies** and **circuit breaker** mechanisms for webhook notifications are the same as those described in [notification responses](Webhooks-setup.md#return-notification-responses).
+* The same **headers** are included in batched webhooks as in single webhooks, as outlined in the [reference](Webhooks-setup.md#reference).
+
+## Example Request for a Batched Webhook
+
+```json
+{
+ "itemCount": 42,
+ "items": [
+ {
+ "eventId": "EVENT_ID",
+ "eventType": "PROJECT.CREATED",
+ "version": "1.0",
+ "timestamp": "TIMESTAMP",
+ "accountId": "ACCOUNT_ID",
+ "data": { ... }
+ },
+ {
+ "eventId": "EVENT_ID",
+ "eventType": "PROJECT.TASK.CREATED",
+ "version": "1.0",
+ "timestamp": "TIMESTAMP",
+ "accountId": "ACCOUNT_ID",
+ "data": { ... }
+ },
+ ...
+ ]
+}
+```
+
+## Batch Size and Frequency
+
+Batched webhooks are sent when either the maximum batch size is reached or a predefined time interval elapses.
+The current configuration for the Trados Cloud Platform is:
+
+* The maximum batch size is 100 events.
+* The maximum time interval is 1 second.
+
+> **Note:** These values are subject to change without prior notice to enhance system efficiency and ensure platform stability.
+
+## Key Considerations for Efficient Batching
+
+* Ensure that a single URL is set for receiving batched webhooks in the Trados Cloud Platform.
+* Create a single webhook under [Webhooks Setup](Webhooks-setup.md#subscribe-to-webhook-events) that subscribes to multiple event types.
+
diff --git a/articles/LCPublicAPI/docs/webhooks/Webhooks-payload.md b/articles/LCPublicAPI/docs/webhooks/Webhooks-payload.md
new file mode 100644
index 0000000..946bec3
--- /dev/null
+++ b/articles/LCPublicAPI/docs/webhooks/Webhooks-payload.md
@@ -0,0 +1,77 @@
+# Webhooks payload
+
+**The request body** has the same standard JSON format for all [Trados Cloud Platform events](../../api/Webhooks.v1-fv.html#/schemas/webhook).
+
+An example of request for a `PROJECT_CREATED` event:
+
+```json
+{
+ "eventId": "EVENT_ID",
+ "eventType": "PROJECT.CREATED",
+ "version": "1.0",
+ "timestamp": "TIMESTAMP",
+ "accountId": "ACCOUNT_ID",
+ "data": {
+ "id": "DATA_ID",
+ "name": "PROJECT_NAME",
+ "description": "PROJECT_DESCRIPTION",
+ "customFields": [
+ {
+ "id": "CUSTOM_FIELD_ID1",
+ "key": "CUSTOM_FIELD_KEY1",
+ "value": "CUSTOM_FIELD_VALUE1"
+ },
+ {
+ "id": "CUSTOM_FIELD_ID2",
+ "key": "CUSTOM_FIELD_KEY2",
+ "value": "CUSTOM_FIELD_VALUE2"
+ }
+ ]
+ }
+}
+```
+
+> Note: Depending on the event type, the `data` field will contain a different object, representing the Data Payload Object as mentioned in the next example. This will include different details relevant to that event type, please check the table below.
+
+This is the envelope that is common to all events, and only the < Data Payload Object part > is specific and depending on the event type.
+
+```json
+{
+ "eventId": "EVENT_ID",
+ "eventType": "PROJECT.CREATED",
+ "version": "1.0",
+ "timestamp": "TIMESTAMP",
+ "accountId": "ACCOUNT_ID",
+ "data": {
+ < Data Payload Object part >
+ }
+}
+```
+
+
+| Event | Data payload object model | Trigger operations in Trados Cloud Platform API | Trigger operations in Trados UI |
+|---|---|---|---|
+| `PROJECT.TASK.ACCEPTED` | [`task-event`](../../api/Webhooks.v1-fv.html#/schemas/task-event) | Accept task Accept error task | Accept task Accept error task |
+| `PROJECT.TASK.CREATED` | [`task-event`](../../api/Webhooks.v1-fv.html#/schemas/task-event) | Generate task | Generate task |
+| `PROJECT.TASK.COMPLETED` | [`task-event`](../../api/Webhooks.v1-fv.html#/schemas/task-event) | Complete task | Complete task |
+| `PROJECT.TASK.UPDATED` | [`task-event`](../../api/Webhooks.v1-fv.html#/schemas/task-event) | Generate task Accept task Reject task Release task Assign task Reassign task Complete task | Generate task Accept task Reject task Release task Assign task Reassign task Complete task |
+| `PROJECT.TASK.DELETED` | [`task-event`](../../api/Webhooks.v1-fv.html#/schemas/task-event) | Delete project and its tasks | Delete project and its tasks |
+| `PROJECT.CREATED` | [`project-event`](../../api/Webhooks.v1-fv.html#/schemas/project-event) | Create project | Create project |
+| `PROJECT.STARTED` | [`project-event`](../../api/Webhooks.v1-fv.html#/schemas/project-event) | Start project | Start project |
+| `PROJECT.UPDATED` | [`project-event`](../../api/Webhooks.v1-fv.html#/schemas/project-event) | Start project (This event will also be emitted in addition to `PROJECT.STARTED`) Update project by changing any field Complete project Cancel source file Complete target file | Start project (This event will also be emitted in addition to `PROJECT.STARTED`) Update project by changing the `Project Information`, `Configuration` or `Custom Fields` fields in the `Settings` tab Complete project Set project back in progress Cancel project Complete target file |
+| `PROJECT.DELETED` | [`project-event`](../../api/Webhooks.v1-fv.html#/schemas/project-event) | Delete project | Delete project |
+| `PROJECT.TEMPLATE.CREATED` | [`project-template-event`](../api/Webhooks.v1-fv.html#/schemas/project-template-event) | | Create project template |
+| `PROJECT.TEMPLATE.UPDATED` | [`project-template-event`](../../api/Webhooks.v1-fv.html#/schemas/project-template-event) | | Create project template Update project template |
+| `PROJECT.TEMPLATE.DELETED` | [`project-template-event`](../../api/Webhooks.v1-fv.html#/schemas/project-template-event) | | Delete project template |
+| `PROJECT.SOURCE.FILE.CREATED` | [`source-file-event`](../api/Webhooks.v1-fv.html#/schemas/source-file-event) | Add source file to project Attach source files to project | Add reference file to project Add translatable file to project |
+| `PROJECT.SOURCE.FILE.UPDATED` | [`source-file-event`](../../api/Webhooks.v1-fv.html#/schemas/source-file-event) | Update source file by changing the `name` field Add source file version The project reaches the `File Type Detection` task The project reaches the `File Format Conversion` task | Update source file by changing the `fileType` or `fileRole` fields Add source file version via `Replace file` action Delete source file version Cancel source file The project reaches the `File Type Detection` task The project reaches the `File Format Conversion` task |
+| `PROJECT.SOURCE.FILE.DELETED` | [`source-file-event`](../../api/Webhooks.v1-fv.html#/schemas/source-file-event) |Delete project and its tasks | Delete project and its tasks |
+| `PROJECT.TARGET.FILE.CREATED` | [`target-file-event`](../../api/Webhooks.v1-fv.html#/schemas/target-file-event) | The project reaches the `File Format Conversion` task | The project reaches the `File Format Conversion` task |
+| `PROJECT.TARGET.FILE.UPDATED` | [`target-file-event`](../../api/Webhooks.v1-fv.html#/schemas/target-file-event) | Update source file by changing the `name` field Add target file version Import target file version The project reaches the `File Format Conversion` task The project reaches the `Copy Source to Target` task The project reaches the `Machine Translation` task The project reaches the `Bilingual Engineering` task The project reaches the `Translation` task The project reaches the `Linguistic Review` task The project reaches the `Customer Review` task The project reaches the `Implement Customer Review` task The project reaches the `Target File Generation` task | Add target file version via `Upload SDLXLIFF` action Replace target file Delete target file version Cancel target file The project reaches the `File Format Conversion` task The project reaches the `Copy Source to Target` task The project reaches the `Machine Translation` task The project reaches the `Bilingual Engineering` task The project reaches the `Translation` task The project reaches the `Linguistic Review` task The project reaches the `Customer Review` task The project reaches the `Implement Customer Review` task The project reaches the `Target File Generation` task |
+| `PROJECT.TARGET.FILE.DELETED` | [`target-file-event`](../../api/Webhooks.v1-fv.html#/schemas/target-file-event) | Delete project and its tasks | Delete project and its tasks |
+| `PROJECT.GROUP.PROJECT.MEMBERSHIP.CHANGE` | [`project-group-event`](../../api/Webhooks.v1-fv.html#/schemas/project-group-event) | Add project to project group Remove project from project group | Add project to project group Remove project from project group |
+| `PROJECT.ERROR.TASK.CREATED` | [`error-task-event`](../../api/Webhooks.v1-fv.html#/schemas/error-task-event) | Generate error task | Generate error task |
+| `PROJECT.ERROR.TASK.COMPLETED` | [`error-task-event`](../../api/Webhooks.v1-fv.html#/schemas/error-task-event) | Complete error task | Complete error task |
+| `PROJECT.ERROR.TASK.ACCEPTED` | [`error-task-event`](../../api/Webhooks.v1-fv.html#/schemas/error-task-event) | Accept error task | Accept error task |
+
+
diff --git a/articles/LCPublicAPI/docs/webhooks/Webhooks-setup.md b/articles/LCPublicAPI/docs/webhooks/Webhooks-setup.md
new file mode 100644
index 0000000..e38f01e
--- /dev/null
+++ b/articles/LCPublicAPI/docs/webhooks/Webhooks-setup.md
@@ -0,0 +1,200 @@
+---
+stoplight-id: eg4ja9nrs9wtk
+---
+
+# Webhooks Setup
+
+A webhook is a web callback by which Trados Cloud Platform notifies an external application when a specific event occurs in a specific account in Trados Cloud Platform. You can subscribe to events by registering webhooks from within the Trados UI.
+
+> When integrating with our webhook service, please be aware that we cannot guarantee the order of webhook event deliveries. This means that notifications may arrive out of sequence, and consumers should not rely on receiving messages in a specific order. Instead, make use of the `timestamp` field to determine the event generation time.
+
+## Subscribe to Webhook events
+
+You subscribe to Webhook events from the Trados UI by creating a Trados Cloud Platform custom application.
+
+Several prerequisites must be met so that you can configure the right webhooks for the right customer, namely:
+
+1. Create a Service User in the correct customer folder.
+2. Create an application based on the Service User created above. This means that the application is saved in the same customer folder as the Service User.
+3. Use the application to configure the webhooks for your customer.
+
+Here are the detailed steps:
+
+1. Log in to the Trados UI as a human Administrator user.
+2. Expand the account menu on the top right-hand corner and select **Integrations**.
+3. Select the **Applications** sub-tab.
+4. Select **New Application** and enter the following information:
+ - **Name** – Enter a unique name for your custom application.
+ - (Optional) **URL** – Enter your custom application URL.
+ - **Service User** – Select a service user from the dropdown list. To understand how service users are added in Trados Cloud Platform, check step 1 in the [Authenticate](../../docs/Service-credentials.md) topic.
+5. Select **Add**.
+6. Back in the **Applications** sub-tab, select the check box corresponding to your application.
+7. Select **Edit**.
+8. On the **Overall Information** page change any of the following, if necessary: name, URL, description.
+9. On the **API Access** page you can find your **Client ID** and **Client Secret**.
+10. On the **Webhooks** page:
+ - Enter a default callback URL for your application Webhooks (all Webhooks defined in Trados Cloud Platform).
+ - Enter a value for **Webhook URL** (this is your Webhook endpoint URL which you expose and which Trados Cloud Platform calls), select one or more event types, and hit Enter. You can create a separate webhook for every event you are interested in or combine notifications for multiple event types to one webhook. If you delete your application, all its associated webhooks are also deleted.
+11. Select **Save**.
+
+A webhook is triggered for all the projects located in the same folder as the selected service user.
+
+> Similar to other resource types, webhooks are governed by inheritance, the propagation rule giving users visibility and work access with resources in the [account hierarchy](https://docs.rws.com/791595/797020/trados-enterprise---accelerate/inheritance-within-the-account).
+> Please be aware that the webhooks will be delivered only for the users having the READ permission on the resource triggering the webhook.
+
+For example, given there is a folder structure:
+
+- Root
+ - Customer1
+ - Customer2
+ - Customer3
+
+Let's say that:
+- the `Group1` has the location `Customer1`
+- the `Group2` has the location `Customer2`
+- the `Group3` has the location `Customer3`
+
+Let's presume that:
+- the service user `S1`, with the webhook `WB1`, is in the group `Group1`
+- the service user `S2`, with the webhook `WB2`, is in the group `Group2`
+- the service user `S3`, with the webhook `WB3`, is in the group `Group3`
+
+The followings are true:
+1. if you create a project in `Customer1`:
+ - the webhook event is sent to `WB1`;
+
+2. if you create a project in `Customer2`:
+ - the webhook event is sent to `WB1` url and `WB2` url;
+
+3. if you create a project in `Customer3`:
+ - the webhook event is sent to `WB1` url and `WB3` url.
+
+
+
+Remember that each time events occur, Trados Cloud Platform will call your server on a `POST` request, on the URL you configured in the Trados Cloud Platform application, and the request body will emulate the [Webhook](../../api/Webhooks.v1-fv.html#/schemas/webhook) object format.
+
+## Validate the Webhook notifications
+
+In terms of security, you must ensure that Trados Cloud Platform is the system which sent the event. For this, webhook requests must be verified in terms of authenticity, integrity, and confidentiality.
+
+### Webhook authenticity
+
+The webhook `POST` request sent by Trados Cloud Platform will include a digital signature which concatenates the following information: `transmissionTime|applicationId|webhookId|crc32 `. For more information on request headers, check the *Reference* section at the end. The [crc32](https://en.wikipedia.org/wiki/Cyclic_redundancy_check) component is a checksum for the HTTP request body.
+
+The signature is decrypted using your Public Key. You can get the Public Key as follows:
+
+1. Log in to the Trados UI as a human Administrator user.
+2. Expand the account menu on the top right-hand corner and select **Integrations**.
+3. Select the **Applications** sub-tab.
+4. Open your application and go to the **Webhooks** tab. Copy the value from the **Secret Key** field. This is the Public Key which validates and decrypts the signature sent by the header.
+
+The validation process mimics the generation sequence, where the recipient system use its Public Key to verify the received signature using the same concatenation: `transmissionTime|applicationId|webhookId|crc32 `.
+
+**Here is a Java sample:**
+
+```
+//retrieve transmissionTime, applicationId, webhookId, signatureAlg & signature from request headers*
+
+// event = request message body
+//generate crc32 from the request body
+
+CRC32 checkSum = new CRC32();
+checksum.update(event.getBytes(UTF_8));
+long crc32Val = checksum.getValue();
+
+//build the message
+String message = transmissionTime + “|” + applicationId + “|” + webhookId + “|” + crc32Val;
+
+//build PublicKey
+byte[] bytes = org.springframework.security.crypto.codec.Base64.decode(publicKeyAsString.getBytes());
+X509EncodeKeySpec ks = new X509EncodeKeySpec(bytes);
+KeyFactory kf = KeyFactory.getInstance(“RSA”);
+PublicKey publicKey = kf.generatePublic(ks);
+
+//verify signature
+
+Signature publicSignature = Signature.getInstance(signatureAlg);
+publicSignature.initVerify(publicKey);
+publicSignature.update(message.getBytes(UTF_8));
+byte[] signatureBytes = Base64.getDecoder().decode(signature);
+
+publicSignature.verify(signatureBytes);
+```
+
+A valid message implies that the message was sent by Trados Cloud Platform.
+
+### Webhook integrity
+
+The fact that the signature is created based on payload content ensures that the message is not altered ([CRC32](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)).
+
+### Webhook confidentiality
+
+To ensure that the message cannot be read by 3rd-parties, Trados Cloud Platform Webhooks only accept the HTTPS communication protocol specified in the webhook URLs you provide.
+
+## Return notification responses
+
+### Success notifications
+
+A notification delivery is considered successful when applications respond with a 2xx status code within 3 seconds.
+
+> It is recommended that applications perform little processing when receiving events and, for instance, that they make use of a queuing mechanism to perform further processing asynchronously after having acknowledged the event notification request.
+
+Trados Cloud Platform does not inspect the HTTP response body.
+
+### Failure notifications
+
+Notifications will fail in the following scenarios:
+- Response time: the response status code is `2xx`, but the response is received after 3 seconds
+- Response status code:
+ - `3xx`: Trados Cloud Platform does not follow redirects
+ - `4xx`
+ - `5xx`
+
+### Retry policies
+
+Trados Cloud Platform will try its best to redeliver the notification. Retries will include specific headers with information about the retry:
+- `X-LC-Retry-Num`: header indicating the retry number (1, 2 or 3)
+- `X-LC-Retry-Reason`: header indicating why the retry is sent
+
+Trados Cloud Platform will try to delivery the notification up to 8 times using an exponential back-off strategy (namely, it will delay the next delivery attempt exponentially with the number of retries already made).
+
+Retry No.| Interval (relative to last retry)/ Minutes| Interval (relative to original attempt)/ Minutes|
+---- |---- |---- |
+1 |5 |5 |
+2 |10 |15 |
+3 |30 |45 |
+4 |120 (2h) |165 |
+5 |360 (6h) |525 |
+6 |600 (10h) |1125 |
+7 |960 (16h) |2085 |
+8 |1440 (24h) |3525 |
+
+### Circuit Breaker
+
+To protect the platform and ensure problems from one tenant do not affect other tenants, we have a circuit breaker that will stop sending webhook on URLs that do not respond within the allowed time (mentioned in **Failure** notifications section). The actual HTTP response code is not relevant since the connection is closed before the response is received.
+
+The circuit breaker is triggered when 3 calls to a URL fail within a short time window. The circuit breaker is opened for an hour only for that URL, not for the tenant. During that hour, any webhooks sent to that URL are scheduled for the next retry.
+
+> Frequent timeouts may compromise the performance of our delivery system.
+> We may need to remove your webhook from our database without advance notice if it is negatively impacting the platform.
+> This action is reserved for cases of major incidents and is necessary to prevent potential issues that can arise from repeated delivery attempts.
+## Reference
+
+**The request headers** are:
+
+* `X-LC-Signature`: Contains the message digital signature (see section on *Webhook authenticity* above).
+
+* `X-LC-Signature-Algo`: Contains the algorithm used for signing the message. Possible values: "*SHA256withRSA*".
+
+* `X-LC-Retry-Num`: Contains the retry attempt counter. Initial value is 0, which will be increased with each attempt at redelivering the webhook message.
+
+* `X-LC-Retry-Reason`: Contains a textual description of the previous error, which resulted in the current attempt to redeliver the webhook message.
+
+* `X-LC-Transmission-Time`: Contains the date/time when the webhook message was delivered, in ISO 8601 date time format.
+
+* `X-LC-Application`: Unique identifier of the Trados Cloud Platform application, which is the recipient of the webhook message. Every webhook has an application associated in Trados Cloud Platform, which can be found in the Trados UI, in the account dropdown menu from the top right corner, under the **Applications** tab, in **Integrations**. The configured webhooks for an application are listed on the **Webhooks** tab of the respective application.
+
+* `X-LC-Webhook`: Unique identifier of the webhook defined for the LC application which is the recipient of the webhook message. It can be ignored because it is not exposed in the Trados UI.
+
+* `X-LC-Region`: Region of the account of the user, which is the recipient of the webhook message.
+
diff --git a/articles/LCPublicAPI/toc.yml b/articles/LCPublicAPI/toc.yml
new file mode 100644
index 0000000..606b1f4
--- /dev/null
+++ b/articles/LCPublicAPI/toc.yml
@@ -0,0 +1,119 @@
+- name: Introduction
+ href: docs/Introduction.md
+
+- name: Public API Management Process
+ href: docs/Public-API-Management-Process.md
+
+- name: What's new
+ href: docs/Whats-New.md
+
+- name: What's deprecated
+ href: docs/Whats-deprecated.md
+
+- name: How to report an issue
+ href: docs/How-to-report-an-issue.md
+
+- name: Known issues
+ href: docs/Known-Issues.md
+
+- name: Getting started
+ items:
+ - name: Multi-region
+ href: docs/Multi-region.md
+ - name: API rate limits
+ href: docs/API-rate-limits.md
+ - name: Use fields in your requests
+ href: docs/Use-fields-in-your-requests.md
+ - name: Use paging and sorting for lists
+ href: docs/Use-paging-and-sorting-for-lists.md
+ - name: Updating data with PUT
+ href: docs/Updating-data-with-PUT.md
+ - name: Language codes
+ href: docs/Language-codes.md
+ - name: How to use location and folders
+ href: docs/How-to-use-location-and-folders.md
+ - name: File formats
+ href: docs/File-formats.md
+ - name: Headers considerations
+ href: docs/Headers-considerations.md
+ - name: Multipart considerations
+ href: docs/How-to-multipart.md
+
+- name: Authentication
+ items:
+ - name: Service users and custom applications
+ href: docs/Service-users-and-custom-applications.md
+ - name: Service credentials
+ href: docs/Service-credentials.md
+ - name: Authentication
+ href: docs/Authentication.md
+
+- name: Projects
+ items:
+ - name: Basic project creation flow
+ href: docs/Basic-project-creation-flow.md
+ - name: Create projects
+ href: docs/Create-projects.md
+ - name: Track projects
+ href: docs/Track-projects.md
+ - name: Interact with tasks
+ href: docs/Interact-with-tasks.md
+
+- name: Termbases
+ items:
+ - name: Termbases
+ href: docs/termbase/Termbase.md
+ - name: Termbase templates
+ href: docs/termbase/Termbase-templates.md
+ - name: Termbase entries
+ href: docs/termbase/Termbase-entries.md
+ - name: Termbase import and export
+ href: docs/termbase/Termbase-import-export.md
+
+- name: Translation Memories
+ items:
+ - name: Translation Memory import and export
+ href: docs/translation-memory/Translation-memory-import-export.md
+
+- name: Translations
+ items:
+ - name: Translation Memory import and export
+ href: docs/translations/Translations.md
+
+- name: Custom fields
+ href: docs/Custom-Fields.md
+
+- name: Export quote report
+ href: docs/Export-quote-report.md
+
+- name: Webhooks
+ items:
+ - name: Webhooks Setup
+ href: docs/webhooks/Webhooks-setup.md
+ - name: Webhooks Payload
+ href: docs/webhooks/Webhooks-payload.md
+ - name: Batched Webhooks
+ href: docs/webhooks/Batched-webhooks.md
+
+- name: Trados Cloud Platform APIs for Postman
+ href: docs/Language-Cloud-APIs-for-Postman.md
+
+- name: API Clients
+ items:
+ - name: .NET Client
+ href: docs/api-clients/net/NET-Client.md
+ - name: .NET Samples
+ href: docs/api-clients/net/Net-Samples.md
+ - name: Java Client
+ href: docs/api-clients/java/Java-Client.md
+ - name: Java Samples
+ href: docs/api-clients/java/Java-Samples.md
+
+- name: APIs
+ items:
+ - name: Public API
+ href: api/Public-API.v1.md
+ - name: Global Public API
+ href: api/Global-Public-API.v1.md
+ - name: Webhooks
+ href: api/Webhooks.v1.md
\ No newline at end of file
diff --git a/index.md b/index.md
index f976e32..60d6816 100644
--- a/index.md
+++ b/index.md
@@ -7,17 +7,19 @@ Var:ProductName is the platform on which RWS host a number of products. You're i
- Trados Studio (cloud capabilities)
- Trados Go
-## Integrating with Var:ProductName products
-To create an integration with any of the products listed above, you'll need to use the Public API. You can find the documentation for the API [here](https://languagecloud.sdl.com/lc/api-docs). Note that the API is updated regularly so make sure that you check out the [What's new](https://languagecloud.sdl.com/lc/api-docs/whats-new) section to find out information on recently added features. To enable RWS to extend and improve the API, and to support the latest features in the products, sometimes it's necessary to remove or change functionality. For that, you'll need to check the [What's deprecated](https://languagecloud.sdl.com/lc/api-docs/whats-deprecated) page where RWS will post advance notice of any API endpoints that will be removed or change in the future. Don't worry though because RWS will try and give six months notice of any breaking changes.
+## Integrating with products
+To create an integration with any of the products listed above, you'll need to use the Public API. You can find the documentation for the API [here](articles/LCPublicAPI/docs/Introduction.md). Note that the API is updated regularly so make sure that you check out the [What's new](articles/LCPublicAPI/docs/Whats-New.md) section to find out information on recently added features. To enable RWS to extend and improve the API, and to support the latest features in the products, sometimes it's necessary to remove or change functionality. For that, you'll need to check the [What's deprecated](articles/LCPublicAPI/docs/Whats-Deprecated.md) page where RWS will post advance notice of any API endpoints that will be removed or change in the future. Don't worry though because RWS will try and give six months notice of any breaking changes.
+Click [here](articles/LCPublicAPI/docs/Introduction.md) to find out more.
-## Extending Var:ProductName products
-Var:ProductName products can be extended in a number of ways. For example, you may want to create an add-on to support a machine translation engine or you may want to create a custom workflow task. RWS provides an extensibility framework for the Var:ProductName suite of products. To get more information on what's required and how you can do this, visit the [Var:ProductName extensibility documentation](https://languagecloud.sdl.com/lc/extensibility-docs) pages.
+## Extending products
+ products can be extended in a number of ways. For example, you may want to create an add-on to support a machine translation engine or you may want to create a custom workflow task. RWS provides an extensibility framework for the suite of products. To get more information on what's required and how you can do this, visit the [ extensibility documentation](articles/Extensibility/) pages.
+Click [here](articles/Extensibility/docs/Whats-New.md) to find out more.
## Interacting with files
-Translatable content in Var:ProductName is held in a format called **Bilingual Content Model**, or **BCM** for short. You can find **BCM** reference documentation and samples on this site. Click [here](articles/bcm/BCM.NET_client_API.md) to find out more.
+Translatable content in is held in a format called **Bilingual Content Model**, or **BCM** for short. You can find **BCM** reference documentation and samples on this site. Click [here](articles/BCM/BCM.NET_client_API.md) to find out more.
## Reporting API issues ##
-If you want to report an issue with the API, you can find information on how to do this here - [How to report an issue](https://languagecloud.sdl.com/lc/api-docs/how-to-report-an-issue)
+If you want to report an issue with the API, you can find information on how to do this here - [How to report an issue](articles/LCPublicAPI/docs/how-to-report-an-issue.md)
## Trados Cloud API and Customer Portal API
-Please be aware that Trados Cloud offers two different APIs. First is the modern Trados Cloud API described on this page. Then there is the second API that is the [Mantra API](https://languagecloud.sdl.com/cp/api). Trados Cloud API is the recommended option for new integrations as it is more modern and much effort is put into its continuous evolution along with Trados Enterprise. Please take care not to confuse the two of them as they are not interchangeable.
+Please be aware that Trados Cloud offers two different APIs. First is the modern Trados Cloud API described on this page. Then there is the second API that is the Mantra API. Trados Cloud API is the recommended option for new integrations as it is more modern and much effort is put into its continuous evolution along with Trados Enterprise. Please take care not to confuse the two of them as they are not interchangeable.
diff --git a/toc.yml b/toc.yml
index a5961ff..91593ef 100644
--- a/toc.yml
+++ b/toc.yml
@@ -1,10 +1,10 @@
- name: Trados Cloud
href: index.md
- name: API
- href: https://languagecloud.sdl.com/lc/api-docs
+ href: articles/LCPublicAPI/
- name: Extensibility
- href: https://languagecloud.sdl.com/lc/extensibility-docs
+ href: articles/Extensibility/
- name: BCM
- href: articles/bcm/BCM.NET_client_API.md
+ href: articles/BCM/BCM.NET_client_API.md
- name: Developer License
href: developer_license.md