Manual
CLI
API
Log in Get started free

Chat integrations

Connects Slack, Mattermost and Microsoft Teams channels that get a message when something happens in a project.

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.

HTTP
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:

JSON
{
  "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"
    }
  ]
}
FieldTypeDescription
integrations[].providerstringslack, mattermost or teams.
integrations[].namestringThe name given to the channel, up to 80 characters.
integrations[].targetstringThe host of the address and its last four characters.
integrations[].eventsstring[]The events the channel gets.
integrations[].projectId, projectNamestring|nullThe only project the channel gets events of. null for every project.
integrations[].lastStatusstring|nullWhat the last message was answered with: an HTTP status such as 200, Unreachable or Blocked. null before any message.
integrations[].lastOkboolean|nullWhether the last message was delivered (a 2xx answer).
integrations[].lastTriggeredAtstring|nullWhen the last message was sent.
maxintegerThe number of channels an organisation can have.

Events #

EventWhen
translation.submittedA translation was submitted for review.
translation.approvedA translation was approved.
push.completedA push added, changed or removed strings. Dry runs and pushes that change nothing do not count.
tag.createdA tag was created.

Add a channel #

POST /org/chat takes:

FieldTypeRequiredDescription
providerstringyesslack, mattermost or teams.
namestringyesA name for the channel.
urlstringyesThe 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.
eventsstring[]yesAt least one of the events above.
projectIdstring|nullnoOnly 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 #

StatuserrorWhen
401unauthenticatedThe token is missing or not valid.
403forbiddenYou are not an owner or admin.
404not_foundThe channel does not exist in your organisation, an id is not a UUID, or projectId is not a UUID.
422invalid_requestfields.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.
429rate_limitedToo many requests, see Rate limiting.

See Errors for the error format.