REST API

Vše, co aplikace Antimatter dělají, probíhá přes stejné HTTP API, takže to umí i vaše skripty. Tato stránka vysvětluje, jak se autentizovat, které zdroje budete nejčastěji používat, jak vypadají odpovědi a chyby a jak živě sledovat události přes WebSocket.

Základy

  • Základní URL: https://chat.example.com/api/v4. Všechny níže uvedené koncové body jsou relativní vůči ní.
  • Formát: JSON na vstupu i výstupu, s výjimkou nahrávání souborů (multipart). Pošlete Content-Type: application/json.
  • ID: každý objekt má 26 znaků dlouhé id. Časy jsou v milisekundách od Unix epochu (create_at, update_at, delete_at; 0 znamená „nesmazáno“).
  • Komunity jsou týmy: API je nazývá teams a používá team_id.
  • Sebou: kdekoliv, kde cesta bere user_id, me znamená přihlášeného uživatele, např. GET /users/me.

Úplný seznam koncových bodů je v kódu serveru: trasy jsou deklarovány v server/channels/api4/*.go a typy v server/public/model. Popis OpenAPI ve složce api/v4/source v repozitáři pokrývá koncové body zděděné z Mattermostu a některé rozšíření Antimatteru: přesouvání vláken, připojení modelů, agenty, pravidla komunity, režim soustředění a akce se zprávami. Ostatní jsou pouze v kódu.

Autentizace

Každý požadavek, s výjimkou přihlášení a několika veřejných koncových bodů, vyžaduje token v hlavičce Authorization:

curl -H "Authorization: Bearer $TOKEN" https://chat.example.com/api/v4/users/me

Přijímány jsou tři druhy tokenů: osobní přístupové tokeny, session tokeny a OAuth přístupové tokeny. Přijímá se i Authorization: Token …. Tokeny v dotazovém řetězci (?access_token=) se přijímají pouze pro OAuth přístupové tokeny.

Osobní přístupové tokeny (doporučeno pro skripty)

Osobní přístupový token jedná za vás, nevyprší, pokud mu nenastavíte datum vypršení, a lze ho kdykoli odvolat. Osobní přístupové tokeny jsou ve výchozím nastavení vypnuté:

  1. Systémový administrátor zapne Povolit osobní přístupové tokeny v Systémová konzole › Integrace › Správa integrací (ServiceSettings.EnableUserAccessTokens, AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS).
  2. Pro každého, kdo může vytvářet tokeny, systémový administrátor otevře Systémová konzole › Správa uživatelů › Uživatelé, v menu dané osoby zvolí Spravovat role a zaškrtně Povolit tomuto účtu generovat osobní přístupové tokeny. Systémoví administrátoři je mohou vždy vytvářet.
  3. Uživatel klikne na svůj avatar v pravém horním rohu a poté na Profil a nastavení › Zabezpečení. V sekci Osobní přístupové tokeny popíše, k čemu token slouží, a zvolí Vytvořit token. Token se zobrazí pouze jednou: zkopírujte ho.

Přes API: POST /users/{user_id}/tokens s tělem {"description": "backup script", "expires_at": 0} (expires_at v milisekundách; 0 znamená bez expirace). Pole token v odpovědi je tajný klíč; jeho id použijete k jeho odvolání (POST /users/tokens/revoke s {"token_id": "…"}). Z příkazového řádku: amctl token generate <user> <description>.

Systémový administrátor může omezit platnost tokenů pomocí Maximální platnost osobního přístupového tokenu (dny) na stejné stránce Systémové konzole.

Relační tokeny

Přihlášení heslem vrátí relační token v hlavičce odpovědi Token, což je stejný typ relace, který používají aplikace:

curl -i -X POST https://chat.example.com/api/v4/users/login \
  -H 'Content-Type: application/json' \
  -d '{"login_id": "maya", "password": "…"}'

Pro účet s vícefaktorovou autentizací přidejte "token": "123456". Relace expirují podle nastavení relací na serveru a koncový bod pro přihlášení je omezen rychlostí (5 požadavků za sekundu). POST /users/logout relaci ukončí.

Prohlížeče se autentizují pomocí cookie. Požadavek autentizovaný cookie musí pro jakoukoli metodu kromě GET také odesílat hlavičku X-CSRF-Token; token v hlavičce Authorization hlavičku CSRF nevyžaduje.

OAuth 2.0 aplikace

Pokud chcete, aby se lidé mohli přihlásit do vaší aplikace svým účtem Antimatter, zaregistrujte OAuth 2.0 aplikaci. Antimatter pak slouží jako OAuth poskytovatel:

  1. Povolit službu OAuth 2.0 musí být zapnuto (Systémová konzole › Integrace › Správa integrací, ServiceSettings.EnableOAuthServiceProvider, výchozí stav je zapnuto).
  2. Uživatel s oprávněním spravovat aplikace OAuth (výchozí hodnotou jsou systémoví administrátoři) otevře Integrace › Aplikace OAuth 2.0 (nabídka komunity › Nastavení týmu › Integrace) a přidá aplikaci včetně jejích zpětných volacích URL. Získá ID klienta a tajný klíč klienta.
  3. Vaše aplikace posílá uživatele na https://chat.example.com/oauth/authorize s parametry response_type=code, client_id, redirect_uri a state. Podporováno je PKCE s code_challenge_method=S256.
  4. Kód vymění na POST https://chat.example.com/oauth/access_token (nejdřív grant_type=authorization_code, pak refresh_token pro obnovu) a volá API s hlavičkou Authorization: Bearer <access token>.

Uživatelé vidí aplikace, které autorizovali, v Profil & nastavení › Zabezpečení › Aplikace, které jste autorizovali.

Hlavní zdroje

CoKoncové body
Vy a ostatní uživateléGET /users/me, GET /users/{user_id}, GET /users/username/{username}, POST /users/ids (seznam ID), POST /users/search, GET /users?in_team=…&in_channel=…
KomunityGET /users/me/teams, GET /teams/{team_id}, GET /teams/name/{name}, PUT /teams/{team_id}/patch, GET /teams/{team_id}/members, POST /teams/{team_id}/members
KanályGET /users/me/teams/{team_id}/channels, GET /teams/name/{team}/channels/name/{channel}, POST /channels, POST /channels/direct (dva ID uživatelů), POST /channels/group, POST /channels/{channel_id}/members
Zprávy (příspěvky)POST /posts, GET /posts/{post_id}, PUT /posts/{post_id}/patch, DELETE /posts/{post_id}, GET /channels/{channel_id}/posts, GET /posts/{post_id}/thread, POST /teams/{team_id}/posts/search
ReakcePOST /reactions s tělem {"user_id", "post_id", "emoji_name"}, DELETE /users/{user_id}/posts/{post_id}/reactions/{emoji_name}
SouboryPOST /files (multipart: channel_id a files), pak vrácené ID vložte do pole file_ids příspěvku; GET /files/{file_id}
Preferenční nastaveníGET /users/me/preferences, PUT /users/me/preferences
Integrace/hooks/incoming, /hooks/outgoing, /commands, /bots, /oauth/apps (viz následující stránky)
ServerGET /system/ping (stav, bez tokenu), GET /config/client?format=old (nastavení viditelná pro klienty)

Odeslání zprávy

curl -X POST https://chat.example.com/api/v4/posts \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"channel_id": "'$CHANNEL_ID'", "message": "Backup finished: **42 GB** in 3 min"}'

Zprávy jsou v Markdownu. Pro odpověď ve vláknu přidejte "root_id" (ID prvního příspěvku vlákna), pro soubory "file_ids" a pro přílohy a další doplňky "props" (viz Přílohy).

Najít ID kanálu

curl -H "Authorization: Bearer $TOKEN" \
  https://chat.example.com/api/v4/teams/name/lumen-labs/channels/name/ops-alerts

Jména jsou ta, která najdete v odkazu na kanál: /lumen-labs/channels/ops-alerts.

Stránkování

Koncové body pro seznamy přijímají page (od 0) a per_page (výchozí 60, maximálně 200). Neustále žádejte další stránku, dokud se nevrátí stránka kratší než per_page.

Zprávy kanálu (GET /channels/{channel_id}/posts) také přijímají parametr since (čas: vše, co se od té doby změnilo), nebo before a after (ID příspěvku). Odpověď je seznam příspěvků: {"order": [IDs, newest first], "posts": {ID: post}, "next_post_id", "prev_post_id"}.

Chyby

Chyby používají běžné HTTP stavové kódy (400 nesprávný vstup, 401 neautorizováno, 403 zakázáno, 404 nenalezeno, 501 funkce vypnutá) a JSON tělo:

{
  "id": "api.context.permissions.app_error",
  "message": "You do not have the appropriate permissions.",
  "detailed_error": "",
  "request_id": "jz8zm5nunpbt8f3gpqsz5dq6so",
  "status_code": 403
}

Ve svém kódu používejte id: message je přeloženo do jazyka uživatele. detailed_error je prázdné, pokud server neběží v režimu vývojáře (ServiceSettings.EnableDeveloper). Uveďte request_id administrátorovi serveru: je v logu.

Omezení rychlosti

Omezení frekvence je výchozí vypnuté. Když systémový administrátor ho zapne (Systémová konzole › Prostředí › Omezení frekvence), každý klient má výchozí 10 požadavků za sekundu s bursty 100, počítáno podle IP adresy nebo podle uživatele. Odpovědi nesou X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset; nad limitem server odpoví 429 s hlavičkou Retry-After v sekundách. Některé endpointy, jako je přihlášení, mají vlastní limit bez ohledu na nastavení.

Píšte skripty, které čekají a při 429 se opakují, a vyhýbejte se dotazování: sledujte WebSocket.

WebSocketový tok událostí

Připojte se k wss://chat.example.com/api/v4/websocket. Autentizujte se buď hlavičkou Authorization: Bearer v požadavku na připojení, nebo odesláním tohoto jako první zprávy:

{"seq": 1, "action": "authentication_challenge", "data": {"token": "…"}}

Server pošle událost hello, pak událost pro vše, co máte právo vidět:

{
  "event": "posted",
  "data": {"channel_id": "…", "channel_type": "O", "post": "{\"id\":\"…\",\"message\":\"Hello\",…}"},
  "broadcast": {"channel_id": "…", "team_id": "", "user_id": "", "omit_users": null},
  "seq": 4
}

Pozor, data.post je příspěvek jako JSON řetězec. Běžné události: posted, post_edited, post_deleted, reaction_added, reaction_removed, typing, status_change, user_added, direct_added. Aplikace posílají vlastní události, pojmenované custom_<app id>_<event>.

Můžete také posílat akce, každá s rostoucím seq: user_typing s {"channel_id", "parent_id"}, nebo get_statuses. Připojte se znovu, když se připojení přeruší, a načtěte to, co jste přehlédli, pomocí since (viz Stránkování).

Antimatter přidává tyto události: agent_activity_changed a agent_post_stream (viz Agenti), ai_tools_changed (viz Agenti), community_rules_updated a community_rules_accepted (viz Pravidla komunity), focus_ended (viz Režim soustředění), community_attributes_updated, member_timeouts_updated, post_put_on_top, post_removed_from_top, server_categories_updated, channel_overrides_updated a category_overrides_updated. Nové přihlášení k vašemu účtu odešle událost session_created do vašich ostatních relací (session_id, create_at, platform, os, browser, mobile; nikdy ne token) a zpracování tohoto upozornění odešle událost session_revoked nebo session_acknowledged (session_id) do všech těchto relací.

Klientské knihovny

  • Jít: model.Client4 v server/public/model (import github.com/mattermost/mattermost/server/public/model). model.NewAPIv4Client(url), pak client.SetToken(token); model.NewWebSocketClient4(wsURL, token) sleduje události. Antimatter's copy adds methods for its own endpoints, such as UpdateMessageRequest, PutPostOnTop and ExportChannel.
  • TypeScript: třída Client4 z balíčku @mattermost/client v webapp/platform/client, s typy v webapp/platform/types. Kopie v repozitáři Antimatteru obsahuje koncové body Antimatteru; balíček publikovaný na npm společností Mattermost je neobsahuje.
package main

import (
	"context"
	"log"

	"github.com/mattermost/mattermost/server/public/model"
)

func main() {
	client := model.NewAPIv4Client("https://chat.example.com")
	client.SetToken("…")
	post, _, err := client.CreatePost(context.Background(), &model.Post{
		ChannelId: "…",
		Message:   "Hello from Go",
	})
	if err != nil {
		log.Fatal(err)
	}
	log.Println("posted", post.Id)
}

Co Antimatter přidává do API

Tyto koncové body a pole neexistují na serveru Mattermost. Všechny vyžadují relaci.

Koncový bodCo dělá
GET /teams/{team_id}/user_attributes/fields
POST stejná cesta
PATCH, DELETE …/fields/{field_id}
Komunitní atributy: pole profilu, která administrátoři komunity definují pro její členy (až 20). Členové je mohou číst; administrátoři komunity je vytvářejí a mění.
GET /teams/{team_id}/members/{user_id}/user_attributes
PATCH stejná cesta
POST /teams/{team_id}/user_attributes/values/search
Hodnoty atributů člena ve formátu {field_id: value}. Člen si nastavuje své vlastní (kromě těch spravovaných administrátorem); administrátoři nastavují hodnoty pro kohokoli. Hledání přijímá {"user_ids": [...]} (až 200).
GET /teams/{team_id}/timeouts
PUT /teams/{team_id}/members/{user_id}/timeout
GET /teams/{team_id}/members/{user_id}/moderation
Časové limity: {"until": time, "reason": "…"} brání uživateli v psaní, reagování a nahrávání v komunitě do daného času (maximálně 28 dní); "until": 0 je zruší. Pohled na moderaci zobrazuje, kdy se uživatel připojil a kolik nedávno publikoval.
GET /channels/{channel_id}/on_top
PUT, DELETE /posts/{post_id}/on_top
Zprávy přichycené nahoře v kanálu (až 10). {"duration": ms}, maximálně 30 dní; 0 je drží, dokud se neodeberou. Vypisuje je každý, kdo kanál může číst. Přichycení zprávy nahoře nebo její odebrání vyžaduje právo publikovat v kanálu a, v kanálu komunity, být administrátorem kanálu nebo komunity, nebo mít tam Spravovat zprávy (delete_others_posts). V přímé nebo skupinové zprávě to mohou její členové. V archivovaných kanálech je to zamítnuto.
GET, PUT /teams/{team_id}/rules
POST /teams/{team_id}/rules/accept
GET /teams/{team_id}/rules/stats
Pravidla komunity: viz Pravidla komunity.
GET, POST, DELETE /users/me/focus
GET /users/me/focus/summary?since=&until=
POST /users/me/focus/summary/read
Režim soustředění: viz Režim soustředění.
POST /channels/{channel_id}/message_requestPůsobí na vaši vlastní žádost: {"action": "accept"}, "dismiss" nebo "request" pro vrácení konverzace mezi žádosti. Vrátí vašeho člena kanálu.
GET, PUT /channels/{channel_id}/overrides
GET /channels/{channel_id}/overrides/effective
GET, PUT /channels/{channel_id}/role_access
Co může role nebo osoba v kanálu dělat a které role vidí kanál omezený na role.
GET, PUT /teams/{team_id}/server_categories
GET, PUT …/server_categories/overrides
Sdílené kategorie kanálů komunity a přepsání, která se vztahují na všechny kanály v kategorii.
GET /groups/{group_id}/team_role
PUT …/team_role/permissions
Oprávnění, která uděluje role komunity.
POST /teams/{team_id}/autolinks/previewOtestuje pravidla pro automatické odkazy komunity na text.
POST /channels/{channel_id}/export?format=csv&since=&until=Stáhne zprávy kanálu jako CSV (až 50 000) pro osoby, které mají v kanálu právo číst.
GET /posts/{post_id}/speechZpráva přečtená nahlas jako audio, pokud je nastaveno převádění textu na řeč.
POST /posts/{post_id}/move_to_channelPřesune vlákno do jiného kanálu téže komunity: viz Přesun vlákna.
GET, POST /ai/connections
GET, PATCH, DELETE /ai/connections/{connection_id}
GET /ai/connections/usable
Modelové připojení, poskytovatelé AI, které používají AI funkce a aplikace serveru: viz Modelové připojení.
GET, POST /ai/agents
GET, PATCH, DELETE /ai/agents/{agent_id}
POST /ai/agents/{agent_id}/tasks
GET /ai/agents/conversations
Agenti AI, jejich aktivita a úlohy a konverzace AI chatu: viz Agenti.
GET /ai/agents/{agent_id}/tools
GET /ai/agents/tools/catalogue
POST /ai/tools/calls/{call_id}/confirm, /decline
GET, POST /ai/mcp_servers
GET, PATCH, DELETE /ai/mcp_servers/{server_id}
POST, DELETE /ai/mcp_servers/{server_id}/oauth
Nástroje agenta, katalog nástrojů, které může používat, potvrzení nebo zamítnutí čekajícího volání nástroje a servery MCP dostupné agentům: viz AI.
GET /channels/{channel_id}/message_actions
POST /posts/{post_id}/message_actions/{hook_id}
GET, POST /hooks/outgoing/{hook_id}/icon
Akce se zprávami: odchozí webhooks, které lidé spouštějí z nabídky zprávy. Viz Akce se zprávami.
POST /users/me/sessions/acknowledgeZruší upozornění na nové přihlášení jedné z vašich vlastních relací: {"session_id"}. Toto může volat pouze přihlášený uživatel, a to pro své vlastní relace.
PUT /channels/{channel_id}/typeZmění přednastavení kanálu nebo jeho nastavení: viz Typy kanálů.
GET /channels/{channel_id}/topics
PATCH /posts/{post_id}/topic
Témata fóra a přijetí odpovědi nebo nastavení stavu tématu: viz Typy kanálů.

Nová pole

  • Komunity (Team a PUT /teams/{team_id}/patch): all_channels_membership (všichni jsou členy každého kanálu, který vidí), default_channel_id (kam nováčci směřují), welcome_channel_id (kam se posílají zprávy o připojení a odpojení, prázdné, pokud žádné nejsou), kind (community nebo workplace, v rozhraní zobrazeno jako Guild a Workspace: guild také zapne all_channels_membership; nové komunity získají hodnotu TeamSettings.DefaultCommunityKind ze serveru, ve výchozím nastavení community/Guild), member_list_view (jak seznam členů seskupuje členy: choice, ve výchozím nastavení, umožňuje každému členovi vybrat si; roles nebo teams toto nastavení fixuje), hide_role_colors, require_team_badges, name_display (jak komunita zobrazuje lidi: prázdné pro výchozí nastavení serveru), onboarding a autolinks (oba jsou řetězce JSON).
  • Výchozí kanál nové komunity je general (General), nikoli town-square. Aktualizace na verzi 0.9.0 přejmenuje town-square každé komunity na general a zachová jeho ID, pokud komunita již kanál general nemá. Staré názvy fungují i nadále: GET /teams/{team_id}/channels/name/town-square, GET /teams/name/{team}/channels/name/town-square a channel příchozího webhooku vrátí výchozí kanál komunity, pokud žádný kanál tento název nemá. Ve novém kódu používejte default_channel_id nebo název general.
  • Odkazy na kanály: #channel-name odkazuje na kanál stejně jako ~channel-name. Vlastnost channel_mentions příspěvku obsahuje seznam kanálů odkázaných kterakoli; #word, který neodpovídá žádnému kanálu, zůstává štítkem. Webové rozhraní a mobilní aplikace Antimatter zapisují #name.
  • Archivované kanály stále přijímají nové členy (POST /channels/{channel_id}/members), kteří si mohou přečíst jejich historii. Nikdo tam nemůže publikovat, reagovat, připínat, přesouvat zprávy na vrchol, přejmenovávat kanál ani měnit role členů.
  • Vložené odpovědi: příspěvek s "props": {"reply_to": "<post id>"} cituje danou zprávu ze stejného kanálu. Přidejte "reply_to_mention": false, abyste autora neoznamovali. Server vyplní metadata.reply_to krátkým popisem citované zprávy.
  • Varování před senzitivním obsahem: "props": {"spoiler": true} skryje text a soubory příspěvku, dokdy čtenář nevybere, že je chce zobrazit.
  • Ignorování a blokace jsou preference: kategorie user_block, pojmenovaná podle ID druhé osoby, s hodnotou ignore nebo block. Zda přímá zpráva čeká jako žádost, je v notify_props.dm_request vašeho člena kanálu (pending, accepted nebo dismissed).
  • Přílohy zpráv mohou nést stages a chart: viz Karty.
  • Kanály (Channel): props každého kanálu komunity vždy obsahuje am_type (text, voice nebo forum), am_mode, am_root_posts (members nebo moderators) a am_preset (ID odpovídajícího přednastavení, nebo prázdné pro vlastní nastavení) a u fór také am_forum_view (topics nebo imageboard). Pokud payload neobsahuje am_type, znamená to, že nebyl vyplněn, nikdy to neznamená, že kanál je textový. Přímé a skupinové zprávy žádná z těchto atributů neobsahují. Viz Typy kanálů.

Typy kanálů

Komunitní kanál je text, voice nebo forum (jeho typ, který se nastavuje při vytvoření), v jednom z režimů daného typu, s nastaveními nahoře. Přednastavená hodnota je pojmenovaný soubor režimu a nastavení, který klient nabízí jako jednu volbu. Přednastavené hodnoty se neukládají, takže přednastavená hodnota kanálu (am_preset) je odvozena z jeho nastavení a má hodnotu "", pokud neodpovídá žádné přednastavené hodnotě („Vlastní“).

ID přednastavené hodnotyTypRežimroot_postsview
text_chattextchatmembers–
text_announcementtextchatmoderators–
voice_talkvoicetalkmembers–
voice_stagevoicestagemembers–
forum_agoraforumdiscussionmemberstopics
forum_qaforumqamemberstopics
forum_ideasforumideasmemberstopics
forum_announcementforumdiscussionmoderatorstopics
forum_imageboardforumdiscussionmembersimageboard

Vytváření a změna typu kanálu

POST /channels načte props.am_preset (nejprve se rozbalí), poté jednotlivé props.am_type, am_mode, am_root_posts a am_forum_view nad ním; jakékoli jiné vlastnosti am_ se zahodí. Vytvoření hlasového kanálu, když není aktivní aplikace Hlasové kanály, je zamítnuto (400 api.channel.type.voice_unavailable.app_error). Vytvoření přímé nebo skupinové zprávy s vlastnostmi typu je zamítnuto (api.channel.type.direct.app_error).

curl -X POST https://chat.example.com/api/v4/channels \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"team_id": "'$TEAM_ID'", "name": "help-desk", "display_name": "Help desk", "type": "O",
       "props": {"am_preset": "forum_qa"}}'

PUT /channels/{channel_id}/type změní přednastavenou hodnotu nebo nastavení existujícího kanálu: {"preset"?, "mode"?, "root_posts"?, "view"?}, přednastavená hodnota se nejprve rozbalí jako při vytváření. Vyžaduje oprávnění manage_public_channel_properties nebo manage_private_channel_properties v kanálu (událost auditu updateChannelType) a vrací doplněný kanál. Tělo požadavku, které uvádí jiný type, je zamítnuto (api.channel.type.fixed.app_error): samotný typ se nikdy nemění. Další chyby: api.channel.type.invalid.app_error (neznámá hodnota, režim, který nepatří k typu kanálu, nebo zobrazení u ne-fórového kanálu).

Hromadný import a export (amctl import bulk) přenášejí na řádku kanálu stejná čtyři pole: am_type, am_mode, am_root_posts, am_forum_view. Řádek kanálu bez těchto polí se importuje jako běžný textový Chat kanál, jako před zavedením typů kanálů.

Kdo zahajuje konverzace nebo otevírá témata

Odeslání hlavní zprávy (na rozdíl od odpovědi) vyžaduje oprávnění create_root_post, které se v editoru přepsání zobrazuje jako Zahájit konverzace (text, hlas) nebo Otevřít témata (fóra). Toto oprávnění nemá žádná role: před přepsáním ho má každý, kdo může odesílat zprávy, pokud je root_posts nastaveno na members, a pouze moderátoři kanálu (systémoví administrátoři, administrátoři komunity, administrátoři kanálu a všichni s oprávněním Spravovat zprávy), pokud je nastaveno na moderators. Přepsání oprávnění create_root_post pro roli nebo osobu se pak aplikuje nad toto základní nastavení, stejně jako u jakéhokoli jiného oprávnění. Odpověď (s nastaveným root_id) vyžaduje pouze běžné právo odesílat zprávy.

Kořenový příspěvek, který toto selže, obdrží chybu 403: app.post.root_posts.moderators_only.app_error, pokud je root_posts nastaveno na moderators a odesílatel není moderátorem kanálu, nebo app.post.root_posts.denied.app_error v případě zamítnutí přepisem. Kontrola se provádí pro REST API, boty, příchozí a odchozí webhooks (pro tvůrce webhooku) a odpovědi příkazů s lomítkem; příspěvky z aplikací (plugin API) a kopie přesunutého vlákna se nekontrolují (místo toho se kontroluje osoba, která vlákno přesouvá). Hromadný import tuto kontrolu také přeskakuje.

Fóra přijímají pouze témata

Ve fóru kořenový příspěvek vyžaduje props.am_thread_title (název tématu), oříznutý, v délce 1 až 100 znaků, ze všech zdrojů, včetně aplikací a přesunutých vláken: chybějící název způsobí chybu 400 app.post.forum.title_required.app_error, příliš dlouhý název chybu app.post.forum.title_too_long.app_error. Odpovědi název nevyžadují a jakýkoli název zaslaný s odpovědí je zahazen. Úprava kořenového příspěvku tématu bez názvu nebo s prázdným názvem zachová stávající název tématu; neprázdný název téma přejmenuje. Přesunutí vlákna do fóra (viz níže) také vyžaduje název, buď ze požadavku, nebo z vlastního názvu vlákna.

Přijatá odpověď v tématu typu Q&A (am_accepted_answer, ID odpovědi) a stav tématu typu Ideas (am_topic_status, spolu s am_topic_status_by a am_topic_status_at) se zapisují pouze pomocí PATCH /posts/{post_id}/topic; jakákoli z těchto tří hodnot zaslaná při vytváření, aktualizaci nebo patchi, ať již klientem nebo aplikací, je zahazena a uložená hodnota zůstává zachována.

Vypsat témata fóra

GET /channels/{channel_id}/topics?sort=votes&per_page=25

Vyžaduje právo číst kanál. Parametry dotazu:

  • sort: activity (výchozí), newest, votes, unanswered (pouze pro Q&A) nebo status (pouze pro Ideas).
  • answered (true/false, Q&A) a status (jedna z hodnot open, planned, in_progress, done, declined, Ideas): filtruje podle těchto atributů. Použití mimo příslušný režim vrátí chybu 400.
  • mine=true: pouze témata, která jste vytvořili. following=true: pouze ta, která sledujete.
  • q: hledá shodu v názvu nebo v textu prvního příspěvku, maximálně 200 znaků.
  • before: hodnota next_cursor z předchozí stránky. per_page: výchozí hodnota je 25, maximálně 100. replies: 0 až 5 posledních odpovědí na každé téma, pro zobrazení ve stylu image boardu.

Odpověď: {"topics": [{"post", "reply_count", "last_reply_at", "participant_ids", "votes", "accepted_answer_id", "status", "on_top", "replies": [post, …]}], "next_cursor"}. Hlasy jsou reakce 👍 (reakce +1 a thumbsup se počítají společně) minus autor samotného tématu; accepted_answer_id se uvádí pouze ve fórech Q&A, status pouze ve fórech Ideas. Témata připnutá nahoře kanálu se zobrazují první.

Přijmout odpověď nebo nastavit stav tématu

curl -X PATCH https://chat.example.com/api/v4/posts/$POST_ID/topic \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"accepted_answer_id": "'$REPLY_ID'"}'

post_id musí být kořenový příspěvek tématu na fóru, jinak vrátí chybu 400 app.topic.not_a_topic.app_error. accepted_answer_id (ID odpovědi, nebo "" pro zrušení přijetí) vyžaduje fórum Q&A; status vyžaduje fórum Ideas; použití v nesprávném režimu vrátí chybu 400 app.topic.mode.app_error.

  • Přijetí odpovědi: může provést pouze tazatel tématu (pokud má stále právo přispívat) nebo moderátor kanálu; jinak vrátí chybu 403 app.topic.accept.not_allowed.app_error. Odpověď musí být aktivní odpověď na dané téma, která není systémová, jinak vrátí chybu 400 app.topic.accept.not_a_reply.app_error. Smazání přijaté odpovědi zruší označení odpovědi.
  • Nastavení stavu: pouze pro moderátory kanálu, jinak vrátí chybu 403 app.topic.status.not_allowed.app_error; neznámá hodnota vrátí chybu 400 app.topic.status.invalid.app_error.

Každá změna vytvoří v tématu systémovou odpověď (která informuje sledující) a vrátí aktuální stav kořenového příspěvku tématu. Ve fórech Ideas hlasování pro téma automaticky začne toto téma sledovat.

Přesunout vlákno

POST /posts/{post_id}/move_to_channel přesune vlákno, jeho první zprávu a všechny odpovědi do jiného kanálu téže komunity. post_id může být první zpráva nebo libovolná odpověď.

curl -X POST https://chat.example.com/api/v4/posts/$POST_ID/move_to_channel \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"channel_id": "'$TARGET_CHANNEL_ID'", "flatten": false}'
  • channel_id (povinné): kanál, do kterého se vlákno přesouvá.
  • flatten (výchozí hodnota false): Pokud je nastaveno na true, odpovědi se stanou zprávami cílového kanálu namísto vlákna. Tuto možnost používá funkce Udělat z toho kanál ve službě Fusion. Operace je zamítnuta, pokud je cílem fórum (400 app.post.move_thread.forum_flatten.app_error), protože odpovědi by se staly tématy bez názvu.
  • title: Název tématu, pokud je cílem fórum. Pokud tento parametr není zadán, zachová se původní název vlákna, pokud ho má. Pokud chybí název v obou případech, vrátí se chyba 400 app.post.move_thread.forum_title_required.app_error. Pro cíl, který není fórem, je tento parametr ignorován.

Zprávy si zachovají autory, časy, reakce a soubory. Jejich kopie nesou vlastnost silent_notification, takže nikoho neupozorní. Původní zprávy jsou smazány. Odpovědí je přesunutá první zpráva s jejím novým ID.

Kdo může přesouvat vlákno

  • Musíte mít možnost vlákno číst a publikovat v cílovém kanálu.
  • Administrátoři kanálu, administrátoři komunity, osoby s oprávněním Spravovat zprávy (delete_others_posts) v kanálu a systémoví administrátoři mohou přesunout libovolné vlákno.
  • Autor vlákna ho může přesunout, pokud jsou oba kanály veřejné, nebo pokud jsou všechny zprávy vlákna jeho. V opačném případě je odpovědí 403 s ID api.post.move_thread.private_needs_moderator.app_error.
  • Oba kanály musí patřit do stejné komunity (přímé a skupinové zprávy se nepřenášejí), musí být odlišné a nemohou být archivované. Systémové zprávy a zprávy, které se po přečtení smažou, nelze přesunout.
  • Vlákno delší než WranglerSettings.MoveThreadMaxCount zpráv (výchozí hodnota je 100; 0 znamená bez omezení) se nepřijme.

Ukazatel a poznámka

Přesun zanechá dvě systémové zprávy typu system_wrangler: ukazatel v původním kanálu („Vlákno se 13 zprávami bylo přesunuto do #target“) a poznámku v cílovém kanálu („Toto vlákno bylo přesunuto z #source“), umístěné pod přesunutým vlákнем nebo, při použití flatten, za jeho zprávy. Kromě textu zprávy umožňují jejich atributy klientovi vykreslit název kanálu jako odkaz:

  • Ukazatel: MovedThreadPermalink, NumMessages, MovedThreadChannelId, MovedThreadTeamName, MovedThreadPostId a, pro veřejný cíl, MovedThreadChannelName a MovedThreadChannelDisplayName.
  • Poznámka: MovedFromChannelId, MovedFromTeamName, MovedFromPostId (ukazatel), MovedFromPermalink a, pro veřejný zdroj, MovedFromChannelName a MovedFromChannelDisplayName.

Obě zprávy mají také TranslationID. Název soukromého kanálu se neuvádí: čtenáři vidí „jiný kanál“. Vlastní endpoint Mattermost POST /posts/{post_id}/move je v Antimatter vypnutý; použijte tento endpoint.

Pravidla komunity

Administrátoři komunity mohou vyžadovat, aby členové souhlasili s pravidly komunity před tím, než začnou přispívat do jejích kanálů. Pokud jsou pravidla aktivní, člen, který nesouhlasí s aktuální verzí, nemůže odesílat zprávy, odpovídat, posílat soubory, plánovat zprávy, upravovat nebo obnovovat zprávy ani spouštět příkazy, které zveřejňují příspěvky v kanálech komunity. Server odpoví chybou 403 s identifikátorem api.post.community_rules_not_accepted a naplánovaná zpráva, která má být odeslána v tu dobu, selže s kódem chyby community_rules_not_accepted. Čtení, reakce, přímé zprávy a skupinové zprávy nejsou blokovány. Blokovány nejsou ani boti, příchozí webhooky, systémové zprávy a administrátoři komunity (oprávnění manage_team, které mají i systémoví administrátoři).

Koncový bodCo dělá
GET /teams/{team_id}/rulesPravidla (enabled, text ve formátu Markdown, version) spolu s nejnovější verzí, se kterou jste souhlasili (accepted_version), a informací, zda musíte souhlasit před odesláním příspěvku (must_accept). Pro členy a pro kohokoli, kdo se může připojit k otevřené komunitě.
PUT /teams/{team_id}/rulesUloží pravidla pomocí {"enabled", "text", "ask_again"} (vyžaduje oprávnění manage_team). Parametr ask_again vytvoří novou verzi, se kterou musí všichni znovu souhlasit; první uložení vytvoří verzi 1. Text je povinný pro zapnutí pravidel a může mít maximálně 16 000 znaků.
POST /teams/{team_id}/rules/acceptSouhlasí, jako člen, s verzí version, kterou jste přečetli; vrátí chybu 409, pokud byla od té doby uložena novější verze, a vrátí 0, pokud souhlasíte s aktuální verzí.
GET /teams/{team_id}/rules/statsPočet členů komunity, kteří souhlasili s aktuální verzí (vyžaduje oprávnění manage_team).

Událost community_rules_updated je odeslána komunitě, když administrátor uloží pravidla (team_id, enabled, version). Událost community_rules_accepted je odeslána uživateli, který souhlasil, na všech jeho relacích (team_id, version).

Režim soustředění

Režim soustředění je stav „Nevyrušovat“ s koncovým časem: oznámení jsou ztlumena (žádná push, e-mailová, desktopová ani trvalá oznámení, včetně urgentních zpráv), důvod se stane vlastním stavem s emoji 🎯 (dart), který vyprší v koncovém čase, a aplikace Antimatteru skryjí nedočtené odznaky dané osoby. Tyto koncové body mohou používat pouze sami uživatelé (me nebo jejich vlastní ID): nikdo jiný, včetně systémových administrátorů, nemůže zahájit, ukončit nebo číst soustředění někoho jiného ani jeho shrnutí.

Koncový bodCo dělá
GET /users/me/focusAktuální soustředění (active, start_at, end_at, reason), nebo poslední soustředění po jeho ukončení (je nastaveno ended_at), nebo všechny hodnoty nulové.
POST /users/me/focusZahájí soustředění, nebo pokud již probíhá, změní jeho konec a důvod: {"duration": "1h30m", "reason": "…"}, nebo místo doby trvání {"end_at": ms}, v rozmezí od jedné minuty do jednoho týdne. "duration": "tomorrow" ukončí soustředění v 09:00 následujícího dne podle časového pásma uživatele. Konec je zaokrouhlen dolů na minuty; důvod může mít maximálně 100 znaků. Vyžaduje zapnuté uživatelské stavy (ServiceSettings.EnableUserStatuses); botové nemohou soustředit.
DELETE /users/me/focusOkamžitě ukončí soustředění.
GET /users/me/focus/summary?since=&until=Co bylo v tomto okně zmeškáno (start_at a ended_at soustředění): kanály s nedočtenými zprávami od ostatních (nejprve přímé a skupinové zprávy, poté ty se zmínkami; ztlumené kanály pouze se zmínkou) a, při sbalených vláknech odpovědí, sledovaná vlákna s novými odpověďmi, každé s počtem, zmínkami a posledním odesílatelem.
POST /users/me/focus/summary/readS {"since", "until"}: označí tyto kanály a vlákna jako přečtené pouze do until; to, co přišlo po tomto čase, zůstane nedočtené.

Během soustředění má uživatel vlastnost focus_until (milisekundy), kterou klienti používají k zobrazení stavu soustředění; nelze ji měnit prostřednictvím profilu. Soustředění skončí, když jej uživatel ukončí, když uplyne jeho čas (do jedné minuty), nebo když si uživatel zvolí stav sám, který pak zůstane zachován. Jinak se vrátí předchozí stav a vlastní stav. Všechny jeho relace pak obdrží událost focus_ended s poli start_at, end_at a ended_by (user, timer nebo status).

Připojení k modelům

Připojení modelu je adresa a klíč poskytovatele AI, které nastaví administrátor. Používají je AI funkce serveru i aplikace, které volají AI službu. Systémoví administrátoři spravují celoserverová připojení (manage_ai_connections); administrátoři komunity spravují připojení své komunity (manage_team_ai_connections). Klíče jsou pouze pro zápis: žádná odpověď je neobsahuje, pouze api_key_set a api_key_last4.

Koncový bodCo dělá
GET /ai/connections?scope=Připojení, která spravujete. scope je server nebo ID komunity; bez něj se vrátí všechna připojení, která spravujete.
POST /ai/connectionsPřidá připojení (odpovídá 201).
POST /ai/connections/test, POST /ai/connections/modelsOtestuje připojení nebo vypíše jeho modely, než se uloží. Stejné tělo požadavku jako při přidávání; nic se neukládá.
GET, PATCH (nebo PUT), DELETE /ai/connections/{connection_id}Načte, změní nebo smaže připojení. Patch obsahuje pouze pole, která se mají změnit; vynechání api_key zachová klíč.
POST /ai/connections/{connection_id}/testOtestuje uložené připojení: {"ok", "error", "status_code", "latency_ms", "model_count"}.
GET /ai/connections/{connection_id}/modelsModely, které poskytovatel nabízí.
GET /ai/connections/{connection_id}/usagePočet požadavků a tokenů za tento měsíc.
GET /ai/connections/usable?channel_id=&team_id=Pro každého přihlášeného: připojení, která tam můžete použít, včetně jejich modelů a funkcí, nikdy však klíčů ani adres.

Tělo nového připojení:

{
  "name": "Local models",
  "scope": "server",
  "provider": "openai_compatible",
  "base_url": "http://llm.internal:8000/v1",
  "api_key": "…",
  "extra_headers": {},
  "models": {"chat": "qwen3-32b", "embeddings": "", "transcription": "", "decisions": ""},
  "limits": {"requests_per_minute": 0, "monthly_token_budget": 0, "per_user_requests_per_minute": 0, "per_user_monthly_token_budget": 0},
  "sharing": {"all_teams": true, "team_ids": []},
  "audience": {"everyone": true, "group_ids": [], "roles": [], "allow_guests": false}
}

provider je openai_compatible nebo anthropic. scope má výchozí hodnotu server; ID komunity z něj udělá připojení této komunity. V limits znamená 0 žádný limit; požadavky za minutu se počítají na každém serveru, rozpočet tokenů na kalendářní měsíc (UTC) pro celý cluster. sharing určuje, které komunity mohou použít serverové připojení (přímé a skupinové zprávy vyžadují all_teams), a audience určuje, kdo ho může používat; hosté pouze s allow_guests. Změny se zapisují do auditního protokolu. Nastavení vysvětluje administrátorský průvodce: viz AI.

Agenti

Agent je bot účet typu agent (is_agent u uživatele) s následujícími nastaveními: rozsah (server nebo ID komunity), typ vestavěný nebo external a u vestavěného agenta připojení k modelu, model, systémový prompt a úvody. Správci systému spravují agenty v rámci celého serveru (manage_system), správci komunity agenty své komunity (manage_team); k tomu navíc manage_own_agent pro agenta, kterého vytvořili, a manage_others_agent pro ostatní. ID agenta v těchto cestách je jeho uživatelské ID. Spouštění externího agenta a způsob nastavení stavu vestavěného agenta jsou vysvětleny v sekci Boti; endpointy PUT /users/{user_id}/status a vlastní stav odmítají ID vestavěného agenta, a to i pro správce systému (403, api.status.agent.app_error).

Koncový bodCo dělá
GET /ai/agents?scope=Agenty, které spravujete: scope je server nebo ID komunity; bez tohoto parametru vrátí všechny agenty, které spravujete.
POST /ai/agentsVytvoří agenta a jeho účet (vrátí 201). Agent komunity se připojí ke své komunitě.
GET, PATCH, DELETE /ai/agents/{agent_id}
POST …/enable, POST …/disable
Čte, mění, maže (jeho účet je deaktivován, zprávy zůstávají), zapíná nebo vypíná agenta.
GET /ai/agents/connections?scope=
GET /ai/agents/connections/{connection_id}/models
Připojení k modelům, která může agent daného rozsahu používat, a jejich modely.
GET, PUT /ai/agents/{agent_id}/activity
POST /ai/agents/activity/ids
Co agent dělá; nastavuje se jeho vlastním tokenem nebo jeho správci. Dávkový požadavek přijme až 200 uživatelských ID.
POST /ai/agents/{agent_id}/tasksŽádost vestavěného agenta, kterého můžete používat, o úkol: summarize_thread, find_action_items nebo find_open_questions (na post_id vlákna, nebo channel_id od since dále), summarize_channel, ask_channel (s parametrem question) nebo summarize_transcription (příspěvek s přepisem hovoru). Požadavek se stane vaší zprávou ve vaší přímé zprávě s agentem, ve vašem jazyce, a je na něj odpovězeno tam; odpověď (201) je tato zpráva. Příspěvek nebo kanál, který nemůžete číst, je považován za neexistující.
GET /ai/agents/conversations?agent_id=&before=&per_page=Vaše konverzace s agenty, které můžete používat, nejnovější první: vlákna, která jste začali ve svých přímých zprávách s nimi, a vlákna jinde, ve kterých jeden z nich odpověděl a která sledujete. Parametr before (čas) vrátí další stránku; per_page je maximálně 100.

Tělo nového agenta:

{
  "username": "researcher",
  "display_name": "Researcher",
  "description": "Answers with sources",
  "scope": "server",
  "external": false,
  "connection_id": "…",
  "model": "",
  "system_prompt": "You research questions and answer with sources.",
  "reasoning": {"enabled": false, "effort": "", "budget_tokens": 0},
  "max_tool_turns": 0,
  "access": {"everyone": true, "team_ids": [], "channel_ids": [], "roles": [], "user_ids": [], "allow_guests": false}
}

Prázdné model používá chatový model připojení. access.channel_ids znamená členy těchto kanálů. Externí agent nemá žádné připojení, model ani systémový prompt. GET /agents vypisuje agenty, se kterými můžete komunikovat, tak, jak je čte aplikace AI chat.