Webhooks
En indgående webhook giver et andet system mulighed for at poste i en kanal ved at sende JSON til en hemmelig URL. En udgående webhook gør det modsatte: den sender beskeder til din URL, enten dem der starter med et triggerord, eller dem som folk vælger i beskedmenuen, og poster det, du svarer med.
Hvor du administrerer webhooks
Åbn fællesskabsmenuen, vælg Teamindstillinger, og klik på Integrationer i slutningen af fanerne. Integrationsiderne for det aktuelle fællesskab viser Indgående webhooks og Udgående webhooks. Hver webhook tilhører ét fællesskab.
Som standard kan fællesskabsadministratorer og systemadministratorer oprette webhooks. En systemadministrator kan give andre roller denne rettighed i rettighedsindstillingerne i Systemkonsol. En systemadministrator kan også slå hver type fra i Systemkonsol › Integrationer › Integrationshåndtering: Aktivér indgående Webhooks og Aktivér udgående webhooks er begge aktiveret som standard.

Opret en indgående webhook
- Vælg Indgående webhooks i Integrationer, og vælg derefter Tilføj indgående webhook.
- Udfyld en Titel og en Beskrivelse: De vises kun på integrations siderne.
- Vælg den Kanal, beskederne sendes til som standard. For en privat kanal skal du være medlem af den.
- Marker Lås til denne kanal, hvis afsendere ikke skal kunne poste andre steder.
- Vælg evt. et Brugernavn og en Profilbillede-URL til dets beskeder (se Navn og ikon).
- Vælg Gem. Kopiér den viste URL:
https://chat.example.com/hooks/<key>.
Med API'et: POST /api/v4/hooks/incoming med {"channel_id", "display_name", "description", "username", "icon_url", "channel_locked"}; svarets id er nøglen. Fra kommandolinjen: amctl webhook create-incoming --channel <channel id> --user <user> --display-name "CI".
Send en besked til en indgående webhook
curl -X POST https://chat.example.com/hooks/xgh5ycrx1jf7mbs9w8z4c8e7ho \
-H 'Content-Type: application/json' \
-d '{"text": "Deploy of **api 2.4.0** finished :white_check_mark:"}'
Serveren svarer med 200 og kroppen ok. Den accepterer også application/x-www-form-urlencoded med JSON i et payload-felt, ligesom Slacks webhooks, så værktøjer lavet til Slack normalt virker uden ændringer.
| Felt | Betydning |
|---|---|
text | Beskeden i Markdown. Kræves, medmindre der er attachments. En tekst, der er længere end serverens grænse for beskedlængde, opdeles i flere beskeder. |
channel | En anden kanal i webhook’ets fællesskab, angivet med navn (ops-alerts eller #ops-alerts), eller @username for en direkte besked fra webhook’ets ejer. Afvises, hvis webhook’et er låst til sin kanal. Det gamle navn town-square når stadig fællesskabets standardkanal, der nu hedder general. |
username, icon_url, icon_emoji | Navnet og billedet, der skal vises, når serveren tillader overskrivninger. |
attachments | Vedhæftninger til beskeden, vist som kort (nedenfor). |
props | Ekstra egenskaber gemt på beskeden, som apps kan læse. For at poste i en forumkanal skal props.am_thread_title angives (1 til 100 tegn): Hooken afvises uden denne (se Forums take only topics). |
type | En brugerdefineret beskedtype, f.eks. custom_poll, til en app, der tegner den. Typer, der starter med system_, afvises. |
root_id | ID'et på en tråds første besked, for at svare i den pågældende tråd. |
priority | Beskedens prioritet, f.eks. {"priority": "urgent"}. |
silent | true sender beskeden uden push-notifikationer. |
Hver besked, en webhook poster, bærer et BOT-mærke ved siden af navnet, selv når den vises under opretters navn, så folk kan skelne den fra en besked fra en rigtig person. Webhook-beskeder udløser aldrig udgående webhooks.
Navn og ikon
En webhook poster som den person, der oprettede den, medmindre serveren tillader overskrivninger. To indstillinger i Systemkonsol › Integrationer › Integrationshåndtering, begge slået fra som standard, ændrer dette:
- Aktivér integrationer, der kan overskrive brugernavne (
ServiceSettings.EnablePostUsernameOverride): webhooken Brugernavn eller anmodningensusernamevises i stedet; hvis ingen af dem er angivet, er navnetwebhook. - Aktivér, at integrations kan overskrive profilbilleder (
ServiceSettings.EnablePostIconOverride): Webhook'ets Profilbillede, eller anmodningensicon_urlellericon_emoji, vises.
En værdi i anmodningen har forrang over den gemte på webhook'et.
Vedhæftninger
Vedhæftninger tilføjer struktureret indhold under teksten. De følger Slacks format for beskedvedhæftninger:
{
"text": "Build failed on `main`",
"attachments": [{
"fallback": "main #1902 failed",
"color": "#d24b4e",
"author_name": "GitHub Actions",
"author_icon": "https://chat.example.com/static/ci.png",
"title": "main #1902 failed",
"title_link": "https://ci.example.com/runs/1902",
"text": "Commit `0f4d8e2` by Jonas Weber",
"fields": [
{"title": "Branch", "value": "zephyr-3.7", "short": true},
{"title": "Duration", "value": "3m 40s", "short": true}
],
"footer": "Lumen CI",
"ts": 1760000000
}]
}
| Felt | Betydning |
|---|---|
fallback | Ren tekst til steder, der ikke kan vise kortet, f.eks. notifikationer. |
color | Farvestriben: en hex-farve, eller good, warning, danger. |
pretext | Tekst over kortet. |
author_name, author_link, author_icon | En lille overskriftslinje. |
title, title_link | Kortets titel, valgfrit med et link. |
text | Kortets brødtekst, i Markdown. |
fields | En liste af {"title", "value", "short"}; short-felter vises side om side. |
image_url, thumb_url | Et stort billede nederst, eller et lille billede til siden. |
footer, footer_icon, ts | En fodlinje og et tidspunkt (Unix-sekunder). |
actions | Knapper og menuer: se Interaktive beskeder. |
Kort: faser og diagrammer
Antimatter tilføjer to felter til vedhæftninger, som vises af standardgrænsefladen:
stages: Trin i en pipeline som piller, op til 20. Hvert trin er{"name", "status"}, hvor status kan værepassed,failed,running,pending,skippedellercanceled.chart: et lille linjediagram over seneste værdier,{"values": [2 to 200 numbers], "threshold": number, "label": "…"}. Tærsklen tegnes som en streglinje, for en alarms grænse.
{
"attachments": [{
"color": "danger",
"title": "main #1902 failed",
"stages": [
{"name": "build", "status": "failed"},
{"name": "unit", "status": "skipped"},
{"name": "publish", "status": "skipped"}
]
}, {
"color": "warning",
"title": "API latency above 400 ms",
"chart": {"values": [210, 230, 260, 390, 450, 470], "threshold": 400, "label": "p95 latency, ms"}
}]
}
Den klassiske grænseflade og andre klienter ignorerer disse to felter, så sørg for også at inkludere de vigtigste oplysninger i text eller fields.
Opret en udgående webhook
En udgående webhook overvåger fællesskabets offentlige kanaler. Den sender en besked til din URL, enten når beskedens første ord matcher ét af dens triggerord, eller når nogen vælger den i beskedens menu (en beskedhandling).
- Vælg Udgående webhooks i Integrationer, og vælg derefter Tilføj udgående webhook.
- Udfyld Titel og Beskrivelse.
- Vælg Indholdstype for anmodningen:
application/x-www-form-urlencodedellerapplication/json. - Vælg en Kanal, indtast Udløsende ord (ét pr. linje), eller begge dele. Med en kanal og ingen udløsende ord sendes alle beskeder i den kanal. Med begge dele skal beskeden matche begge.
- Under Udløses ved vælger du Første ord matcher et triggerord præcist, Første ord starter med et triggerord eller Fra beskedmenuen. Med Fra beskedmenuen forsvinder triggerordene, Kanal er valgfri (uden en kan handlingen tilbydes i alle offentlige kanaler i fællesskabet), og Titel er obligatorisk: det er handlingens navn i menuen.
- Indtast Callback-URL’er (én pr. linje). Hver URL modtager alle matchende beskeder.
- Vælg evt. Brugernavn og Profilbillede, der bruges til svar. For en handling fra beskedmenuen erstatter Ikone-feltet Profilbillede: URL'en til et .png- eller .jpg-billede eller, i Antimatters standardgrænseflade, et uploadet billede. Menuen viser det i grå; uden et får handlingen et neutralt ikon.
- Vælg Gem og kopier den viste token. Din service bruger den til at verificere, at anmodninger kommer fra din server.
Med API: POST /api/v4/hooks/outgoing med {"team_id", "channel_id", "trigger_words", "trigger_when", "callback_urls", "content_type", "display_name"} (trigger_when: 0 for en eksakt match, 1 for "starter med", 2 for "fra beskedmenuen"). En webhook med trigger_when 2 tager ingen udløsende ord og kræver et display_name. Upload dens ikon med POST /api/v4/hooks/outgoing/{hook_id}/icon (multipart, felt image: PNG, JPEG eller GIF, gemt som en 128 px PNG); dens icon_url peger derefter på GET /api/v4/hooks/outgoing/{hook_id}/icon.

ServiceSettings.AllowedUntrustedInternalConnections). Serveren ellers ikke kalder private adresser.Den udgående anmodning
Antimatter sender en POST med disse felter, som JSON eller formular-kodet afhængigt af indholdstypen:
{
"token": "6kd1ofo5ojr5zgu5ipfipybgnc",
"team_id": "…",
"team_domain": "lumen-labs",
"channel_id": "…",
"channel_name": "ops-alerts",
"timestamp": 1760010000000,
"user_id": "…",
"user_name": "priya",
"post_id": "…",
"text": "deploy api 2.4.0",
"trigger_word": "deploy",
"file_ids": ""
}
Sammenlign token med webhook'ets token, før du gør noget. I den formkodede version er timestamp i sekunder i stedet for millisekunder. Serveren venter på dit svar i den tid, som Integration anmodning timeout tillader (30 sekunder som standard, ServiceSettings.OutgoingIntegrationRequestsTimeout).
Svar på en outgoing webhook
For at sende et svar, svar med JSON. For ikke at sende noget, svar med et tomt body.
{
"text": "Deploying **api 2.4.0** to staging…",
"response_type": "comment",
"username": "deploy-bot",
"icon_url": "https://chat.example.com/static/deploy.png"
}
textogattachments: svaret. Uden begge dele, sendes der intet.response_type:commentsender svaret i tråden for den udløsende besked; ellers sendes det til kanalen.username,icon_url: vises, når serveren tillader overrides; webhook'ens egne værdier bruges ellers.props,type,priority: som for incoming webhooks.
Svaret sendes som webhook'ens opretter, under det overstyrede navn, hvis der er ét. For alt længere end et hurtigt svar, svar straks og send senere med en incoming webhook eller API'et.
Beskedhandlinger
En beskedhandling er en udgående webhook med Udløses ved sat til Fra beskedmenuen. Den udløses aldrig på postede beskeder. I stedet ser folk den i en beskedmenu: Beskedhandlinger (⋯) › Flere handlinger, under overskriften Integrationer, med dens ikon. Det klassiske grænseflade viser ikke beskedhandlinger. Når den vælges, sendes den pågældende besked til callback-URL'erne, og en kort notifikation viser Sendt til handlingens navn, eller viser din ephemeral_text.
- Hvor den vises: i webhook'ens kanal, eller, uden en kanal, i alle offentlige kanaler i dens fællesskab. Kun offentlige kanaler har beskedhandlinger.
- Gæster får kun de handlinger, der er bundet til en kanal, de er i, ikke de fællesskabsomfattende.
- Arkiverede og skrivebeskyttede kanaler: beskeden kan stadig sendes. Når en kanal arkiveres, slettes de webhooks, der er bundet til den, så en arkiveret kanal beholder kun de fællesskabsomfattende handlinger. Et svar, som personen ikke kunne poste der, vises kun for vedkommende.
- Hastighedsbegrænsning: hver person kan køre 10 beskedhandlinger pr. minut, efter en burst på 5. Over dette svarer serveren med
429. - Private netværk: som for andre udgående webhooks, skal interne adresser tillades i Tillad upålidelige interne forbindelser til.
Anmodningen
Betalelasten sendes som JSON eller formular-koderet, som webhook'ens indholdstype angiver:
{
"token": "6kd1ofo5ojr5zgu5ipfipybgnc",
"trigger": "message_action",
"team_id": "…",
"team_domain": "lumen-labs",
"channel_id": "…",
"channel_name": "ops-alerts",
"timestamp": 1760010000000,
"user_id": "…",
"user_name": "priya",
"post_id": "…",
"post_root_id": "",
"post_create_at": 1760009000000,
"post_user_id": "…",
"post_user_name": "jonas",
"permalink": "https://chat.example.com/lumen-labs/pl/…",
"text": "The staging database is full again",
"files": [{"id": "…", "name": "df.txt", "link": "https://chat.example.com/api/v4/files/…"}],
"priority": "",
"requested_ack": false,
"burn_on_read": false
}
user_idoguser_nameer den person, der valgte handlingen;post_user_idogpost_user_nameer beskedens forfatter.- Kun den pågældende besked sendes, aldrig resten af dens tråd.
filesviser beskedens filer kun, hvis den person, der valgte handlingen, kan downloade dem. Download af enlinkkræver en session eller en token, som for enhver fil i API'et.- En besked, der brændes ved læsning, sendes uden tekst og filer, med
burn_on_readsat tiltrue. - Ved form-encoding kommer filerne som gentagne
file_id,file_nameogfile_link-felter i samme rækkefølge.
Svaret
Svar som for enhver udgående webhook (se Svar på en udgående webhook): text eller attachments poster et svar i kanalen, og "response_type": "comment" poster det i beskeden's tråd. Du kan også svare med ephemeral_text (afkortet til 300 tegn): det vises kun for den person, der valgte handlingen, i notifikationen. Et tomt svarposter ingenting.
{"ephemeral_text": "Ticket OPS-412 created"}
Med API'et
GET /api/v4/channels/{channel_id}/message_actions: de handlinger, du kan vælge i en kanal, medid,display_name,descriptionogicon_url. Hverken tokens eller callback-URL'er returneres.POST /api/v4/posts/{post_id}/message_actions/{hook_id}: udfører en handling på en besked, du kan læse. Den svarer med{"ephemeral_text"}.
Når en webhook ikke virker
- 501 fra hook URL: incoming webhooks er slået fra på serveren.
- 400 "Failed to decode the payload…": JSON er ugyldig, eller form-feltet hedder ikke
payload. "No text specified." betyder, at anmodningen hverken hartextellerattachments. - 403: webhook'ens er låst til en anden kanal, eller dens ejer kan ikke længere læse kanalen.
- En udgående webhook udløses aldrig: kanalen er privat, udløseren er ikke det første ord, beskeden kom fra en webhook, eller webhook'en er indstillet til at udløses Fra beskedmenuen.
- En beskedhandling er ikke i menuen: kanalen er privat, handlingen er bundet til en anden kanal, personen er en gæst, og handlingen har ingen kanal, eller udgående webhooks er slået fra.
- 404 ved udførelse af en beskedhandling: handlingen findes ikke, eller den dækker ikke beskeden's kanal for den pågældende person. 429: personen udførte mere end 10 handlinger på et minut. 502: ingen af callback-URL'erne kunne nås (loggen indeholder årsagen).
- Et opslag i et forum afvises: Hookens besked skal have en titel (
props.am_thread_title); fejlen angiver årsagen, f.eks.app.post.forum.title_required.app_error, i stedet for en generel fejlbesked (se Channel types). - Logs: med Aktivér webhook-fejlafsløring slået til (
LogSettings.EnableWebhookDebugging) og logniveauet sat tilDEBUG, logger serveren payloads for mislykkede indgående anmodninger. Mislykkede udgående opkald logges somOutgoing Webhook POST failed.