A chat integration is a channel in Slack, Mattermost or Microsoft Teams that gets a short message about events in the organisation’s projects. What is sent and how to create the webhook is explained in Slack, Mattermost and Microsoft Teams.
GET /org/chat
POST /org/chat
PATCH /org/chat/{integrationId}
POST /org/chat/{integrationId}/test
DELETE /org/chat/{integrationId}Access: Session token only. API keys get 403 with insufficient_scope.
Role: Organisation owner or admin.
The webhook address is never returned. It is checked with a test message when you send it, stored encrypted, and not shown again by any route or the audit log. Responses only show target: the host and the last four characters.
List the channels #
GET /org/chat answers 200:
{
"providers": ["slack", "mattermost", "teams"],
"events": ["translation.submitted", "translation.approved", "push.completed", "tag.created"],
"max": 20,
"integrations": [
{
"id": "0192f6c0-0000-7000-8000-000000000001",
"provider": "slack",
"name": "#translations",
"target": "hooks.slack.com/…1234",
"events": ["translation.submitted", "push.completed"],
"projectId": null,
"projectName": null,
"lastStatus": "200",
"lastOk": true,
"lastTriggeredAt": "2026-10-23T12:00:00+00:00",
"createdAt": "2026-10-23T11:58:00+00:00"
}
]
}| Field | Type | Description |
|---|---|---|
integrations[].provider | string | slack, mattermost or teams. |
integrations[].name | string | The name given to the channel, up to 80 characters. |
integrations[].target | string | The host of the address and its last four characters. |
integrations[].events | string[] | The events the channel gets. |
integrations[].projectId, projectName | string|null | The only project the channel gets events of. null for every project. |
integrations[].lastStatus | string|null | What the last message was answered with: an HTTP status such as 200, Unreachable or Blocked. null before any message. |
integrations[].lastOk | boolean|null | Whether the last message was delivered (a 2xx answer). |
integrations[].lastTriggeredAt | string|null | When the last message was sent. |
max | integer | The number of channels an organisation can have. |
Events #
| Event | When |
|---|---|
translation.submitted | A translation was submitted for review. |
translation.approved | A translation was approved. |
push.completed | A push added, changed or removed strings. Dry runs and pushes that change nothing do not count. |
tag.created | A tag was created. |
Add a channel #
POST /org/chat takes:
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | yes | slack, mattermost or teams. |
name | string | yes | A name for the channel. |
url | string | yes | The webhook address. It has to be an https address of the tool: hooks.slack.com/services/… for Slack, a logic.azure.com, api.powerplatform.com or webhook.office.com address on port 443 for Teams, and an address ending in /hooks/ and a 26 character ID for Mattermost. |
events | string[] | yes | At least one of the events above. |
projectId | string|null | no | Only send events of this project. Left out or null for all projects. |
A test message is sent to the address first. The answer is 201 with the channel as in the list, or 422 and nothing is stored. Adding a channel records chat.connected in the audit log.
Change a channel #
PATCH /org/chat/{integrationId} takes name, events, projectId and url, all optional; what is left out stays as it was. A new url is checked with a test message again. It answers 200 with the channel and records chat.updated.
Send a test message #
POST /org/chat/{integrationId}/test sends a test message and answers 200 with the channel, with lastStatus and lastOk showing the result. A failed delivery is not an error response.
Remove a channel #
DELETE /org/chat/{integrationId} answers 204. It records chat.removed.
Errors #
| Status | error | When |
|---|---|---|
| 401 | unauthenticated | The token is missing or not valid. |
| 403 | forbidden | You are not an owner or admin. |
| 404 | not_found | The channel does not exist in your organisation, an id is not a UUID, or projectId is not a UUID. |
| 422 | invalid_request | fields.url is chat_invalid (not an address of that tool), chat_rejected (the tool refused the test message), chat_unreachable (it could not be reached or answered with a 5xx) or chat_blocked (a private address); fields.name is required; fields.events is required or invalid; fields.projectId is project_unknown; fields.integrations is chat_too_many. |
| 429 | rate_limited | Too many requests, see Rate limiting. |
See Errors for the error format.