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á
teamsa používáteam_id. - Sebou: kdekoliv, kde cesta bere
user_id,meznamená 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é:
- Systémový administrátor zapne Povolit osobní přístupové tokeny v Systémová konzole › Integrace › Správa integrací (
ServiceSettings.EnableUserAccessTokens,AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS). - 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.
- 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čí.
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:
- Povolit službu OAuth 2.0 musí být zapnuto (Systémová konzole › Integrace › Správa integrací,
ServiceSettings.EnableOAuthServiceProvider, výchozí stav je zapnuto). - 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.
- Vaše aplikace posílá uživatele na
https://chat.example.com/oauth/authorizes parametryresponse_type=code,client_id,redirect_uriastate. Podporováno je PKCE scode_challenge_method=S256. - Kód vymění na
POST https://chat.example.com/oauth/access_token(nejdřívgrant_type=authorization_code, pakrefresh_tokenpro obnovu) a volá API s hlavičkouAuthorization: Bearer <access token>.
Uživatelé vidí aplikace, které autorizovali, v Profil & nastavení › Zabezpečení › Aplikace, které jste autorizovali.
Hlavní zdroje
| Co | Koncové 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=… |
| Komunity | GET /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ály | GET /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 |
| Reakce | POST /reactions s tělem {"user_id", "post_id", "emoji_name"}, DELETE /users/{user_id}/posts/{post_id}/reactions/{emoji_name} |
| Soubory | POST /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) |
| Server | GET /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.Client4vserver/public/model(importgithub.com/mattermost/mattermost/server/public/model).model.NewAPIv4Client(url), pakclient.SetToken(token);model.NewWebSocketClient4(wsURL, token)sleduje události. Antimatter's copy adds methods for its own endpoints, such asUpdateMessageRequest,PutPostOnTopandExportChannel. - TypeScript: třída
Client4z balíčku@mattermost/clientvwebapp/platform/client, s typy vwebapp/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ý bod | Co dělá |
|---|---|
GET /teams/{team_id}/user_attributes/fieldsPOST stejná cestaPATCH, 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_attributesPATCH stejná cestaPOST /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}/timeoutsPUT /teams/{team_id}/members/{user_id}/timeoutGET /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_topPUT, 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}/rulesPOST /teams/{team_id}/rules/acceptGET /teams/{team_id}/rules/stats | Pravidla komunity: viz Pravidla komunity. |
GET, POST, DELETE /users/me/focusGET /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_request | Pů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}/overridesGET /channels/{channel_id}/overrides/effectiveGET, 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_categoriesGET, 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_rolePUT …/team_role/permissions | Oprávnění, která uděluje role komunity. |
POST /teams/{team_id}/autolinks/preview | Otestuje 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}/speech | Zpráva přečtená nahlas jako audio, pokud je nastaveno převádění textu na řeč. |
POST /posts/{post_id}/move_to_channel | Přesune vlákno do jiného kanálu téže komunity: viz Přesun vlákna. |
GET, POST /ai/connectionsGET, 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/agentsGET, PATCH, DELETE /ai/agents/{agent_id}POST /ai/agents/{agent_id}/tasksGET /ai/agents/conversations | Agenti AI, jejich aktivita a úlohy a konverzace AI chatu: viz Agenti. |
GET /ai/agents/{agent_id}/toolsGET /ai/agents/tools/cataloguePOST /ai/tools/calls/{call_id}/confirm, /declineGET, POST /ai/mcp_serversGET, 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_actionsPOST /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/acknowledge | Zruší 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}/type | Změní přednastavení kanálu nebo jeho nastavení: viz Typy kanálů. |
GET /channels/{channel_id}/topicsPATCH /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 (
TeamaPUT /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(communityneboworkplace, v rozhraní zobrazeno jako Guild a Workspace: guild také zapneall_channels_membership; nové komunity získají hodnotuTeamSettings.DefaultCommunityKindze 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;rolesneboteamstoto nastavení fixuje),hide_role_colors,require_team_badges,name_display(jak komunita zobrazuje lidi: prázdné pro výchozí nastavení serveru),onboardingaautolinks(oba jsou řetězce JSON). - Výchozí kanál nové komunity je
general(General), nikolitown-square. Aktualizace na verzi 0.9.0 přejmenujetown-squarekaždé komunity nagenerala zachová jeho ID, pokud komunita již kanálgeneralnemá. Staré názvy fungují i nadále:GET /teams/{team_id}/channels/name/town-square,GET /teams/name/{team}/channels/name/town-squareachannelpříchozího webhooku vrátí výchozí kanál komunity, pokud žádný kanál tento název nemá. Ve novém kódu používejtedefault_channel_idnebo názevgeneral. - Odkazy na kanály:
#channel-nameodkazuje na kanál stejně jako~channel-name. Vlastnostchannel_mentionspří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_tokrá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 hodnotouignoreneboblock. Zda přímá zpráva čeká jako žádost, je vnotify_props.dm_requestvašeho člena kanálu (pending,acceptednebodismissed). - Přílohy zpráv mohou nést
stagesachart: viz Karty. - Kanály (
Channel):propskaždého kanálu komunity vždy obsahujeam_type(text,voiceneboforum),am_mode,am_root_posts(membersnebomoderators) aam_preset(ID odpovídajícího přednastavení, nebo prázdné pro vlastní nastavení) a u fór takéam_forum_view(topicsneboimageboard). Pokud payload neobsahujeam_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é hodnoty | Typ | Režim | root_posts | view |
|---|---|---|---|---|
text_chat | text | chat | members | – |
text_announcement | text | chat | moderators | – |
voice_talk | voice | talk | members | – |
voice_stage | voice | stage | members | – |
forum_agora | forum | discussion | members | topics |
forum_qa | forum | qa | members | topics |
forum_ideas | forum | ideas | members | topics |
forum_announcement | forum | discussion | moderators | topics |
forum_imageboard | forum | discussion | members | imageboard |
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) nebostatus(pouze pro Ideas).answered(true/false, Q&A) astatus(jedna z hodnotopen,planned,in_progress,done,declined, Ideas): filtruje podle těchto atributů. Použití mimo příslušný režim vrátí chybu400.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: hodnotanext_cursorz 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í chybu400 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í chybu400 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í hodnotafalse): Pokud je nastaveno natrue, 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 chyba400 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í
403s IDapi.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.MoveThreadMaxCountzprá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,MovedThreadPostIda, pro veřejný cíl,MovedThreadChannelNameaMovedThreadChannelDisplayName. - Poznámka:
MovedFromChannelId,MovedFromTeamName,MovedFromPostId(ukazatel),MovedFromPermalinka, pro veřejný zdroj,MovedFromChannelNameaMovedFromChannelDisplayName.
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ý bod | Co dělá |
|---|---|
GET /teams/{team_id}/rules | Pravidla (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}/rules | Uloží 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/accept | Souhlasí, 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/stats | Poč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ý bod | Co dělá |
|---|---|
GET /users/me/focus | Aktuá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/focus | Zahá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/focus | Okamž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/read | S {"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ý bod | Co 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/connections | Přidá připojení (odpovídá 201). |
POST /ai/connections/test, POST /ai/connections/models | Otestuje 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}/test | Otestuje uložené připojení: {"ok", "error", "status_code", "latency_ms", "model_count"}. |
GET /ai/connections/{connection_id}/models | Modely, které poskytovatel nabízí. |
GET /ai/connections/{connection_id}/usage | Poč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ý bod | Co 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/agents | Vytvoří 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}/activityPOST /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.