REST-API:et
Allt som Antimatter-apparna gör går genom samma HTTP-API, så dina skript kan göra detsamma. På den här sidan förklaras hur du autentiserar, vilka resurser du kommer att använda oftast, hur svar och fel ser ut och hur du kan följa händelser i realtid via WebSocket.
Grundläggande
- Grund-URL:
https://chat.example.com/api/v4. Alla slutpunkter nedan är relativa till den. - Format: JSON in och ut, förutom filuppladdningar (multipart). Skicka
Content-Type: application/json. - ID:er: varje objekt har en 26 tecken lång
id. Tider anges i millisekunder sedan Unix-epoken (create_at,update_at,delete_at; 0 betyder "inte raderad"). - Community är team: API:et kallar dem
teams, med ettteam_id. - Du själv: där en sökväg tar ett
user_idbetydermeden inloggade användaren, som iGET /users/me.
Den fullständiga listan över slutpunkter finns i serverns kod: rutorna är deklarera i server/channels/api4/*.go och typerna i server/public/model. OpenAPI-beskrivningen i repositoryns mapp api/v4/source täcker slutpunkterna som är ärfta från Mattermost, samt några av Antimatters tillägg: flytt av trådar, modellanslutningar och meddelandehandlingar. De övriga finns endast i koden.
Autentisering
Varje begäran, förutom inloggning och några publika slutpunkter, kräver en token i Authorization-rubriken:
curl -H "Authorization: Bearer $TOKEN" https://chat.example.com/api/v4/users/me
Tre typer av token accepteras där: personliga access-tokens, sessionstokens och OAuth-access-tokens. Authorization: Token … accepteras också. Tokens i frågesträngen (?access_token=) accepteras endast för OAuth-access-tokens.
Personliga access-tokens (rekommenderas för skript)
En personlig access-token agerar som du, går inte ut om du inte ger den en utgångsdatum och kan återskapas när som helst. Personliga access-tokens är avstängda som standard:
- En systemadministratör aktiverar Aktivera Personliga Access-tokens i Systemkonsol › Integrationer › Hantera integrationer (
ServiceSettings.EnableUserAccessTokens,AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS). - För varje person som kan skapa token öppnar en systemadministratör Systemkonsol › Hantera användare › Användare, väljer Hantera roller i personens meny och markerar Aktivera Personliga Access-tokens. Systemadministratörer kan alltid skapa dem.
- Personen öppnar sin avatar i övre högra hörnet och väljer sedan Profil & inställningar › Säkerhet. Under Aktivera Personliga Access-tokens beskriver de vad token är avsett för och väljer Skapa nytt token. Token visas endast en gång: kopiera den.
Med API:et: POST /users/{user_id}/tokens med {"description": "backup script", "expires_at": 0} (expires_at i millisekunder; 0 för ingen). Svarets token-fält är hemligheten; dess id är det du använder för att ångra det (POST /users/tokens/revoke med {"token_id": "…"}). Från kommandoraden: amctl token generate <user> <description>.
En systemadministratör kan begränsa token giltighetstider med Maximal giltighetstid för personliga åtkomsttoken (dagar) på samma Systemkonsol-sida.
Sessionstoken
Inloggning med lösenord returnerar en sessionstoken i Token-responsrätt, samma typ av session som apparna använder:
curl -i -X POST https://chat.example.com/api/v4/users/login \
-H 'Content-Type: application/json' \
-d '{"login_id": "maya", "password": "…"}'
Lägg till "token": "123456" för ett konto med multifaktorautentisering. Sessioner upphör enligt serverns sessionsinställningar, och inloggningsändpunkten är hastighetsbegränsad (5 begäranden per sekund). POST /users/logout avslutar sessionen.
X-CSRF-Token-rätt för allt utom GET; en token i Authorization-rätt behöver ingen CSRF-rätt.OAuth 2.0-appar
För att låta personer logga in i din applikation med deras Antimatter-konto, registrera en OAuth 2.0-app. Antimatter är då OAuth-leverantören:
- Aktiverar OAuth 2.0 Service Provider måste vara på (Systemkonsol › Integrationer › Hantera integrationer,
ServiceSettings.EnableOAuthServiceProvider, på som standard). - Någon med rätt att hantera OAuth-appar (systemadministratörer som standard) öppnar sin avatar, väljer Integrationer › OAuth 2.0-appar och lägger till appen med dess callback-URL:er. De får ett klient-ID och ett klienthemligt.
- Din applikation skickar användare till
https://chat.example.com/oauth/authorizemedresponse_type=code,client_id,redirect_uriochstate. PKCE medcode_challenge_method=S256stöds. - Den byter koden mot
POST https://chat.example.com/oauth/access_token(grant_type=authorization_code, sedanrefresh_tokenför att förnya) och anropar API:et medAuthorization: Bearer <access token>.
Användare ser de appar de har godkänt under Profil & inställningar › Säkerhet › Appar du har godkänt.
Huvudresurser
| Vad | Endpoint |
|---|---|
| Du och andra användare | GET /users/me, GET /users/{user_id}, GET /users/username/{username}, POST /users/ids (en lista med ID:n), POST /users/search, GET /users?in_team=…&in_channel=… |
| Community | 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 |
| Kanaler | GET /users/me/teams/{team_id}/channels, GET /teams/name/{team}/channels/name/{channel}, POST /channels, POST /channels/direct (två användar-ID:n), POST /channels/group, POST /channels/{channel_id}/members |
| Meddelanden (inlägg) | 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 |
| Reaktioner | POST /reactions med {"user_id", "post_id", "emoji_name"}, DELETE /users/{user_id}/posts/{post_id}/reactions/{emoji_name} |
| Filer | POST /files (multipart: channel_id och files), lägg sedan de returnerade ID:na i inläggets file_ids; GET /files/{file_id} |
| Inställningar | GET /users/me/preferences, PUT /users/me/preferences |
| Integrationer | /hooks/incoming, /hooks/outgoing, /commands, /bots, /oauth/apps (se följande sidor) |
| Server | GET /system/ping (hälsokontroll, inget token krävs), GET /config/client?format=old (inställningarna som klienterna ser) |
Skicka ett meddelande
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"}'
Meddelanden är Markdown. Lägg till "root_id" (det första inlägget i en tråd) för att svara i en tråd, "file_ids" för filer och "props" för bilagor och andra tillägg (se Bilagor).
Hitta en kanals ID
curl -H "Authorization: Bearer $TOKEN" \
https://chat.example.com/api/v4/teams/name/lumen-labs/channels/name/ops-alerts
Namnen är de som finns i kanalens länk: /lumen-labs/channels/ops-alerts.
Paginering
List-endpoints tar page (från 0) och per_page (60 som standard, högst 200). Fortsätt att be om nästa sida tills en sida kommer tillbaka som är kortare än per_page.
En kanals meddelanden (GET /channels/{channel_id}/posts) tar även since (en tidpunkt: allt som ändrats sedan dess) eller before och after (ett inläggs-ID). De returneras som en lista med inlägg: {"order": [IDs, newest first], "posts": {ID: post}, "next_post_id", "prev_post_id"}.
Fel
Fel använder vanliga HTTP-statuskoder (400 felaktig indata, 401 inte inloggad, 403 inte tillåtet, 404 inte hittad, 501 funktion avstängd) och en JSON-kropp:
{
"id": "api.context.permissions.app_error",
"message": "You do not have the appropriate permissions.",
"detailed_error": "",
"request_id": "jz8zm5nunpbt8f3gpqsz5dq6so",
"status_code": 403
}
Använd id i din kod: message översätts till användarens språk. detailed_error är tomt om inte servern körs i utvecklarläge (ServiceSettings.EnableDeveloper). Citera request_id till serverns administratör: den finns i loggarna.
Begränsa
Begränsning är avstängd som standard. När en systemadministratör aktiverar den (Systemkonsol › Miljö › Begränsa) får varje klient 10 begäranden per sekund med burstar på 100 som standard, räknat per IP-adress eller per användare. Svar bär X-RateLimit-Limit, X-RateLimit-Remaining och X-RateLimit-Reset; över gränsen svarar servern med 429 med en Retry-After-rubrik i sekunder. Vissa ändpunkter, som inloggning, har sin egen gräns oavsett inställning.
Skriv skript som väntar och försöker igen vid 429, och undvik polling: följ WebSocket i stället.
WebSocket-händelseströmmen
Anslut till wss://chat.example.com/api/v4/websocket. Autentisera antingen med Authorization: Bearer-rubriken i anslutningsbegärandet, eller genom att skicka detta som det första meddelandet:
{"seq": 1, "action": "authentication_challenge", "data": {"token": "…"}}
Servern skickar en hello-händelse, sedan en händelse för allt du har tillgång till:
{
"event": "posted",
"data": {"channel_id": "…", "channel_type": "O", "post": "{\"id\":\"…\",\"message\":\"Hello\",…}"},
"broadcast": {"channel_id": "…", "team_id": "", "user_id": "", "omit_users": null},
"seq": 4
}
Observera att data.post är meddelandet som en JSON-sträng. Vanliga händelser: posted, post_edited, post_deleted, reaction_added, reaction_removed, typing, status_change, user_added, direct_added. Appar skickar egna händelser, namngivna custom_<app id>_<event>.
Du kan också skicka åtgärder, var och en med ett ökande seq: user_typing med {"channel_id", "parent_id"}, eller get_statuses. Återanslut när anslutningen går ner, och hämta det du missade med since (se Paginering).
Antimatter lägger till dessa händelser: community_attributes_updated, member_timeouts_updated, post_put_on_top, post_removed_from_top, server_categories_updated, channel_overrides_updated och category_overrides_updated.
Klientbibliotek
- Go:
model.Client4iserver/public/model(importeragithub.com/mattermost/mattermost/server/public/model). Användmodel.NewAPIv4Client(url)och sedanclient.SetToken(token);model.NewWebSocketClient4(wsURL, token)följer händelser. Antimatters kopia lägger till metoder för egna slutpunkter, såsomUpdateMessageRequest,PutPostOnTopochExportChannel. - TypeScript: klassen
Client4i@mattermost/client, iwebapp/platform/client, med dess typer iwebapp/platform/types. Kopian i Antimatters repository innehåller Antimatters slutpunkter; paketet som publicerats på npm av Mattermost gör det inte.
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)
}
Vad Antimatter lägger till i API:et
Dessa slutpunkter och fält finns inte på en Mattermost-server. Alla kräver en session.
| Slutpunkt | Vad den gör |
|---|---|
GET /teams/{team_id}/user_attributes/fieldsPOST samma sökvägPATCH, DELETE …/fields/{field_id} | Gemenskapsattribut: profilfälten som en gemenskaps administratörer definierar för dess medlemmar (upp till 20). Medlemmar kan läsa dem; gemenskapsadministratörer skapar och ändrar dem. |
GET /teams/{team_id}/members/{user_id}/user_attributesPATCH samma sökvägPOST /teams/{team_id}/user_attributes/values/search | En medlems attributvärden, som {field_id: value}. Medlemmar anger sina egna (undantaget administratörsstyrda); administratörer anger vilka som helst. Söket tar {"user_ids": [...]} (upp till 200). |
GET /teams/{team_id}/timeoutsPUT /teams/{team_id}/members/{user_id}/timeoutGET /teams/{team_id}/members/{user_id}/moderation | Tidsgränser: {"until": time, "reason": "…"} hindrar någon från att skriva, reagera och ladda upp i gemenskapen fram till dess (högst 28 dagar); "until": 0 lyfter den. Översiktsvyn för moderation visar när de gick med och hur mycket de har skrivit nyligen. |
GET /channels/{channel_id}/on_topPUT, DELETE /posts/{post_id}/on_top | Meddelanden som hålls uppe i toppen av en kanal (max 10). {"duration": ms}, högst 30 dagar; 0 behåller dem tills de tas bort. Alla som kan läsa kanalen ser dem. Att sätta ett meddelande i toppen eller ta det bort kräver rätt att skriva i kanalen och, i en gemenskaps kanal, att vara administratör för kanalen eller gemenskapen, eller ha Hantera meddelanden (delete_others_posts) där. I direkt- eller gruppmeddelanden kan deras medlemmar göra det. Avvisas i arkiverade kanaler. |
POST /channels/{channel_id}/message_request | Verkar på din egen meddelandeförfrågan: {"action": "accept"}, "dismiss" eller "request" för att lägga tillbaka en konversation bland förfrågningarna. Returnerar din kanalmedlem. |
GET, PUT /channels/{channel_id}/overridesGET /channels/{channel_id}/overrides/effectiveGET, PUT /channels/{channel_id}/role_access | Vad en roll eller en person får göra i en kanal, och vilka roller som ser en kanal med rollbegränsning. |
GET, PUT /teams/{team_id}/server_categoriesGET, PUT …/server_categories/overrides | Gemenskapens delade kategorier för kanaler, samt de åsidosättningar som gäller för alla kanaler i en kategori. |
GET /groups/{group_id}/team_rolePUT …/team_role/permissions | De behörigheter som en gemenskapsroll beviljar. |
POST /teams/{team_id}/autolinks/preview | Testar gemenskapens automatlänkar på en text. |
POST /channels/{channel_id}/export?format=csv&since=&until= | Laddar ner en kanals meddelanden som CSV (upp till 50 000), för personer som kan läsa kanalen. |
GET /posts/{post_id}/speech | Meddelandet som läses högt som ljud när text-till-tal är konfigurerat. |
POST /posts/{post_id}/move_to_channel | Flyttar en tråd till en annan kanal i samma gemenskap: se Flytta en tråd. |
GET, POST /ai/connectionsGET, PATCH, DELETE /ai/connections/{connection_id}GET /ai/connections/usable | Modellanslutningar, de AI-leverantörer som serverns AI-funktioner och appar använder: se Modellanslutningar. |
GET /channels/{channel_id}/message_actionsPOST /posts/{post_id}/message_actions/{hook_id}GET, POST /hooks/outgoing/{hook_id}/icon | Meddelandehandlingar: utgående webhooks som användare kör från meddelandemenyn. Se Meddelandehandlingar. |
Nya fält
- Gemenskaper (
Team, ochPUT /teams/{team_id}/patch):all_channels_membership(alla är i varje kanal de kan se),default_channel_id(där nya användare hamnar; tomt betyder General),kind(communityellerworkplace: i en workplace kan kanaladministratörer också arkivera sina kanaler; nya gemenskaper får servernsTeamSettings.DefaultCommunityKind,communitysom standard),member_list_view(hur medlemslistan grupperar medlemmar:choice, standard, låter varje medlem välja;rolesellerteamsfixerar det),hide_role_colors,require_team_badges,onboardingochautolinks(båda JSON-strängar). - Standardkanalen i en ny community är
general(General), intetown-square. Uppgraderingen till 0.9.0 byter namn på varje communitystown-squaretillgeneraloch behåller dess ID, om inte communityn redan har engeneral-kanal. Gamla namn fungerar fortfarande:GET /teams/{team_id}/channels/name/town-square,GET /teams/name/{team}/channels/name/town-squareoch en inkommande webhookschannelger communityns standardkanal när ingen kanal har det namnet. Använddefault_channel_ideller namnetgenerali ny kod. - Kanallänkar:
#channel-namelänkar en kanal, precis som~channel-name. Egenskapenchannel_mentionsi inlägget listar kanalerna som är länkade på något av sätten; ett#wordsom inte nämner någon kanal förblir en hashtag. Antimatters webbgränssnitt och mobilapp skriver#name. - Arkiverade kanaler kan fortfarande få nya medlemmar (
POST /channels/{channel_id}/members), som kan läsa deras historik. Ingen kan posta, reagera, fästa, lägga ett meddelande överst, byta namn på kanalen eller ändra dess medlemmars roller där. - Inline-svar: ett inlägg med
"props": {"reply_to": "<post id>"}citerar det meddelandet från samma kanal. Lägg till"reply_to_mention": falseför att inte avisera meddelandets författare. Servern fyller imetadata.reply_tomed en kort beskrivning av det citerade meddelandet. - Spoilers:
"props": {"spoiler": true}döljer ett inläggs text och filer tills läsaren väljer att se dem. - Ignorera och blockera är inställningar: kategori
user_block, namngiven efter den andres ID, med värdetignoreellerblock. Om ett direktmeddelande väntar som en begäran anges i din kanalmedlemsnotify_props.dm_request(pending,acceptedellerdismissed). - Meddelandebilagor kan bära
stagesoch ettchart: se Kort.
Flytta en tråd
POST /posts/{post_id}/move_to_channel flyttar en tråd, dess första meddelande och alla dess svar, till en annan kanal i samma community. post_id kan vara det första meddelandet eller vilket som helst svar.
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(obligatorisk): kanalen som tråden flyttas till.flatten(standardfalse):truegör svaren till meddelanden i målkanalet i stället för en tråd. Fusion använder Gör det till en kanal för detta.
Meddelandena behåller sina författare, tidsstämplar, reaktioner och filer. Deras kopior har silent_notification-egenskapen, så de avisera ingen. De ursprungliga meddelandena tas bort. Svarskoden är det flyttade första meddelandet, med dess nya ID.
Vem som kan flytta en tråd
- Du måste kunna läsa tråden och posta i målkanalet.
- Kanalens administratörer, communityns administratörer, personer med Hantera meddelanden (
delete_others_posts) i kanalen samt systemadministratörer kan flytta vilken tråd som helst. - Trådens författare kan flytta den när båda kanalerna är publika, eller när alla meddelanden i tråden är deras. I andra fall är svaret
403med ID:tapi.post.move_thread.private_needs_moderator.app_error. - Båda kanaler måste tillhöra samma community (inga direkt- eller gruppmeddelanden), vara olika och inte arkiverade. Systemmeddelanden och meddelanden som bränns vid läsning kan inte flyttas.
- En tråd som är längre än
WranglerSettings.MoveThreadMaxCountmeddelanden (100 som standard; 0 för ingen gräns) avvisas.
Peckaren och anteckningen
Flytten lämnar efter sig två systemmeddelanden av typen system_wrangler: en peckare i den gamla kanalen ("En tråd med 13 meddelanden har flyttats till #target") och en anteckning i målet ("Denna tråd flyttades från #source"), under den flyttade tråden eller, med flatten, efter dess meddelanden. Förutom meddelandetexten gör deras egenskaper att en klient kan rita kanalnamnet som en länk:
- Peckaren:
MovedThreadPermalink,NumMessages,MovedThreadChannelId,MovedThreadTeamName,MovedThreadPostIdoch, för ett publikt mål,MovedThreadChannelNameochMovedThreadChannelDisplayName. - Anteckningen:
MovedFromChannelId,MovedFromTeamName,MovedFromPostId(peckaren),MovedFromPermalinkoch, för en publik källa,MovedFromChannelNameochMovedFromChannelDisplayName.
Båda har också ett TranslationID. Ett privat kanals namn utelämnas: läsare ser "en annan kanal". Mattermosts egen POST /posts/{post_id}/move är avstängd i Antimatter; använd denna endpoint.
Modellanslutningar
En modellanslutning är en AI-leverantörs adress och nyckel, som ställs in av en administratör. Serverns AI-funktioner och apparna som anropar AI-tjänsten använder dem. Systemadministratörer hanterar serveromfattande anslutningar (manage_ai_connections); en communitys administratörer hanterar deras communitys egna (manage_team_ai_connections). Nycklar är skrivskyddade: inget svar innehåller en, bara api_key_set och api_key_last4.
| Slutpunkt | Vad den gör |
|---|---|
GET /ai/connections?scope= | De anslutningar du hanterar. scope är server eller en communitys ID; utan det, alla omfång du hanterar. |
POST /ai/connections | Lägger till en anslutning (svarar 201). |
POST /ai/connections/test, POST /ai/connections/models | Testar en anslutning, eller listar dess modeller, innan den sparas. Samma kropp som vid tillägg; inget sparas. |
GET, PATCH (eller PUT), DELETE /ai/connections/{connection_id} | Läser, ändrar eller tar bort en anslutning. En patch innehåller bara de fält som ska ändras; utelämna api_key för att behålla nyckeln. |
POST /ai/connections/{connection_id}/test | Testar en sparad anslutning: {"ok", "error", "status_code", "latency_ms", "model_count"}. |
GET /ai/connections/{connection_id}/models | Modeller som leverantören erbjuder. |
GET /ai/connections/{connection_id}/usage | Förfrågningar och token för den här månaden. |
GET /ai/connections/usable?channel_id=&team_id= | För alla inloggade: de anslutningar du kan använda där, med deras modeller och funktioner, men aldrig deras nycklar eller adresser. |
Innehållet i en ny anslutning:
{
"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 är openai_compatible eller anthropic. scope är som standard server; ett samfällighets-ID gör det till samfällighetens anslutning. I limits betyder 0 ingen gräns; förfrågningar per minut räknas på varje server, tokenbudgeter per kalendermånad (UTC) för hela klustret. sharing anger vilka samfälligheter som kan använda en serveromfattande anslutning (direktmeddelanden och gruppmeddelanden kräver all_teams), och audience vem som kan använda den; gäster endast med allow_guests. Ändringar skrivs till revisionsloggen. Administratörsguiden förklarar inställningarna: se AI.