REST-API'et
Alt, hvad Antimatter-appene gør, sker gennem samme HTTP-API, så dine scripts kan også gøre det. Denne side forklarer, hvordan du autentificerer, hvilke ressourcer du oftest vil bruge, hvordan svar og fejl ser ud, og hvordan du følger hændelser live via WebSocket.
Grundlæggende
- Grund-URL:
https://chat.example.com/api/v4. Alle endpoints nedenfor er relative hertil. - Format: JSON ind og ud, undtagen filuploads (multipart). Send
Content-Type: application/json. - IDs: hvert objekt har en 26 tegn lang
id. Tider er millisekunder siden Unix-epochen (create_at,update_at,delete_at; 0 betyder "ikke slettet"). - Fællesskaber er teams: API'et kalder dem
teams, med etteam_id. - Dig selv: hvor en sti tager et
user_id, betydermeden indloggede bruger, som iGET /users/me.
Den fulde liste over slutpunkter findes i serverens kode: ruterne er deklareret i server/channels/api4/*.go og typerne i server/public/model. OpenAPI-beskrivelsen i lagerets mappe api/v4/source dækker de slutpunkter, der er arvet fra Mattermost, samt nogle af Antimatters tilføjelser: flytning af tråde, modeltilslutninger, agenter, fællesskabsregler, fokustilstand og beskedhandlinger. De øvrige findes kun i koden.
Autentificering
Alle anmodninger, undtagen indlogning og et par offentlige endpoints, kræver et token i Authorization-headeren:
curl -H "Authorization: Bearer $TOKEN" https://chat.example.com/api/v4/users/me
Tre typer tokens accepteres der: personlige adgangstokens, sessionstokens og OAuth-adgangstokens. Authorization: Token … accepteres også. Tokens i query-strengen (?access_token=) accepteres kun for OAuth-adgangstokens.
Personlige adgangstokens (anbefalet til scripts)
Et personligt adgangstoken handler som dig, udløber ikke, medmindre du giver det en udløbsdato, og kan til enhver tid tilbagekaldes. Personlige adgangstokens er deaktiveret som standard:
- En systemadministrator aktiverer Aktivér personlige adgangstokens i Systemkonsol › Integrationer › Integrationshåndtering (
ServiceSettings.EnableUserAccessTokens,AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS). - For hver person, der kan oprette tokens, åbner en systemadministrator Systemkonsol › Brugerstyring › Brugere, vælger Administrer roller i personens menu og markerer Tillad denne konto at generere personlige adgangstokens. Systemadministratorer kan altid oprette dem.
- Personen åbner deres avatar øverst til højre og derefter Profil & indstillinger › Sikkerhed. Under Personlige adgangstokens beskriver de, hvad tokenet skal bruges til, og vælger Opret token. Tokenet vises kun én gang: kopier det.
Med API:et: POST /users/{user_id}/tokens med {"description": "backup script", "expires_at": 0} (expires_at i millisekunder; 0 for ingen). Svarfeltet token er hemmeligheden, og id er det, du bruger til at ophæve det (POST /users/tokens/revoke med {"token_id": "…"}). Fra kommandolinjen: amctl token generate <user> <description>.
En systemadministrator kan begrænse tokens levetid med Maksimal levetid for personlige adgangstokens (dage) på samme side i Systemkonsolen.
Sessionstokens
Når man logger ind med en adgangskode, returneres et sessionstoken i Token-responsheaderen, samme type session som appene bruger:
curl -i -X POST https://chat.example.com/api/v4/users/login \
-H 'Content-Type: application/json' \
-d '{"login_id": "maya", "password": "…"}'
Tilføj "token": "123456" for en konto med multifaktorautentificering. Sessions udløber, som serverens sessionindstillinger angiver, og login-endpointen er ratebegrænset (5 anmodninger pr. sekund). POST /users/logout afslutter sessionen.
X-CSRF-Token-headeren for alt andet end GET; et token i Authorization-headeren kræver ingen CSRF-header.OAuth 2.0-apps
For at lade folk logge ind på din applikation med deres Antimatter-konto, registrerer du en OAuth 2.0-app. Antimatter er derefter OAuth-udbyderen:
- Aktivér OAuth 2.0-tjenesteudbyder skal være slået til (Systemkonsol › Integrationer › Integrationshåndtering,
ServiceSettings.EnableOAuthServiceProvider, slået til som standard). - En person med rettigheder til at administrere OAuth-apps (som standard systemadministratorer) åbner Integrationer › OAuth 2.0-apps (fællesskabsmenu › Teamindstillinger › Integrationer) og tilføjer appen med dens callback-URL'er. De modtager et klient-ID og en klienthemmelighed.
- Din applikation sender brugere til
https://chat.example.com/oauth/authorizemedresponse_type=code,client_id,redirect_uriogstate. PKCE medcode_challenge_method=S256understøttes. - Den bytter koden ud ved
POST https://chat.example.com/oauth/access_token(grant_type=authorization_code, derefterrefresh_tokenfor fornyelse) og kalder API'et medAuthorization: Bearer <access token>.
Brugere kan se de applikationer, de har godkendt, under Profil & indstillinger › Sikkerhed › Apps, du har godkendt.
Hovedressourcer
| Hvad | Endpoints |
|---|---|
| Dig og andre brugere | GET /users/me, GET /users/{user_id}, GET /users/username/{username}, POST /users/ids (en liste over IDs), POST /users/search, GET /users?in_team=…&in_channel=… |
| Fællesskaber | 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 (to bruger-ID'er), POST /channels/group, POST /channels/{channel_id}/members |
| Beskeder (posts) | 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 og files), og derefter indsæt de returnerede IDs i postens file_ids; GET /files/{file_id} |
| Præferencer | GET /users/me/preferences, PUT /users/me/preferences |
| Integrationer | /hooks/incoming, /hooks/outgoing, /commands, /bots, /oauth/apps (se de efterfølgende sider) |
| Server | GET /system/ping (status, ingen token kræves), GET /config/client?format=old (de indstillinger, klienter kan se) |
Send en besked
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"}'
Beskeder er Markdown. Tilføj "root_id" (den første besked i en tråd) for at svare i en tråd, "file_ids" for filer og "props" for vedhæftninger og andre ekstraudgaver (se Vedhæftninger).
Find en kanals ID
curl -H "Authorization: Bearer $TOKEN" \
https://chat.example.com/api/v4/teams/name/lumen-labs/channels/name/ops-alerts
Navnene er dem i kanalens link: /lumen-labs/channels/ops-alerts.
Paginering
Liste-endpoints tager page (fra 0) og per_page (60 som standard, højst 200). Fortsæt med at anmode om den næste side, indtil en side kommer tilbage, der er kortere end per_page.
En kanals beskeder (GET /channels/{channel_id}/posts) kan også tage since (et tidspunkt: alt, der er ændret siden da), eller before og after (et indlægs-ID). De returneres som en liste over indlæg: {"order": [IDs, newest first], "posts": {ID: post}, "next_post_id", "prev_post_id"}.
Fejl
Fejl bruger de almindelige HTTP-statuskoder (400 ugyldig input, 401 ikke logget ind, 403 ikke tilladt, 404 ikke fundet, 501 funktion slået fra) og en JSON-krop:
{
"id": "api.context.permissions.app_error",
"message": "You do not have the appropriate permissions.",
"detailed_error": "",
"request_id": "jz8zm5nunpbt8f3gpqsz5dq6so",
"status_code": 403
}
Brug id i din kode: message oversættes til brugerens sprog. detailed_error er tom, medmindre serveren kører i udvikler-tilstand (ServiceSettings.EnableDeveloper). Angiv request_id til serverens administrator: den findes i logfilerne.
Begrænsning af haster
Begrænsning af haster er slået fra som standard. Når en systemadministrator slår den til (Systemkonsol › Miljø › Begrænsning af haster), får hver klient 10 anmodninger pr. sekund med bursts på 100 som standard, talt pr. IP-adresse eller pr. bruger. Svar indeholder X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset; over grænsen svarer serveren med 429 og et Retry-After-header i sekunder. Nogle endpoints, f.eks. logind, har deres egen grænse uanset indstillingen.
Skriv scripts, der venter og prøver igen ved 429, og undgå polling: følg i stedet WebSocket.
WebSocket-hændelsesstrømmen
Forbind til wss://chat.example.com/api/v4/websocket. Autentificér enten med Authorization: Bearer-headeren i forbindelsesanmodningen, eller ved at sende dette som den første besked:
{"seq": 1, "action": "authentication_challenge", "data": {"token": "…"}}
Serveren sender en hello-hændelse, derefter en hændelse for alt, du har tilladelse til at se:
{
"event": "posted",
"data": {"channel_id": "…", "channel_type": "O", "post": "{\"id\":\"…\",\"message\":\"Hello\",…}"},
"broadcast": {"channel_id": "…", "team_id": "", "user_id": "", "omit_users": null},
"seq": 4
}
Bemærk, at data.post er posten som en JSON-streng. Almindelige hændelser: posted, post_edited, post_deleted, reaction_added, reaction_removed, typing, status_change, user_added, direct_added. Apps sender deres egne hændelser, navngivet custom_<app id>_<event>.
Du kan også sende handlinger, hver med en stigende seq: user_typing med {"channel_id", "parent_id"}, eller get_statuses. Forbind igen, når forbindelsen afbrydes, og hente det, du manglede, med since (se Paginering).
Antimatter tilføjer disse begivenheder: agent_activity_changed og agent_post_stream (se Agenter), ai_tools_changed (se Agenter), community_rules_updated og community_rules_accepted (se Fællesskabsregler), focus_ended (se Fokustilstand), community_attributes_updated, member_timeouts_updated, post_put_on_top, post_removed_from_top, server_categories_updated, channel_overrides_updated og category_overrides_updated. En ny login til din egen konto sender session_created til dine andre sessioner (session_id, create_at, platform, os, browser, mobile; aldrig et token), og håndtering af advarslen sender session_revoked eller session_acknowledged (session_id) til alle dem.
Klientbiblioteker
- Go:
model.Client4iserver/public/model(importérgithub.com/mattermost/mattermost/server/public/model).model.NewAPIv4Client(url), derefterclient.SetToken(token);model.NewWebSocketClient4(wsURL, token)følger begivenhederne. Antimatters kopi tilføjer metoder til dets egne endpoints, såsomUpdateMessageRequest,PutPostOnTopogExportChannel. - TypeScript:
Client4-klassen fra@mattermost/client, iwebapp/platform/client, med typerne iwebapp/platform/types. Kopien i Antimatters repository inkluderer Antimatters endpoints; pakken, der udgives på npm af Mattermost, gør det ikke.
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)
}
Hvad Antimatter tilføjer til API'et
Disse endpoints og felter findes ikke på en Mattermost-server. Alle kræver en session.
| Endpoint | Hvad den gør |
|---|---|
GET /teams/{team_id}/user_attributes/fieldsPOST samme stiPATCH, DELETE …/fields/{field_id} | Fællesskabsattributter: profilfelter, som et fællesskabs administratorer definerer for dets medlemmer (op til 20). Medlemmer kan læse dem; fællesskabsadministratorer opretter og ændrer dem. |
GET /teams/{team_id}/members/{user_id}/user_attributesPATCH samme stiPOST /teams/{team_id}/user_attributes/values/search | Et medlems attributværdier, som {field_id: value}. Medlemmer sætter deres egne (undtagen dem, der administreres af administratorer); administratorer sætter andres. Søgningen tager {"user_ids": [...]} (op til 200). |
GET /teams/{team_id}/timeoutsPUT /teams/{team_id}/members/{user_id}/timeoutGET /teams/{team_id}/members/{user_id}/moderation | Timeouts: {"until": time, "reason": "…"} forhindrer en person i at oprette indlæg, reagere og uploade i fællesskabet indtil da (højst 28 dage); "until": 0 løfter det. Modereringsvisningen viser, hvornår de joined, og hvor meget de har oprettet indlæg for nylig. |
GET /channels/{channel_id}/on_topPUT, DELETE /posts/{post_id}/on_top | Beskeder, der fastgøres øverst i en kanal (op til 10). {"duration": ms}, i højst 30 dage; 0 holder dem, indtil de fjernes. Alle, der kan læse kanalen, kan se dem. For at fastgøre eller fjerne en besked skal man have rettighed til at skrive i kanalen og, i en fællesskabs kanal, være administrator for kanalen eller fællesskabet eller have Administrer beskeder (delete_others_posts) der. I en direkte eller gruppebesked kan medlemmerne det. Afvist i arkiverede kanaler. |
GET, PUT /teams/{team_id}/rulesPOST /teams/{team_id}/rules/acceptGET /teams/{team_id}/rules/stats | Fællesskabsregler: se Fællesskabsregler. |
GET, POST, DELETE /users/me/focusGET /users/me/focus/summary?since=&until=POST /users/me/focus/summary/read | Fokustilstand: se Fokustilstand. |
POST /channels/{channel_id}/message_request | Handler på din egen beskedanmodning: {"action": "accept"}, "dismiss" eller "request" for at lægge en samtale tilbage blandt anmodningerne. Returnerer din kanalmedlem. |
GET, PUT /channels/{channel_id}/overridesGET /channels/{channel_id}/overrides/effectiveGET, PUT /channels/{channel_id}/role_access | Hvad en rolle eller en person må gøre i en kanal, og hvilke roller der kan se en kanal med rolle-beskyttelse. |
GET, PUT /teams/{team_id}/server_categoriesGET, PUT …/server_categories/overrides | Fællesskabets fælles kanal-kategorier og de overrides, der gælder for alle kanaler i en kategori. |
GET /groups/{group_id}/team_rolePUT …/team_role/permissions | De rettigheder, som en fællesskabsrolle giver. |
POST /teams/{team_id}/autolinks/preview | Prøver fællesskabets autolink-regler på en tekst. |
POST /channels/{channel_id}/export?format=csv&since=&until= | Downloader en kanals beskeder som CSV (op til 50.000) for personer, der kan læse kanalen. |
GET /posts/{post_id}/speech | Den besked, der læses højt som lyd, når tekst-til-lyd er konfigureret. |
POST /posts/{post_id}/move_to_channel | Flytter en tråd til en anden kanal i samme fællesskab: se Flyt en tråd. |
GET, POST /ai/connectionsGET, PATCH, DELETE /ai/connections/{connection_id}GET /ai/connections/usable | Model-forbindelser, de AI-udbydere, som serverens AI-funktioner og apps bruger: se Model-forbindelser. |
GET, POST /ai/agentsGET, PATCH, DELETE /ai/agents/{agent_id}POST /ai/agents/{agent_id}/tasksGET /ai/agents/conversations | AI-agenter, deres aktivitet samt opgaver og samtaler i AI-chatten: se Agenter. |
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 | En agents værktøjer, kataloget over værktøjer, den må bruge, bekræftelse eller afvisning af en ventende værktøjskald, og de MCP-servere, der er tilgængelige for agenter: se AI. |
GET /channels/{channel_id}/message_actionsPOST /posts/{post_id}/message_actions/{hook_id}GET, POST /hooks/outgoing/{hook_id}/icon | Besked-handlinger: udgående webhooks, som folk kører fra beskedmenuen. Se Besked-handlinger. |
POST /users/me/sessions/acknowledge | Afviser advarslen om nyt login for en af dine egne sessioner: {"session_id"}. Kun den loggede ind bruger kan kalde dette for deres egne sessioner. |
PUT /channels/{channel_id}/type | Ændrer en kanals forudindstilling eller dens indstillinger: se Kanaltyper. |
GET /channels/{channel_id}/topicsPATCH /posts/{post_id}/topic | Et forums emner, og accept af et svar eller fastsættelse af et emnes status: se Kanaltyper. |
Nye felter
- Fællesskaber (
TeamogPUT /teams/{team_id}/patch):all_channels_membership(alle er med i alle kanaler, de kan se),default_channel_id(hvor nye brugere lander),welcome_channel_id(hvor beskeder om deltagelse og afgang sendes, tom hvis ingen),kind(communityellerworkplace, vist i grænsefladen som Guild og Workspace: en guild slår ogsåall_channels_membershiptil; nye fællesskaber får serverensTeamSettings.DefaultCommunityKind, som som standard ercommunity/Guild),member_list_view(hvordan medlemslisten grupperer medlemmer:choice, som er standarden, lader hvert medlem vælge;rolesellerteamslåser valget),hide_role_colors,require_team_badges,name_display(hvordan fællesskabet viser personer: tom for serverens standard),onboardingogautolinks(begge JSON-strenge). - Standardkanalen i et nyt fællesskab er
general(Generel), ikketown-square. Opgraderingen til 0.9.0 omdøber hvert fællesskabstown-squaretilgeneralog bevarer ID'et, medmindre fællesskabet allerede har engeneral-kanal. Gamle navne virker stadig:GET /teams/{team_id}/channels/name/town-square,GET /teams/name/{team}/channels/name/town-squareog en indgående webhookschannelreturnerer fællesskabets standardkanal, når ingen kanal har det pågældende navn. Brugdefault_channel_ideller navnetgenerali ny kode. - Kanallinks:
#channel-namelinker en kanal, ligesom~channel-namegør. Postenschannel_mentions-prop lister de kanaler, der er linket på den ene eller anden måde; et#word, der ikke navngiver en kanal, forbliver et hashtag. Antimatters webgrænseflade og mobilapp skriver#name. - Arkiverede kanaler kan stadig få nye medlemmer (
POST /channels/{channel_id}/members), som kan læse deres historik. Ingen kan poste, reagere, fastgøre, sætte en besked øverst, omdøbe kanalen eller ændre medlemmernes roller der. - Inline-svar: Et indlæg med
"props": {"reply_to": "<post id>"}citerer den pågældende besked fra samme kanal. Tilføj"reply_to_mention": falsefor ikke at underrette forfatteren. Serveren udfyldermetadata.reply_tomed en kort beskrivelse af den citerede besked. - Spoilers:
"props": {"spoiler": true}skjuler et indlægs tekst og filer, indtil læseren vælger at se dem. - Ignorering og blokering er præferencer: kategori
user_block, navngivet efter den andres ID, med værdienignoreellerblock. Om en direkte besked venter som en anmodning fremgår af din kanalmembersnotify_props.dm_request(pending,acceptedellerdismissed). - Beskedvedhæftninger kan indeholde
stagesog enchart: se Cards. - Kanaler (
Channel):propsfor enhver fællesskabskanal indeholder altidam_type(text,voiceellerforum),am_mode,am_root_posts(membersellermoderators) ogam_preset(den tilsvarende forudindstillingens ID, eller tom for brugerdefinerede indstillinger), og for foraam_forum_view(topicsellerimageboard). En payload udenam_typebetyder, at feltet ikke er udfyldt, aldrig at kanalen er tekst. Direkte beskeder og gruppebeskeder indeholder ingen af disse. Se Kanaltyper.
Kanaltyper
En fællesskabskanal er text, voice eller forum (dens type, fastlagt ved oprettelsen), i en af dens types tilstande, med indstillinger ovenpå. En forudindstilling er en navngivet samling af en tilstand og indstillinger, som en klient tilbyder som ét valg; forudindstillinger gemmes ikke, så en kanals forudindstilling (am_preset) udledes fra dens indstillinger, og læser "", når de ikke matcher nogen forudindstilling ("Brugerdefineret").
| ID for forudindstilling | Type | Tilstand | root_posts | visning |
|---|---|---|---|---|
text_chat | tekst | chat | members | – |
text_announcement | tekst | chat | moderators | – |
voice_talk | tale | talk | members | – |
voice_stage | tale | 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 |
Oprettelse og ændring af en kanals type
POST /channels læser props.am_preset (udvides først), derefter de enkelte props.am_type, am_mode, am_root_posts og am_forum_view ovenpå denne; alle andre am_-egenskaber fjernes. Oprettelse af en lydkanal, når Lydkanaler-appen ikke er aktiv, afvises (400 api.channel.type.voice_unavailable.app_error); oprettelse af en direkte besked eller gruppebesked med typeegenskaber afvises (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 ændrer forudindstillingen eller indstillingerne for en eksisterende kanal: {"preset"?, "mode"?, "root_posts"?, "view"?}, hvor forudindstillingen udvides først som ved oprettelse. Det kræver manage_public_channel_properties eller manage_private_channel_properties i kanalen (revisionshændelse updateChannelType), og svarer med den udfyldte kanal. En body, der navngiver en anden type, afvises (api.channel.type.fixed.app_error): selve typen ændres aldrig. Andre fejl: api.channel.type.invalid.app_error (en ukendt værdi, en tilstand, der ikke er af kanalens type, eller en visning på en ikke-forum).
Masseimport og -eksport (amctl import bulk) bærer de samme fire felter på en kanals linje: am_type, am_mode, am_root_posts, am_forum_view. En kanallinje uden disse importeres som en almindelig tekstbaseret Chat-kanal, som før kanalentyper.
Hvem starter samtaler eller åbner emner
At sende et rodindlæg (i modsætning til et svar) kræver tilladelsen create_root_post, som vises i tilsidesættelseseditoren som Start samtaler (tekst, lyd) eller Åbn emner (fora). Ingen rolle indeholder den: før tilsidesættelser har alle, der må sende beskeder, den, hvor root_posts er members, og kun kanalens moderatorer (systemadministratorer, communityadministratorer, kanaladministratorer og alle med Administrer beskeder der), hvor den er moderators. En rolle- eller personlig tilsidesættelse af create_root_post anvendes derefter ovenpå, som for enhver anden tilladelse. Et svar (root_id angivet) kræver kun den almindelige ret til at sende beskeder.
Et rodindlæg, der ikke opfylder dette, giver 403: app.post.root_posts.moderators_only.app_error, når root_posts er sat til moderators, og afsenderen ikke modererer kanalen, eller app.post.root_posts.denied.app_error ved en overstyrende nægtelse. Dette kontrolleres for REST API, bots, indgående og udgående webhooks (på hookets opretter) og svar på skråstregskommandoer; indlæg fra apps (plugin-API'en) og kopier af flyttede tråde kontrolleres ikke (her kontrolleres i stedet personen, der flytter tråden). Masseimport springer også denne kontrol over.
Forumer accepterer kun emner
I en forum skal et rodindlæg have props.am_thread_title (titlen på dets emne), uden mellemrum i starten eller slutningen, 1 til 100 tegn, fra alle kilder, inklusive apps og flyttede tråde: Manglende titel giver 400 app.post.forum.title_required.app_error, for lang titel giver app.post.forum.title_too_long.app_error. Svar kræver ingen titel, og eventuelle titler sendt med et svar ignoreres. Redigering af et emnes rodindlæg uden titel, eller med en tom titel, beholder den eksisterende titel; en ikke-tom titel omdøber emnet. Flytning af en tråd til et forum (nedenfor) kræver også en titel, enten fra anmodningen eller fra trådens egen.
Det accepterede svar på et Q&A-emne (am_accepted_answer, ID'et på et svar) og statussen for et Ideer-emne (am_topic_status, sammen med am_topic_status_by og am_topic_status_at) kan kun ændres via PATCH /posts/{post_id}/topic; hvis nogen af disse tre felter sendes ved oprettelse, opdatering eller patch, uanset om det kommer fra en klient eller en app, ignoreres de, og den gemte værdi bevares.
Vis en liste over forumets emner
GET /channels/{channel_id}/topics?sort=votes&per_page=25
Kræver rettigheden til at læse kanalen. Forespørgselsparametre:
sort:activity(standard),newest,votes,unanswered(kun Q&A) ellerstatus(kun Ideer).answered(true/false, Q&A) ogstatus(en afopen,planned,in_progress,done,declined, Ideer): filtrer efter disse. Brug af disse uden for den relevante tilstand giver400.mine=true: kun de emner, du har oprettet.following=true: kun de emner, du følger.q: matcher titlen eller teksten i det første indlæg, op til 200 tegn.before:next_cursorfra den forrige side.per_page: 25 som standard, maksimalt 100.replies: 0 til 5 af de seneste svar til hvert emne, for en visning som et opslagstavle.
Svar: {"topics": [{"post", "reply_count", "last_reply_at", "participant_ids", "votes", "accepted_answer_id", "status", "on_top", "replies": [post, …]}], "next_cursor"}. Stemmer er 👍-reaktioner (+1 og thumbsup tæller sammen), fratrukket emnets egen forfatter; accepted_answer_id angives kun i Q&A-forumer, status kun i Ideer-forumer. Emner, der er fastgjort øverst i kanalen, kommer først.
Accepter et svar, eller angiv status for et emne
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 skal være rodindlægget for et forumemne, ellers 400 app.topic.not_a_topic.app_error. accepted_answer_id (et svar-ID, eller "" for at trække det tilbage) kræver et Q&A-forum; status kræver et Ideer-forum; forkert tilstand giver 400 app.topic.mode.app_error.
- Accept af svar: kun emnets spørger (så længe de stadig kan skrive der) eller en kanaladministrator; ellers
403 app.topic.accept.not_allowed.app_error. Svaret skal være et aktivt, ikke-systemsvar til det pågældende emne, ellers400 app.topic.accept.not_a_reply.app_error. Slettes det accepterede svar, fjernes svaret. - Angivelse af status: kun kanaladministratorer, ellers
403 app.topic.status.not_allowed.app_error; en ukendt værdi giver400 app.topic.status.invalid.app_error.
Hver ændring opretter et systemvar i emnet (som fortæller dets følgere) og svarer med emnets rodindlæg, som det ser ud nu. I et Ideer-forum gør afstemning på et emne dig også til følger af det.
Flyt en tråd
POST /posts/{post_id}/move_to_channel flytter en tråd, dens første besked og alle dens svar, til en anden kanal i samme fællesskab. post_id kan være den første besked eller et hvilket 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): den kanal, tråden flyttes til.flatten(standardfalse):truegør svarene til beskeder i målkanalen i stedet for i en tråd. Fusion's Gør til kanal bruger denne indstilling. Afvist, når målet er et forum (400 app.post.move_thread.forum_flatten.app_error): svarene ville blive til emner uden titler.title: emnets titel, når målet er et forum. Uden denne beholdes trådens egen titel, hvis den har en; mangler begge, giver det400 app.post.move_thread.forum_title_required.app_error. Ignoreres, hvis målet ikke er et forum.
Beskederne beholder deres forfattere, tidspunkter, reaktioner og filer. Kopierne bærer silent_notification-egenskaben, så de ikke giver notifikationer til nogen. De oprindelige beskeder slettes. Svarret er den flyttede første besked med dens nye ID.
Hvem kan flytte en tråd
- Du skal kunne læse tråden og skrive i målkanalen.
- Kanalens administratorer, fællesskabets administratorer, personer med Administrer beskeder (
delete_others_posts) i kanalen og systemadministratorer kan flytte enhver tråd. - Trådens forfatter kan flytte den, når begge kanaler er offentlige, eller når alle beskeder i tråden er skrevet af forfatteren. I andre tilfælde er svaret
403med ID'etapi.post.move_thread.private_needs_moderator.app_error. - Begge kanaler skal være i samme fællesskab (ingen direkte eller gruppebeskeder), være forskellige og ikke være arkiveret. Systembeskeder og beskeder, der brændes ved læsning, kan ikke flyttes.
- En tråd, der er længere end
WranglerSettings.MoveThreadMaxCountbeskeder (100 som standard; 0 for ingen grænse), afvises.
Pegeren og noten
Flytningen efterlader to systembeskeder af typen system_wrangler: en peger i den gamle kanal ("En tråd med 13 beskeder er blevet flyttet til #target") og en note i målkanalen ("Denne tråd blev flyttet fra #source"), under den flyttede tråd eller, med flatten, efter dens beskeder. Ud over beskedteksten giver deres egenskaber en klient mulighed for at tegne kanalnavnet som et link:
- Pegeren:
MovedThreadPermalink,NumMessages,MovedThreadChannelId,MovedThreadTeamName,MovedThreadPostIdog, for en offentlig målkanal,MovedThreadChannelNameogMovedThreadChannelDisplayName. - Noten:
MovedFromChannelId,MovedFromTeamName,MovedFromPostId(pegeren),MovedFromPermalinkog, for en offentlig kildekanal,MovedFromChannelNameogMovedFromChannelDisplayName.
Begge har også en TranslationID. Et privat kanals navn udelades: læserne ser "en anden kanal". Mattermosts egen POST /posts/{post_id}/move er slået fra i Antimatter; brug denne endepunkt i stedet.
Fællesskabsregler
Administratorerne for et samfund kan kræve, at dets medlemmer accepterer samfundets regler, før de skriver i kanalerne. Når reglerne er aktiveret, kan et medlem, der ikke har accepteret den nuværende version, ikke skrive, svare, sende filer, planlægge, redigere eller gendanne en besked eller køre en kommando, der skriver i samfundets kanaler: Serveren svarer 403 med ID'et api.post.community_rules_not_accepted, og en planlagt besked, der skal sendes på det tidspunkt, fejler med fejlcode community_rules_not_accepted. Læsning, reaktioner samt direkte beskeder og gruppebeskeder begrænses ikke. Det samme gælder bots, indgående webhooks, systembeskeder og samfundets administratorer (manage_team, som systemadministratorer også har).
| Endpoint | Hvad den gør |
|---|---|
GET /teams/{team_id}/rules | Reglerne (enabled, text i Markdown, version), den seneste version du accepterede (accepted_version) og om du skal acceptere før du kan sende beskeder (must_accept). For medlemmer og for alle, der kan deltage i et åbent fællesskab. |
PUT /teams/{team_id}/rules | Gemmer dem med {"enabled", "text", "ask_again"} (manage_team). ask_again opretter en ny version, som alle skal godkende igen; den første gemning er version 1. Teksten er påkrævet for at aktivere dem, og må højst være 16.000 tegn. |
POST /teams/{team_id}/rules/accept | Aftaler, som medlem, version, du læser; 409, når en nyere version er blevet gemt siden da, og 0 aftaler den nuværende. |
GET /teams/{team_id}/rules/stats | Hvor mange af arbejdsmrådets medlemmer har accepteret den nuværende version (manage_team). |
Hændelsen community_rules_updated sendes til fællesskabet, når en administrator gemmer reglerne (team_id, enabled, version), og community_rules_accepted sendes til den, der accepterede dem, på alle deres sessioner (team_id, version).
Fokustilstand
Fokustilstand er Forstyr ikke med et sluttidspunkt: Notifikationer er sat til lyd af (ingen push-, e-mail-, skrivebords- eller vedvarende notifikationer, inklusive hastige beskeder), årsagen bliver til den brugerdefinerede status med 🎯-emoji (dart), som udløber ved slutningen, og Antimatters apps skjuler personens egne ulæste badges. Kun personen selv kan bruge disse slutpunkter (me eller deres eget ID): Ingen andre, inklusive systemadministratorer, må starte, afslutte eller læse nogens fokus eller dets resumé.
| Endpoint | Hvad den gør |
|---|---|
GET /users/me/focus | Den nuværende fokus (active, start_at, end_at, reason), eller den sidste, når den er afsluttet (ended_at er angivet), eller alle nul. |
POST /users/me/focus | Starter fokus, eller ændrer slutningen og årsagen, mens fokus er aktivt: {"duration": "1h30m", "reason": "…"}, eller {"end_at": ms} i stedet for varigheden, fra et minut til en uge frem. "duration": "tomorrow" slutter kl. 09:00 næste dag i personens tidszone. Slutningen afrundes ned til nærmeste minut; årsagen må højst være 100 tegn. Kræver, at brugerstatus er aktiveret (ServiceSettings.EnableUserStatuses); bots kan ikke fokusere. |
DELETE /users/me/focus | Afslutter fokuseret tilstand nu. |
GET /users/me/focus/summary?since=&until= | Hvad der er gået glip af i det vindue (en fokuserings start_at og ended_at): Kanalerne med ulæste beskeder fra andre (direkte beskeder og gruppebeskeder først, derefter dem med omtaler; kanaler med lyd af kun ved omtale), og, med sammenklappede svartråde, de fulgte tråde med nye svar, hver med dens antal, omtaler og sidste afsender. |
POST /users/me/focus/summary/read | Med {"since", "until"}: markerer kanaler og tråde som læst op til until. Det, der er kommet efter, forbliver ulæst. |
Mens en person er i fokus, har deres bruger egenskaben focus_until (millisekunder), som klienterne bruger til at vise fokusstatus. Den kan ikke ændres gennem profilen. Fokus slutter, når personen selv afslutter det, når tiden er inde (inden for et minut), eller når de vælger en status selv, som derefter bliver stående. Ellers kommer status og tilpasset status fra før tilbage. Alle deres sessioner modtager derefter hændelsen focus_ended med start_at, end_at og ended_by (user, timer eller status).
Modelforbindelser
En modelforbindelse er en AI-udbyders adresse og nøgle, der oprettes af en administrator. Serverens AI-funktioner og de apps, der kalder AI-tjenesten, bruger dem. Systemadministratorer administrerer serverens forbindelser (manage_ai_connections), mens en fællesskabs administratorer administrerer deres fællesskabs egne (manage_team_ai_connections). Nøgler er skrivealene: intet svar indeholder en nøgle, kun api_key_set og api_key_last4.
| Endpoint | Hvad den gør |
|---|---|
GET /ai/connections?scope= | De forbindelser, du administrerer. scope er server eller et fællesskabs ID; uden det, alle områder, du administrerer. |
POST /ai/connections | Tilføjer en forbindelse (svarer 201). |
POST /ai/connections/test, POST /ai/connections/models | Tester en forbindelse eller lister dens modeller, før den gemmes. Samme body som ved tilføjelse; intet gemmes. |
GET, PATCH (eller PUT), DELETE /ai/connections/{connection_id} | Læser, ændrer eller sletter en forbindelse. En patch indeholder kun de felter, der skal ændres; udelad api_key for at beholde nøglen. |
POST /ai/connections/{connection_id}/test | Tester en gemt forbindelse: {"ok", "error", "status_code", "latency_ms", "model_count"}. |
GET /ai/connections/{connection_id}/models | De modeller, udbyderen tilbyder. |
GET /ai/connections/{connection_id}/usage | Anmodninger og tokens i denne måned. |
GET /ai/connections/usable?channel_id=&team_id= | For alle, der er logget ind: de forbindelser, du må bruge der, med deres modeller og funktioner, aldrig deres nøgler eller adresser. |
Bodyen for en ny forbindelse:
{
"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 er openai_compatible eller anthropic. scope er standard server; et fællesskabs ID gør det til det fællesskabs forbindelse. I limits betyder 0 ingen grænse; anmodninger pr. minut tæller på hver server, token-budgetter pr. kalendermåned (UTC) for hele clusteret. sharing angiver, hvilke fællesskaber der må bruge en serverbred forbindelse (direkte og gruppebeskeder kræver all_teams), og audience hvem der må bruge den; gæster kun med allow_guests. Ændringer skrives til auditloggen. Administrationsguiden forklarer indstillingerne: se AI.
Agenter
En agent er en bot-konto af typen agent (is_agent på dens bruger) med dens indstillinger: dens omfang (server eller et arbejdsområdes ID), om den er indbygget eller external, og for en indbygget agent dens modelforbindelse, model, systemprompt og ræsonnement. Systemadministratorer administrerer serverdækkende agenter (manage_system), mens arbejdsområdets administratorer administrerer deres arbejdsområdes agenter (manage_team). Derudover kan manage_own_agent administrere en agent, de selv har oprettet, og manage_others_agent administrere de øvrige. Agentens ID i disse stier er dens bruger-ID. Kørsel af en ekstern agent, og hvordan status for en indbygget agent sættes, forklares i Bots. PUT /users/{user_id}/status og endpoints for brugerdefineret status afviser ID'et for en indbygget agent, også for systemadministratorer (403, api.status.agent.app_error).
| Endpoint | Hvad den gør |
|---|---|
GET /ai/agents?scope= | De agenter, du administrerer: scope er server eller et fællesskabs-ID. Uden denne parameter administrerer du alle agenter. |
POST /ai/agents | Opretter en agent og dens konto (svarer med 201). En agents tilhørsforhold til et fællesskab oprettes, når agenten oprettes. |
GET, PATCH, DELETE /ai/agents/{agent_id}POST …/enable, POST …/disable | Læser, ændrer og sletter (kontoen deaktiveres, men beskederne bevares), samt aktiverer eller deaktiverer en agent. |
GET /ai/agents/connections?scope=GET /ai/agents/connections/{connection_id}/models | De modelforbindelser, som en agent med dette omfang kan bruge, og deres modeller. |
GET, PUT /ai/agents/{agent_id}/activityPOST /ai/agents/activity/ids | Hvad en agent gør; angives af dens egen token eller af dens administratorer. Massen kan indeholde op til 200 bruger-ID'er. |
POST /ai/agents/{agent_id}/tasks | Spørger en indbygget agent, du kan bruge til en opgave: summarize_thread, find_action_items eller find_open_questions (på en tråds post_id, eller et channel_id fra since og frem), summarize_channel, ask_channel (med et question) eller summarize_transcription (en transkription af et opkald). Forespørgslen bliver til din besked i den direkte besked med agenten, på dit sprog, og besvares der; svaret (201) er denne besked. En besked eller kanal, du ikke kan læse, besvares som om den ikke findes. |
GET /ai/agents/conversations?agent_id=&before=&per_page= | Dine samtaler med de agenter, du kan bruge, med de seneste først: de tråde, du startede i dine direkte beskeder med dem, og de tråde andre steder, hvor en af dem svarede, og som du følger. before (et tidspunkt) giver den næste side; per_page er højst 100. |
Indholdet af en ny agent:
{
"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}
}
En tom model bruger forbindelsens chatmodel. access.channel_ids betyder medlemmerne af disse kanaler. En ekstern agent har ingen forbindelse, model eller systemprompt. GET /agents viser en liste over de agenter, du kan tale med, som AI-chatappen læser dem.