mirror of
https://github.com/mattermost/mattermost.git
synced 2026-02-03 20:40:00 -05:00
* initial commit for POC of Plugin Bridge * Updates * POC for plugin bridge * Updates from collaboration * Fixes * Refactor Plugin Bridge to use HTTP/REST instead of RPC - Remove ExecuteBridgeCall hook and Context.SourcePluginId - Implement HTTP-based bridge using existing PluginHTTP infrastructure - Add CallPlugin API method with endpoint parameter instead of method name - Update CallPluginBridge to construct HTTP POST requests - Add proper headers: Mattermost-User-Id, Mattermost-Plugin-ID - Use 'com.mattermost.server' as plugin ID for core server calls - Update ai.go to use REST endpoint /inter-plugin/v1/completion - Add comprehensive spec documentation in server/spec.md - Add MIGRATION_GUIDE.md for plugin developers - Fix 401/404 issues by setting correct headers and URL paths * Improve Plugin Bridge security and architecture - Create ServeInternalPluginRequest for internal plugin calls (core + plugin-to-plugin) - Move header-setting logic from CallPluginBridge to ServeInternalPluginRequest - Improve separation of concerns: business logic vs HTTP transport - Add security documentation explaining header protection Security Improvements: - ServeInternalPluginRequest is NOT exposed as HTTP route (internal only) - Headers (Mattermost-User-Id, Mattermost-Plugin-ID) are set by trusted server code - External requests cannot spoof these headers (stripped by servePluginRequest) - Core calls use 'com.mattermost.server' as plugin ID for authorization - Plugin-to-plugin calls use real plugin ID (enforced by server) Backward Compatibility: - Keep ServeInterPluginRequest for existing API.PluginHTTP callers (deprecated) - All tests pass Docs: - Update spec.md with security model explanation - Update MIGRATION_GUIDE.md with correct header usage examples * Space * cursor please stop creating markdown files * Fix style * Fix i18n, linter * REMOVE MARKDOWN * Remove CallPlugin method from plugin API interface Per review feedback, this method is no longer needed. Co-authored-by: Nick Misasi <nickmisasi@users.noreply.github.com> * Remove CallPlugin method implementation from PluginAPI Co-authored-by: Nick Misasi <nickmisasi@users.noreply.github.com> * fixes * Add AI OpenAPI spec * fix openapi spec * Use agents client (#34225) * Use agents client * Remove default agent * Fixes * fix: modify system prompts to ensure JSON is being returned * Base implementation for recaps working * small fixes * Adjustments * remove webapp changes * Add feature flags for rewrites and ai bridge, clean up * Remove comments that aren't helpful * Fix i18n * Remove rewrites * Fix tests * Fix i18n * adjust i18n again * Add back translations * Remove leftover mock code * remove model file * Changes from PR review * Make the real substitutions * Include a basic invokation of the client with noop to ensure build works * more fix * Remove unneeded change * Updates from review * Fixes * Remove some logic from rewrites to clean up branch * Use v1.5.0 of agents plugin * A bunch more additions for general UX flow * Add missing files * Add mocks * Fixes for vet-api, i18n, build, types, etc * One more linter fix * Fix i18n and some tests * Refactors and cleanup in backend code * remove rogue markdown file * fixes after refactors from backend * Add back renamed files, and add tests * More self code review * More fixes * More refactors * Fix call stack exceeded bug * Include read messages if there are no unreads * Fix test failure: use correct error message key for recap permission denied The getRecapAndCheckOwnership function was using strings.ToLower(callerName) to generate error keys, which caused 'GetRecap' to become 'getrecap' instead of the expected 'get'. Changed to use the correct static key that matches the en.json localization file. Fixes TestGetRecap/get_recap_by_non-owner test failure. Co-authored-by: Nick Misasi <nickmisasi@users.noreply.github.com> * Consolidate permission errors down to a single string * Fixes for i18n, worktrees making this difficult * Fix i18n * Fix i18n once and for all (for real) (final) * Fix duplicate getAgents method in client4.ts * Remove duplicate ai state from initial_state.ts * Fix types * Fix tests * Fix return type of GetAgents and GetServices * Add tests for recaps components * Fix types * Update i18n * Fixes * Fixes * More cleanup * Revert random file * Use undefined * fix linter * Address feedback * Missed a git add * Fixes * Fix i18n * Remove fallback * Fixes for PR --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: Nick Misasi <nickmisasi@users.noreply.github.com> Co-authored-by: Christopher Speller <crspeller@gmail.com> Co-authored-by: Felipe Martin <me@fmartingr.com> Co-authored-by: Mattermost Build <build@mattermost.com>
474 lines
17 KiB
YAML
474 lines
17 KiB
YAML
openapi: 3.0.0
|
|
info:
|
|
description: >
|
|
The Mattermost Web Services API enables Mattermost clients and third-party applications
|
|
to interact with Mattermost servers.
|
|
|
|
|
|
[Official JavaScript and Golang drivers](#/#official-drivers)
|
|
are available to simplify API integration.
|
|
|
|
|
|
By using this API, you agree to our [terms of service](https://about.mattermost.com/default-terms/).
|
|
|
|
|
|
[Find out more about Mattermost](https://about.mattermost.com/)
|
|
|
|
## Contents
|
|
|
|
### Core Concepts
|
|
|
|
* [Schema & Conventions](#/#schema--conventions)
|
|
|
|
* [Authentication](#/#authentication)
|
|
|
|
* [Rate Limiting](#/#rate-limiting)
|
|
|
|
* [Error Handling](#/#error-handling)
|
|
|
|
* [WebSocket](#/#websocket)
|
|
|
|
* [Authentication](#/#authentication-1)
|
|
|
|
* [Websocket Events](#/#websocket-events)
|
|
|
|
* [Websocket API](#/#websocket-api)
|
|
|
|
### Drivers
|
|
|
|
* [Official Drivers](#/#official-drivers)
|
|
|
|
* [Community-built Drivers](#/#community-built-drivers)
|
|
|
|
### Community
|
|
|
|
* [Support](#/#support)
|
|
|
|
* [Contributing](#/#contributing)
|
|
|
|
|
|
## Schema & Conventions
|
|
|
|
- All API access is through HTTP(S) requests at `your-mattermost-url/api/v4`.
|
|
|
|
- All request and response bodies are `application/json`.
|
|
|
|
- When using endpoints that require a user id, the string `me` can be used in place
|
|
of the user id to indicate the action is to be taken for the logged in user.
|
|
|
|
- For all endpoints that implement pagination via the `per_page` parameter:
|
|
|
|
- Maximum items per page: 200 (requests exceeding this will be silently truncated)
|
|
|
|
- Default value if a paged API requires a `per_page` parameter and it is not provided: 60
|
|
|
|
## Authentication
|
|
|
|
There are multiple ways to authenticate against the Mattermost API.
|
|
|
|
All examples assume there is a Mattermost instance running at http://localhost:8065.
|
|
|
|
### Session Token
|
|
|
|
Make an HTTP POST to `your-mattermost-url/api/v4/users/login` with a JSON
|
|
body indicating the user's `login_id`, `password` and optionally the MFA
|
|
`token`. The `login_id` can be an email, username or an AD/LDAP ID
|
|
depending on the system's configuration.
|
|
|
|
```bash
|
|
curl -i -d '{"login_id":"someone@nowhere.com","password":"thisisabadpassword"}' http://localhost:8065/api/v4/users/login
|
|
```
|
|
|
|
NOTE: If you're running cURL on windows, you will have to change the single quotes to double quotes, and escape the inner double quotes with backslash, like below:
|
|
|
|
|
|
```bash
|
|
curl -i -d "{\"login_id\":\"someone@nowhere.com\",\"password\":\"thisisabadpassword\"}" http://localhost:8065/api/v4/users/login
|
|
```
|
|
|
|
If successful, the response will contain a `Token` header and a user object in the body.
|
|
|
|
```http
|
|
HTTP/1.1 200 OK
|
|
Content-Type: application/json
|
|
Permissions-Policy:
|
|
Referrer-Policy: no-referrer
|
|
Token: ckh3t4knu3fzujt76o57f5jo4w
|
|
Vary: Origin
|
|
Vary: Accept-Encoding
|
|
X-Content-Type-Options: nosniff
|
|
X-Request-Id: bk3uzm335jr9tnoh4mcsybmmjr
|
|
X-Version-Id: 10.6.0.13685270376.215f100adf6ccda09afcaaa84ac4bfbd.true
|
|
Date: Fri, 28 Mar 2025 09:33:22 GMT
|
|
Content-Length: 796
|
|
|
|
{{user object as json}}
|
|
```
|
|
|
|
Include the `Token` as part of the `Authorization` header on your future API requests with the `Bearer` method.
|
|
|
|
```bash
|
|
curl -i -H 'Authorization: Bearer ckh3t4knu3fzujt76o57f5jo4w' http://localhost:8065/api/v4/users/me
|
|
```
|
|
Alternatively, include the `Token` as your `MMAUTHTOKEN` cookie value on you future API requests:
|
|
|
|
```bash
|
|
curl -i -H 'Cookie: MMAUTHTOKEN=ckh3t4knu3fzujt76o57f5jo4w' http://localhost:8065/api/v4/users/me
|
|
```
|
|
|
|
|
|
You should now be able to access the API as the user you logged in as.
|
|
|
|
|
|
### Personal Access Tokens
|
|
|
|
Using [personal access tokens](https://developers.mattermost.com/integrate/reference/personal-access-token/) is very similar to using a session token. The only real difference is that session tokens will expire, while personal access tokens will live until they are manually revoked by the user or an admin.
|
|
|
|
Just like session tokens, include the personal access token as part of the `Authorization` header in your requests using the `Bearer` method. Assuming our personal access token is `9xuqwrwgstrb3mzrxb83nb357a`, we could use it as shown below.
|
|
|
|
```bash
|
|
curl -i -H 'Authorization: Bearer 9xuqwrwgstrb3mzrxb83nb357a' http://localhost:8065/api/v4/users/me
|
|
```
|
|
|
|
## Rate Limiting
|
|
Whenever you make an HTTP request to the Mattermost API you might notice
|
|
the following headers included in the response:
|
|
|
|
```http
|
|
X-Ratelimit-Limit: 10
|
|
X-Ratelimit-Remaining: 9
|
|
X-Ratelimit-Reset: 1441983590
|
|
```
|
|
|
|
|
|
These headers are telling you your current rate limit status.
|
|
|
|
|
|
| Header | Description |
|
|
|:-----------------------|:-------------------------------------------------------------------|
|
|
| X-Ratelimit-Limit | The maximum number of requests you can make per second. |
|
|
| X-Ratelimit-Remaining | The number of requests remaining in the current window. |
|
|
| X-Ratelimit-Reset | The remaining UTC epoch seconds before the rate limit resets. |
|
|
|
|
If you exceed your rate limit for a window you will receive the following error in the body of the response:
|
|
|
|
```http
|
|
HTTP/1.1 429 Too Many Requests
|
|
Date: Tue, 10 Sep 2015 11:20:28 GMT
|
|
X-RateLimit-Limit: 10
|
|
X-RateLimit-Remaining: 0
|
|
X-RateLimit-Reset: 1
|
|
|
|
limit exceeded
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
All errors will return an appropriate HTTP response code along with the
|
|
following JSON body:
|
|
|
|
```json
|
|
{
|
|
"id": "the.error.id",
|
|
"message": "Something went wrong", // the reason for the error
|
|
"request_id": "", // the ID of the request
|
|
"status_code": 0, // the HTTP status code
|
|
"is_oauth": false // whether the error is OAuth specific
|
|
}
|
|
|
|
```
|
|
|
|
## WebSocket
|
|
In addition to the HTTP RESTful web service, Mattermost also offers a WebSocket event delivery system and some API functionality.
|
|
|
|
To connect to the WebSocket follow the standard opening handshake as [defined by the RFC specification](https://tools.ietf.org/html/rfc6455#section-1.3) to the `/api/v4/websocket` endpoint of Mattermost.
|
|
|
|
|
|
### Authentication
|
|
|
|
The Mattermost WebSocket can be authenticated using [the standard API authentication methods](/#/#authentication) (by a cookie or with an explicit Authorization header) or through an authentication challenge. If you're authenticating from a browser and have logged in with the Mattermost API, your authentication cookie should already be set. This is how the Mattermost webapp authenticates with the WebSocket.
|
|
|
|
To authenticate with an authentication challenge, first connect the WebSocket and then send the following JSON over the connection:
|
|
|
|
|
|
```json
|
|
{
|
|
"seq": 1,
|
|
"action": "authentication_challenge",
|
|
"data": {
|
|
"token": "mattermosttokengoeshere"
|
|
}
|
|
}
|
|
```
|
|
|
|
If successful, you will receive a standard OK response over the WebSocket connection:
|
|
|
|
|
|
```json
|
|
{
|
|
"status": "OK",
|
|
"seq_reply": 1
|
|
}
|
|
```
|
|
|
|
Once successfully authenticated, the server will pass a `hello` WebSocket event containing server version over the connection.
|
|
|
|
### Websocket Events
|
|
|
|
WebSocket events are primarily used to alert the client to changes in Mattermost, such as delivering new posts or alerting the client that another user is typing in a channel.
|
|
|
|
Events on the WebSocket will have the form:
|
|
|
|
```json
|
|
{
|
|
"event": "hello",
|
|
"data": {
|
|
"server_version": "3.6.0.1451.1c38da627ebb4e3635677db6939e9195"
|
|
},
|
|
"broadcast":{
|
|
"omit_users": null,
|
|
"user_id": "ay5sq51sebfh58ktrce5ijtcwy",
|
|
"channel_id": "",
|
|
"team_id": ""
|
|
},
|
|
"seq": 0
|
|
}
|
|
```
|
|
|
|
The `event` field indicates the event type, `data` contains any data relevant to the event and `broadcast` contains information about who the event was sent to. For example, the above example has `user_id` set to "ay5sq51sebfh58ktrce5ijtcwy" meaning that only the user with that ID received this event broadcast. The `omit_users` field can contain an array of user IDs that were specifically omitted from receiving the event.
|
|
|
|
The list of Mattermost WebSocket events are:
|
|
|
|
- added_to_team
|
|
- authentication_challenge
|
|
- channel_converted
|
|
- channel_created
|
|
- channel_deleted
|
|
- channel_member_updated
|
|
- channel_updated
|
|
- channel_viewed
|
|
- config_changed
|
|
- delete_team
|
|
- direct_added
|
|
- emoji_added
|
|
- ephemeral_message
|
|
- group_added
|
|
- hello
|
|
- leave_team
|
|
- license_changed
|
|
- memberrole_updated
|
|
- new_user
|
|
- plugin_disabled
|
|
- plugin_enabled
|
|
- plugin_statuses_changed
|
|
- post_deleted
|
|
- post_edited
|
|
- post_unread
|
|
- posted
|
|
- preference_changed
|
|
- preferences_changed
|
|
- preferences_deleted
|
|
- reaction_added
|
|
- reaction_removed
|
|
- response
|
|
- role_updated
|
|
- status_change
|
|
- typing
|
|
- update_team
|
|
- user_added
|
|
- user_removed
|
|
- user_role_updated
|
|
- user_updated
|
|
- dialog_opened
|
|
- thread_updated
|
|
- thread_follow_changed
|
|
- thread_read_changed
|
|
|
|
### Websocket API
|
|
|
|
Mattermost has some basic support for WebSocket APIs. A connected WebSocket can make requests by sending the following over the connection:
|
|
|
|
```json
|
|
{
|
|
"action": "user_typing",
|
|
"seq": 2,
|
|
"data": {
|
|
"channel_id": "nhze199c4j87ped4wannrjdt9c",
|
|
"parent_id": ""
|
|
}
|
|
}
|
|
```
|
|
|
|
This is an example of making a `user_typing` request, with the purpose of alerting the server that the connected client has begun typing in a channel or thread. The `action` field indicates what is being requested, and performs a similar duty as the route in a HTTP API. The `data` field is used to add any additional data along with the request. The server supports binary websocket messages as well in case the client has such a requirement.
|
|
|
|
The `seq` or sequence number is set by the client and should be incremented with every use. It is used to distinguish responses to requests that come down the WebSocket. For example, a standard response to the above request would be:
|
|
|
|
|
|
```json
|
|
{
|
|
"status": "OK",
|
|
"seq_reply": 2
|
|
}
|
|
```
|
|
|
|
Notice `seq_reply` is 2, matching the `seq` of the original request. Using this a client can distinguish which request the response is meant for.
|
|
|
|
If there was any information to respond with, it would be encapsulated in a `data` field.
|
|
|
|
In the case of an error, the response would be:
|
|
|
|
|
|
```json
|
|
{
|
|
"status": "FAIL",
|
|
"seq_reply": 2,
|
|
"error": {
|
|
"id": "some.error.id.here",
|
|
"message": "Some error message here"
|
|
}
|
|
}
|
|
```
|
|
|
|
|
|
The list of WebSocket API actions is:
|
|
|
|
- user_typing
|
|
- get_statuses
|
|
- get_statuses_by_ids
|
|
|
|
|
|
To see how these actions work, please refer to either the [Golang WebSocket driver](https://github.com/mattermost/mattermost/blob/master/server/public/model/websocket_client.go) or our [JavaScript WebSocket driver](https://github.com/mattermost/mattermost/blob/master/webapp/platform/client/src/websocket.ts).
|
|
|
|
## Drivers
|
|
The easiest way to interact with the Mattermost Web Service API is through
|
|
a language specific driver.
|
|
|
|
### Official Drivers
|
|
|
|
* Mattermost JavaScript/TypeScript Driver
|
|
* [NPM](https://www.npmjs.com/package/@mattermost/client)
|
|
* [Source](https://github.com/mattermost/mattermost/tree/master/webapp/platform/client)
|
|
|
|
* [Mattermost Golang Driver](https://pkg.go.dev/github.com/mattermost/mattermost/server/public/model#Client4)
|
|
|
|
### Community-built Drivers
|
|
|
|
For community-built drivers and API wrappers, see [our app directory](https://mattermost.com/marketplace-category/mattermost-developers-tools/).
|
|
|
|
## Support
|
|
|
|
Mattermost core committers work with the community to keep the API documentation up-to-date.
|
|
|
|
If you have questions on API routes not listed in this reference, you can:
|
|
|
|
- [Join the Mattermost community server](https://community.mattermost.com) to ask questions in the Developers channel
|
|
|
|
- Contact us at feedback@mattermost.com
|
|
|
|
|
|
[Bug reports](https://github.com/mattermost/mattermost/issues) in the documentation or the API are also welcome, as are pull requests to fix the issues.
|
|
|
|
|
|
## Contributing
|
|
|
|
When you have answers to API questions not addressed in our documentation we ask you to consider making a pull request to improve our reference. Small and large changes are all welcome.
|
|
|
|
|
|
We also have [Help Wanted tickets](https://github.com/mattermost/mattermost/issues?q=is%3Aopen+is%3Aissue+label%3AArea%2FAPI) available for community members who would like to help others more easily use the APIs. We acknowledge everyone's contribution in the [release notes of our next version](https://docs.mattermost.com/administration/changelog.html#contributors).
|
|
|
|
|
|
The source code for this API reference is hosted at https://github.com/mattermost/mattermost/tree/master/api.
|
|
|
|
version: 4.0.0
|
|
title: Mattermost API
|
|
tags:
|
|
- name: users
|
|
description: >
|
|
Endpoints for creating, getting and interacting with users.
|
|
|
|
When using endpoints that require a user id, the string `me` can be used in place of the user id to indicate the action is to be taken for the logged in user.
|
|
- name: bots
|
|
description: Endpoints for creating, getting and updating bot users.
|
|
- name: teams
|
|
description: Endpoints for creating, getting and interacting with teams.
|
|
- name: channels
|
|
description: Endpoints for creating, getting and interacting with channels.
|
|
- name: posts
|
|
description: Endpoints for creating, getting and interacting with posts.
|
|
- name: files
|
|
description: Endpoints for uploading and interacting with files.
|
|
- name: uploads
|
|
description: Endpoints for creating and performing file uploads.
|
|
- name: bookmarks
|
|
description: Endpoints for creating, getting and interacting with channel bookmarks.
|
|
- name: preferences
|
|
description: Endpoints for saving and modifying user preferences.
|
|
- name: status
|
|
description: Endpoints for getting and updating user statuses.
|
|
- name: emoji
|
|
description: Endpoints for creating, getting and interacting with emojis.
|
|
- name: reactions
|
|
description: Endpoints for creating, getting and removing emoji reactions.
|
|
- name: webhooks
|
|
description: Endpoints for creating, getting and updating webhooks.
|
|
- name: commands
|
|
description: Endpoints for creating, getting and updating slash commands.
|
|
- name: system
|
|
description: General endpoints for interacting with the server, such as configuration and logging.
|
|
- name: brand
|
|
description:
|
|
Endpoints related to custom branding and white-labeling. See [our branding
|
|
documentation](https://docs.mattermost.com/administration/branding.html)
|
|
for more information.
|
|
- name: OAuth
|
|
description:
|
|
Endpoints for configuring and interacting with Mattermost as an OAuth 2.0
|
|
service provider.
|
|
- name: SAML
|
|
description: Endpoints for configuring and interacting with SAML.
|
|
- name: LDAP
|
|
description: Endpoints for configuring and interacting with LDAP.
|
|
- name: groups
|
|
description: Endpoints related to LDAP groups.
|
|
- name: compliance
|
|
description: Endpoints for creating, getting and downloading compliance reports.
|
|
- name: cluster
|
|
description: Endpoints for configuring and interacting with high availability clusters.
|
|
- name: elasticsearch
|
|
description: Endpoints for configuring and interacting with Elasticsearch.
|
|
- name: data retention
|
|
description: Endpoint for getting data retention policy settings.
|
|
- name: jobs
|
|
description:
|
|
Endpoints related to various background jobs that can be run by the server
|
|
or separately by job servers.
|
|
- name: plugins
|
|
description: Endpoints related to uploading and managing plugins.
|
|
- name: roles
|
|
description: Endpoints for creating, getting and updating roles.
|
|
- name: schemes
|
|
description: Endpoints for creating, getting and updating and deleting schemes.
|
|
- name: integration_actions
|
|
description: Endpoints for interactive actions for use by integrations.
|
|
- name: shared channels
|
|
description: Endpoints for getting information about shared channels.
|
|
- name: terms of service
|
|
description: Endpoints for getting and updating custom terms of service.
|
|
- name: imports
|
|
description: Endpoints related to import files.
|
|
- name: exports
|
|
description: Endpoints related to export files.
|
|
- name: metrics
|
|
description: Endpoints related to metrics, including the Client Performance Monitoring feature.
|
|
- name: audit_logs
|
|
description: Endpoints for managing audit log certificates and configuration.
|
|
- name: recaps
|
|
description: Endpoints for creating and managing AI-powered channel recaps that summarize unread messages.
|
|
- name: agents
|
|
description: Endpoints for interacting with AI agents and LLM services.
|
|
servers:
|
|
- url: "{your-mattermost-url}"
|
|
variables:
|
|
your-mattermost-url:
|
|
default: http://localhost:8065
|
|
paths:
|