Skip to content

Commit 4f20f33

Browse files
authored
Merge pull request #58 from RWS/2026.06.R01.Extensibility.docs
2026.06.r01.extensibility.docs
2 parents 38cddde + 078c576 commit 4f20f33

4 files changed

Lines changed: 110 additions & 20 deletions

File tree

articles/Extensibility/api/Extensibility-API.v1.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,7 +1291,8 @@
12911291
"description",
12921292
"version",
12931293
"releaseNotes",
1294-
"descriptorVersion"
1294+
"descriptorVersion",
1295+
"vendor"
12951296
],
12961297
"properties": {
12971298
"name": {
@@ -1357,7 +1358,7 @@
13571358
"baseUrl": {
13581359
"type": "string",
13591360
"description": "The prefix for all calls to the app service.",
1360-
"example": "somehostname.net/service/v1"
1361+
"examples": ["https://somehostname.net/service/v1", "https://somehostname.net" ]
13611362
},
13621363
"regionalBaseUrls": {
13631364
"$ref": "#/components/schemas/RegionalBaseUrls"
@@ -1421,7 +1422,7 @@
14211422
},
14221423
"minimumVersion": {
14231424
"type": "string",
1424-
"description": "Minimum version of the app that is supported. Older versions might be forcebly disabled if not upgraded."
1425+
"description": "Minimum version of the app that is supported. Older versions might be forcibly disabled if not upgraded."
14251426
},
14261427
"vendor": {
14271428
"type": "object",
@@ -2913,7 +2914,8 @@
29132914
],
29142915
"properties": {
29152916
"url": {
2916-
"type": "string"
2917+
"type": "string",
2918+
"examples": [ "/webhook-receiving-endpoint" ]
29172919
},
29182920
"eventTypes": {
29192921
"type": "array",

articles/Extensibility/docs/Whats-New.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# What's New
22

3+
## June 2026
4+
5+
- We extended the information available under [App Descriptor](./development/App-Descriptor.md) and [Webhooks](./development/Webhooks.md).
6+
- We fixed various bugs.
7+
38
## January 2026
49

510
- We've documented automatic tasks expiration time. See [Submit](../api/Extensibility-API.v1-fv.html#/operations/automatictasktypeexecutetask) and [Callback](../api/Extensibility-API.v1-fv.html#/operations/automatiktasktypecallback) endpoints.

articles/Extensibility/docs/development/App-Descriptor.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ The descriptor model defines attributes that provide basic information like `nam
1010

1111
## Version
1212

13-
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.
13+
The `version` field is used by Trados to detect newer versions of the app's descriptor.
1414

15-
The version is periodically checked by Trados by performing GET descriptor requests.
15+
> [!WARNING]
16+
> **You must increment the version every time you make changes to the descriptor.** If the version is not updated, Trados will not detect your changes—they will be silently ignored until the version number changes. This is a common gotcha that can cause confusion when changes don't take effect.
17+
18+
Trados periodically checks the descriptor by performing GET descriptor requests. When it detects a new version number, it will fetch the updated descriptor. If the version hasn't changed, Trados will assume the descriptor is unchanged and will not pick up any modifications you've made.
1619

1720
## Base URL
1821

@@ -32,26 +35,30 @@ For example, if we have in the descriptor:
3235
Trados will make scheduled GET requests to `https://foo.com/health` to check the health.
3336

3437
### Changing Base URL
35-
For various reasons you might want to change the host of your App and that can be done from Trados management UI.
38+
39+
For various reasons you might want to change the host of your App and that can be done from Trados management UI.
3640

3741
When updating the host, you also have to update `baseUrl` to match the new host.
3842

39-
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.
43+
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 decommission the old host, you must make sure all consumers updated their installs to latest version.
4044

4145
> [!WARNING]
42-
> 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).
46+
> 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).
4347
4448
## Standard Endpoints
4549

46-
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.
50+
The `standardEndpoints` section is optional in the descriptor contract. However, it becomes required when the app defines `extensions`, since Trados needs to know how to interact with the app through those endpoints. If your app only registers `webhooks` and does not provide any extensions, you may omit this section entirely.
51+
52+
When present, not all endpoints within `standardEndpoints` are required — refer to the descriptor schema for which ones are mandatory.
4753

48-
All endpoint paths need to start with the leading character `/` and are relative to `baseUrl`.
54+
All endpoint paths need to start with the leading character `/` and are relative to `baseUrl`.
4955

50-
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.
56+
In the contract, 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.
5157

5258
### Lifecycle Endpoint
5359

5460
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.
61+
5562
- `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).
5663

5764
> [!NOTE]
@@ -62,11 +69,13 @@ Additionally, in the `standardEnpoints` section we can find the lifecycle endpoi
6269
The list of provided extensions is described under `extensions`. An app can provide none, one, or more extensions.
6370

6471
Any extension will have the generic set of properties:
72+
6573
- `extensionPointId` that specifies what extension point it extends. Can be only a value specified in the descriptor contract (ex: `lc.mtprovider`).
6674
- `extensionPointVersion` defines the version of the extension point it extends. The allowed value is defined in the descriptor contract (ex: `1.0`).
6775
- `name` is defined by the developer, to provide a friendly name for the extension. This is useful when the app provides multiple extensions.
6876
- `description` will have a summary describing the extension.
6977
- `configuration` defines the extension and the structure depends on the type of the extension that is implemented.
78+
7079
```json
7180
{
7281
...

articles/Extensibility/docs/development/Webhooks.md

Lines changed: 82 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Webhooks
22

3-
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.
3+
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.
44

55
## Constraints
66

@@ -11,13 +11,14 @@ Not all accounts have webhooks enabled. Installing of the app requiring webhooks
1111
1212
## Setup
1313

14-
The required list of webhooks must be specified in the descriptor in the `webhooks` property.
14+
The required list of webhooks must be specified in the descriptor in the `webhooks` property.
1515

1616
`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.
1717

18-
`url` can be an absolute URL or a path relative to `basePath`.
18+
`url` can be an absolute URL or a path relative to `basePath`.
1919

2020
Example of a `webhooks` property in the app descriptor:
21+
2122
```json
2223
{
2324
...
@@ -37,20 +38,93 @@ Example of a `webhooks` property in the app descriptor:
3738
...
3839
}
3940
```
40-
That example will subscribe to `PROJECT.TASK.ACCEPTED` and `PROJECT.TASK.CREATED` events and will receive these events on the `<basePath>/webhooks-endpoint` URL.
41+
42+
This example will subscribe to `PROJECT.TASK.ACCEPTED` and `PROJECT.TASK.CREATED` events and will receive these events on the `<basePath>/webhooks-endpoint` URL.
43+
44+
Alternatively, you can split the events across multiple endpoints:
45+
46+
```json
47+
{
48+
...
49+
"webhooks": [
50+
{
51+
"url": "/project-webhooks-endpoint",
52+
"eventTypes": [
53+
{
54+
"eventType": "PROJECT.CREATED"
55+
},
56+
{
57+
"eventType": "PROJECT.STARTED"
58+
}
59+
]
60+
},
61+
{
62+
"url": "/task-webhooks-endpoint",
63+
"eventTypes": [
64+
{
65+
"eventType": "PROJECT.TASK.CREATED"
66+
}
67+
]
68+
}
69+
]
70+
...
71+
}
72+
```
73+
74+
In this example, `PROJECT.CREATED` and `PROJECT.STARTED` events are routed to `/project-webhooks-endpoint`, while `PROJECT.TASK.CREATED` events are sent to a separate `/task-webhooks-endpoint`.
75+
76+
## Webhook-only app
77+
78+
If you only need to subscribe to webhooks and do not require other extensibility features, you can register a webhook-only app. This creates a minimal app that does not require any additional endpoints.
79+
80+
The following example shows a minimal descriptor that only requires a descriptor endpoint and a webhook receiver endpoint:
81+
82+
```json
83+
{
84+
"name": "my-extension",
85+
"version": "1.0.0",
86+
"description": "A sample extension",
87+
"releaseNotes": "Initial release",
88+
"descriptorVersion": "1.4",
89+
"scopes": [ "TENANT_READ"],
90+
"webhooks": [
91+
{
92+
"url": "/webhook-endpoint",
93+
"eventTypes": [
94+
{
95+
"eventType": "PROJECT.CREATED"
96+
},
97+
{
98+
"eventType": "PROJECT.STARTED"
99+
},
100+
{
101+
"eventType": "PROJECT.TASK.CREATED"
102+
}
103+
]
104+
}
105+
],
106+
"baseUrl": "https://your.site",
107+
"vendor": {
108+
"name": "Your Company",
109+
"url": "https://your.site",
110+
"email": "support@your.site"
111+
}
112+
}
113+
```
114+
115+
When installed, this app will register the `/webhook-endpoint` URL to receive `PROJECT.CREATED`, `PROJECT.STARTED`, and `PROJECT.TASK.CREATED` events. No other endpoints are required.
41116

42117
## Webhook events and payloads
43118

44-
Webhooks for apps are sent in a batched format.
119+
Webhooks for apps are sent in a batched format.
45120

46-
The webhook payload description can be found in our [Trados Cloud Platform API documentation](https://eu.cloud.trados.com/lc/api-docs/batched-webhooks).
121+
The webhook payload description can be found in our [Trados Cloud Platform API documentation](https://eu.cloud.trados.com/lc/api-docs/batched-webhooks).
47122

48-
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.
123+
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 responsibility of the app developer to handle the events from the batch accordingly to their `accountId` from the event body.
49124

50125
> [!NOTE]
51126
> **Note:** For *Webhook Authenticity*, ignore the described behavior in the above link and only consider the following chapter about *Signature Validation*.
52127
53-
54128
## Signature Validation
55129

56130
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.

0 commit comments

Comments
 (0)