Webhooks & Integraties
Bouw bots, automatiseringen en integraties met mssgs webhooks en triggers
Botberichten
Rijke embed-kaarten, interactieve knoppen en live-bijgewerkte berichten voor bots.
Release notes
Nieuwe functies en fixes in elke mssgs-release.
Aan de slag
Met mssgs webhooks kun je berichten naar kanalen sturen en interactieve bots bouwen die reageren op commando's.
Maak een webhook aan
Ga naar Serverinstellingen > Integraties en maak een nieuwe webhook of trigger aan.
Kopieer de URL
Kopieer de webhook-URL of trigger-GUID voor je integratie.
Begin met bouwen
Stuur JSON payloads naar de webhook-URL om berichten te plaatsen.
Twee manieren om te integreren
Incoming Webhooks: Stuur berichten naar mssgs vanuit externe tools (CI/CD, monitoring, etc.)
Webhook Triggers: Bouw interactieve bots die reageren op commando's en knopkliks.
Incoming Webhooks
Stuur berichten naar een kanaal via een webhook-URL. Ideaal voor CI/CD-notificaties, monitoring-alerts en andere automatiseringen.
/api/v1/webhook/:server_guid/:channel_guid
Request structuur
Stuur een POST request met je bericht payload als JSON body naar de webhook-URL. Genereer de URL in de app via Beheer server → Webhooks; de URL zelf authenticeert het verzoek, dus je stuurt geen token mee in de body.
{
"content": "Hello from my integration!",
"color": "green",
"title": "My Bot"
}
Simple Format
De eenvoudigste manier om een bericht te versturen.
{
"content": "Server backup completed at 03:00 UTC",
"color": "green",
"title": "Backup Bot"
}
| Field | Type | Beschrijving |
|---|---|---|
content |
string | Berichttekst required |
color |
string | blue, green, orange, red, yellow, purple |
title |
string | Titel boven het bericht |
title_url |
string | Maakt de titel een klikbare link |
sub_title |
string | Kleinere tekst onder de titel |
avatar_url |
string | Avatar afbeeldings-URL |
Full Format (message_container)
Voor meer controle over het bericht, gebruik het volledige message_container object.
{
"message_container": {
"type": "embed_message",
"color": "blue",
"title": "Order Update",
"description": "Your order #12345 has been shipped!",
"title_url": "https://example.com/orders/12345",
"sub_title": "Estimated delivery: Tomorrow",
"bot_name": "Order Bot",
"fields": [
{ "field": "Status", "value": "Shipped" },
{ "field": "Tracking", "value": "ABC123456" }
]
},
"actions": [...]
}
| Field | Type | Beschrijving |
|---|---|---|
type |
string | embed_message (standaard) of system_message |
color |
string | Accentkleur van het bericht |
title |
string | Titel van het bericht |
description |
string | Hoofdtekst required |
title_url |
string | Link achter de titel |
sub_title |
string | Ondertiteltekst |
bot_name |
string | Aangepaste botnaam |
avatar_url |
string | Avatar afbeelding |
fields |
array | Sleutel-waarde velden |
Fields
Voeg gestructureerde sleutel-waarde data toe aan je bericht.
{
"fields": [
{ "field": "Status", "value": "Completed" },
{ "field": "Duration", "value": "2m 34s" },
{ "field": "Environment", "value": "Production" }
]
}
Bouw je embed
Bewerk de velden of de JSON payload. Beide blijven in sync. Zie het bericht renderen precies zoals in een kanaal. Dit is de echte webhook body; kopieer hem als het goed staat.
Webhook Triggers
Met webhook triggers kun je externe services koppelen aan je server. Wanneer een gebruiker een bijpassend commando typt (bijv. /help) of op een action button klikt, stuurt de backend een POST naar je webhook-URL. Je webhook antwoordt met JSON om een bericht terug te sturen naar het kanaal.
Gebruiker typt een commando
Een gebruiker stuurt een bericht dat begint met het prefix van je trigger, bijv. /help
mssgs roept je webhook aan
De backend stuurt een POST-request naar je geconfigureerde webhook-URL met de berichtgegevens.
Je antwoordt met JSON
Je server retourneert een JSON-response met de berichtinhoud, embeds en actions.
Bericht verschijnt in het kanaal
mssgs toont de response als een bericht in het kanaal.
Request die je webhook ontvangt
Wanneer een gebruiker een bericht stuurt dat begint met het trigger_match prefix van je trigger:
{your_webhook_url}
{
"server_guid": "abc12345-...",
"channel_guid": "def67890-...",
"trigger_match": "/help",
"message": {
"id": "d01ZZdef6-xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx",
"content": "/help how do I create a channel?",
"member_guid": "member-guid-here",
"user_guid": "user-guid-here",
"cms": 1234567890123,
"group_guids": ["group-guid-1", "group-guid-2"]
},
"callback_url": "https://mss.gs/api/v1/trigger-callback/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"stream_url": "https://mss.gs/api/v1/instant/6b1e...c0?token=a1b2c3d4-..."
}
Request via Action Button
Wanneer getriggerd via een trigger:{guid} action button, is de content altijd "[Action Triggered]" en bevat het de payload van de action:
{
"server_guid": "abc12345-...",
"channel_guid": "def67890-...",
"trigger_match": "/help",
"message": {
"id": "d01ZZdef6-xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx",
"content": "[Action Triggered]",
"member_guid": "member-guid-here",
"user_guid": "user-guid-here",
"cms": 1234567890123,
"group_guids": ["group-guid-1", "group-guid-2"],
"is_action_button": true,
"action_payload": {
"custom_key": "custom_value"
}
},
"callback_url": "https://mss.gs/api/v1/trigger-callback/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"stream_url": "https://mss.gs/api/v1/instant/6b1e...c0?token=a1b2c3d4-..."
}
Request Velden
| Field | Type | Beschrijving |
|---|---|---|
server_guid |
string | De server waar de trigger is afgevuurd |
channel_guid |
string | Het kanaal waar het bericht is verstuurd |
trigger_match |
string | Het prefix dat overeenkomt (bijv. /help) |
message |
object | Het bericht dat de webhook heeft getriggerd. Bij action-button triggers is dit een synthetisch "[Action Triggered]"-bericht, niet het bericht waar de knop op stond |
message.id |
string | Uniek bericht-ID. Bij action-button triggers wordt het vers gegenereerd voor het synthetische bericht — het is niet het ID van het bericht waar de knop op stond (dat ID bereikt de webhook-body nooit) |
message.content |
string | Volledige berichttekst (command match) of "[Action Triggered]" (action button) |
message.member_guid |
string | Het serverlid dat de trigger heeft afgevuurd |
message.user_guid |
string | De globale GUID van de gebruiker |
message.group_guids |
array | De servergroep-GUID's waar het lid bij hoort (gebruik om rollen zoals admin te controleren) |
message.cms |
number | Tijdstempel in milliseconden |
message.is_action_button |
boolean | true wanneer getriggerd via een action button (niet aanwezig bij command matches) |
message.action_payload |
object | Aangepaste data van de action button (alleen aanwezig bij action triggers) |
callback_url |
string | Unieke URL om het antwoordbericht bij te werken of te verwijderen (geldig voor 30 minuten) |
stream_url |
string | Unieke instant SSE-stream voor live interacties (replies, reacties, knopdrukken) met je antwoordbericht. Open hem om te luisteren; geldig voor 10 minuten |
Response Format
Je webhook moet antwoorden met een 200 status en een JSON body. De response wordt een bericht in het kanaal.
Simpele response
{
"content": "Hello! How can I help you?"
}
Embed response
{
"message_container": {
"type": "embed_message",
"color": "blue",
"title": "Help",
"description": "Here's how to create a channel...",
"title_url": "https://docs.example.com/channels",
"sub_title": "Channel Guide",
"avatar_url": "https://example.com/bot-avatar.png"
}
}
Volledige response met actions
{
"content": "Here's what I found:",
"message_container": {
"type": "embed_message",
"color": "green",
"title": "Search Results",
"description": "Found 3 matching items.",
"title_url": "https://example.com/results",
"sub_title": "Query: channels",
"avatar_url": "https://example.com/bot-avatar.png"
},
"actions": [
{
"type": "button",
"text": "View Details",
"color": "blue",
"triggers": [
{
"action": "ws:send",
"payload": {
"method": "USER_REQUESTED_TRIGGER",
"server_guid": "server-guid",
"channel_guid": "channel-guid",
"trigger_guid": "details-trigger-guid",
"action": { "result_id": "42" }
}
}
]
},
{
"text": "Open Docs",
"type": "url:https://docs.example.com"
}
]
}
Response Velden
| Field | Type | Beschrijving |
|---|---|---|
content |
string | Platte tekst berichtinhoud |
message_container |
object | Rijke embed/systeembericht weergave |
message_container.type |
string | embed_message (standaard) of system_message |
message_container.color |
string | blue, green, orange, red (standaard: blue) |
message_container.title |
string | Embed titel |
message_container.description |
string | Embed inhoudstekst |
message_container.title_url |
string | Maakt de titel een klikbare link |
message_container.sub_title |
string | Kleinere tekst onder de titel |
message_container.avatar_url |
string | Avatar afbeeldings-URL naast de embed |
actions |
array | Action buttons (zie Actions) |
Minstens een van content, message_container of actions moet aanwezig zijn; anders wordt er geen bericht aangemaakt.
De berichtauteur is de post_app_name van je trigger (geconfigureerd in serverinstellingen). Als deze niet is ingesteld, wordt de servernaam gebruikt.
Timeout
Je webhook moet binnen 5 seconden antwoorden. Bij een timeout wordt een foutmelding getoond aan de gebruiker. Gebruik de callback URL als je meer verwerkingstijd nodig hebt.
Actions
Actions zijn interactieve knoppen die onder je bericht worden weergegeven. Er zijn drie soorten: url:{url} (open een link), trigger:{guid} (vuur een echte webhook trigger af) en webhook_action (server-gestuurde effecten; aanbevolen voor interactieve knoppen).
Action Velden
| Field | Type | Beschrijving |
|---|---|---|
type |
string | "webhook_action" (server-gestuurd), of shorthand "trigger:{guid}" / "url:{url}" required |
text |
string | Knoptekst (accepteert ook label) required |
color |
string | green, blue, purple (primair) of red, orange, yellow (secundair) |
id |
string | Voor webhook_action: stabiele knop-id, wordt bij een druk teruggestuurd zodat de backend weet welke knop is ingedrukt |
payload |
object | Data die wordt teruggestuurd bij een druk (trigger:{guid} en webhook_action) |
triggers |
array | Server-side effect-stappen die draaien wanneer een webhook_action-knop wordt ingedrukt |
Simple Shorthands
Voor eenvoudige actions, gebruik de type shorthand:
| Type | Beschrijving |
|---|---|
trigger:{guid} |
Vuurt een andere webhook trigger af op basis van GUID. De trigger ontvangt message.action_payload met de payload van de action. |
url:{url} |
Opent de URL in de browser van de gebruiker |
{
"actions": [
{
"text": "Check Status",
"type": "trigger:abc123-trigger-guid",
"payload": { "order_id": "12345" }
},
{
"text": "View Order",
"type": "url:https://example.com/orders/12345"
}
]
}
Wat gebeurt er wanneer een action wordt geklikt?
Wanneer de gebruiker op "Check Status" klikt, ontvangt de webhook van de doeltrigger een nieuw request met message.content ingesteld op "[Action Triggered]", message.is_action_button ingesteld op true, en message.action_payload ingesteld op { "order_id": "12345" }.
Interactieve knoppen (server-gestuurd)
Een webhook_action-knop wordt door de backend afgehandeld; geen echte trigger nodig. Bij een druk stuurt de client een WEBHOOK_MESSAGE_ACTION-commando met het bericht-id, de id van de knop en de payload. De backend geeft de druk vervolgens door aan de instant SSE-stream van het bericht (als een apparaat luistert), draait de server-side triggers-stappen van de knop, en broadcast het resultaat naar iedereen in het kanaal. Omdat die stappen uit het opgeslagen bericht worden gelezen (nooit van de client), kan een lid alleen uitvoeren wat jij hebt gedefinieerd.
Server-side trigger-stappen
De triggers-array van een knop bevat de effect-stappen die bij een druk draaien, op volgorde. Ze draaien op de backend en broadcasten naar iedereen in het kanaal:
| action | Effect (broadcast naar iedereen) | Velden |
|---|---|---|
update_message |
Vervang de container / knoppen; tekst aanpassen, knoppen herkleuren of vervangen, knoppen verwijderen (actions: []), of de afbeelding wisselen |
message_container, actions, content |
remove_message |
Verwijder het bericht | Geen |
add_reaction |
Voeg een reactie toe, als het drukkende lid | emoji |
add_reply |
Plaats een reply, als het drukkende lid | content |
Stappen draaien op volgorde en zijn best-effort; een mislukte stap wordt gelogd en de rest draait alsnog. Om een echte trigger af te vuren, gebruik de trigger:{guid}-shorthand, niet triggers.
Voorbeeld: zelf-updatende "Open Gate"-knop
Iedereen krijgt directe broadcast-feedback van de server-side stappen; het edge-apparaat zet de definitieve status via de callback-URL zodra de poort fysiek opent.
{
"message_container": { "color": "yellow", "title": "Front Door", "description": "Doorbell rang" },
"actions": [
{
"type": "webhook_action",
"id": "open_gate",
"text": "Open Gate",
"color": "green",
"payload": { "btn": "open_gate" },
"triggers": [
{
"action": "update_message",
"message_container": { "color": "blue", "title": "Front Door", "description": "Opening..." },
"actions": [ { "type": "webhook_action", "id": "opening", "text": "Opening...", "color": "blue" } ]
},
{ "action": "add_reaction", "emoji": ":white_check_mark:" }
]
}
]
}
Wat gebeurt er wanneer "Open Gate" wordt ingedrukt
1. Iedereen ziet de knop veranderen in "Opening..." en een vinkje-reactie verschijnen; de server-side stappen, gebroadcast door de backend (niet alleen de drukker).
2. Je edge-apparaat dat op de instant stream luistert ontvangt de druk, opent de poort, en doet dan een PUT op de callback_url om de definitieve status te zetten ("Opened").
Verwijderd: client-only stappen
De oude client-only local:update_message / local:remove_message-stappen zijn weg. Gebruik in plaats daarvan de server-side update_message / remove_message-stappen; die broadcasten naar iedereen, niet alleen de drukker. Een druk op een bericht dat niet meer bestaat geeft MESSAGE_NOT_FOUND.
Rate limit
Gebruikers worden beperkt in snelheid om spam te voorkomen bij het afvuren van triggers.
Callback URL
Elk webhook-request bevat een callback_url: een unieke, token-geauthenticeerde URL die je service kan aanroepen om het antwoordbericht bij te werken of te verwijderen nadat het is geplaatst. De URL is geldig voor 30 minuten.
Toepassingen
- Een "bezig met verwerken..."-bericht bijwerken met eindresultaten
- Live voortgang tonen (bijv. build-status, deployment)
- Een bericht verwijderen wanneer het niet meer relevant is
Bericht bijwerken
{callback_url}
{
"content": "Updated text content",
"message_container": {
"color": "green",
"title": "Build Complete",
"description": "All 42 tests passed."
},
"actions": []
}
Alle velden zijn optioneel; voeg alleen de velden toe die je wilt wijzigen. Om action buttons te verwijderen, stuur "actions": [].
Bericht verwijderen
{callback_url}
Geen request body nodig. Het bericht wordt permanent verwijderd uit het kanaal.
Responses
// 200 OK
{ "success": true }
// 404 Not Found (callback token expired or invalid)
{ "error": "TOKEN_NOT_FOUND" }
// 400 Bad Request (no update fields provided)
{ "error": "MISSING_FIELDS" }
Voorbeeld: Voortgangsupdates
// 1. Your webhook responds immediately with a "loading" message
// Response:
{
"message_container": {
"color": "blue",
"title": "Deploying...",
"description": "Starting deployment to production."
}
}
// 2. Your service updates the message as progress continues
// PUT {callback_url}
{
"message_container": {
"color": "blue",
"title": "Deploying...",
"description": "Step 2/3: Running migrations."
}
}
// 3. Final update when done
// PUT {callback_url}
{
"message_container": {
"color": "green",
"title": "Deploy Complete",
"description": "v2.1.0 is now live on production."
},
"actions": [
{
"label": "View Logs",
"type": "url:https://example.com/deploys/123/logs"
}
]
}
Callback URL levensduur
Geldig voor 30 minuten vanaf het moment dat de trigger afvuurt. Daarna retourneren update/delete-requests 404. Zodra je het bericht verwijdert, is de callback URL verbruikt en kan niet opnieuw worden gebruikt.
Zie het gebeuren
De volledige trigger-loop, live: commando, JSON-reply, knop-tik, callback-update.
mssgs → POST jouw-webhook
Een commando vuurt je webhook af
Iemand typt /deploy. mssgs POST het bericht naar je endpoint, inclusief een callback_url voor dit bericht.
200 ← message_container + actions
Je reply wordt een kaart
Antwoord met JSON en de kaart verschijnt in het kanaal: titel, beschrijving, status en knoppen.
mssgs → POST jouw-webhook · [Action Triggered]
Een knop-tik komt bij jou terug
De tik vuurt de trigger opnieuw naar je server, met een verse callback_url.
PUT {callback_url} → 200
Je werkt de kaart op zijn plek bij
Eerst een loader terwijl jij het werk doet, daarna de eindstatus. Iedereen in het kanaal ziet de update live.
MCP: AI-assistenten
De mssgs desktop-app heeft een ingebouwde MCP-server (Model Context Protocol), zodat AI-assistenten zoals Claude in je workspace kunnen meelezen en handelen. Hij draait lokaal op je machine en werkt via je ingelogde mssgs-sessie; geen apart botaccount of hosting nodig.
http://127.0.0.1:7444/mcp
Authenticatie met een Bearer-token van de AI / MCP-instellingenpagina in de app: zet de server aan, kies de kanalen die je wilt blootstellen en druk op "Copy config"; het gekopieerde blok bevat al je poort en token. De server luistert alleen op localhost (standaardpoort 7444) en draait zolang mssgs open is en je bent ingelogd.
claude mcp add --transport http mssgs http://127.0.0.1:7444/mcp \
--header "Authorization: Bearer <jouw-token>"
Realtime events via SSE
Open het MCP-endpoint als stream (GET /mcp met Accept: text/event-stream) en je ontvangt JSON-RPC-notificaties zodra ze gebeuren:
| Notificatie | Vuurt bij |
|---|---|
notifications/mssgs/message | Nieuwe berichten in kanalen die je kunt zien |
notifications/mssgs/bot_event | Knopdrukken, reacties en replies op berichten die je assistent plaatste via send_bot_message |
notifications/mssgs/presence | Presence-wijzigingen |
notifications/mssgs/typing | Typindicatoren |
notifications/mssgs/call | Voice-call events |
Interactieve botkaarten vanuit je assistent
Plaats een embed-kaart met knoppen via send_bot_message, luister naar bot_event op de stream (of poll get_bot_events) en werk de kaart op zijn plek bij met edit_message. Zelfde kaartmodel als de botberichten-docs.
Bot-tools
| Tool | Beschrijving |
|---|---|
send_bot_message | Plaats een bericht of embed-kaart (met knoppen) als je assistent |
get_bot_events | Haal knopdrukken, reacties en replies op je botberichten op |
edit_message | Werk de message_container van een geplaatst bericht op zijn plek bij |
set_bot_status | Stel de presence/status van je assistent in |
Bot-tools zijn beschikbaar wanneer je bent ingelogd met een botaccount. De volledige toollijst (kanalen, zoeken, bestanden, calls en meer) staat in de app op de AI / MCP-instellingenpagina.
Errors
Bij fouten ontvang je een JSON error response.
{
"error": "ERROR_CODE"
}
Foutcodes
| Code | Beschrijving |
|---|---|
INVALID_TOKEN |
Ongeldig authenticatie-token |
MISSING_REQUIRED_FIELDS |
Verplichte velden ontbreken in data |
MISSING_CONTENT |
Bericht vereist content of message_container.description |
TOKEN_NOT_FOUND |
Callback token verlopen of ongeldig |
MISSING_FIELDS |
Geen update-velden opgegeven in callback-request |
UNSUPPORTED_GITHUB_EVENT |
GitHub event type niet ondersteund |
UNSUPPORTED_UNIFI_PROTECT_EVENT |
UniFi Protect event niet ondersteund |
Succes response
{
"success": true,
"message_id": "aZZ1a2b-...",
"callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-...",
"stream_url": "https://mss.gs/api/v1/instant/6b1e...c0?token=a1b2c3d4-..."
}
Gebruik callback_url om het bericht later te updaten of verwijderen. Als je bericht actieknoppen bevat, bevat de response ook een stream_url; een instant SSE-stream voor live interacties (replies, reacties, knopdrukken) met dat bericht.
Voorbeelden
Simpele notificatie
curl -X POST https://mss.gs/api/v1/webhook/SERVER_GUID/CHANNEL_GUID \
-H "Content-Type: application/json" \
-d '{
"content": "Build completed successfully!"
}'
Gekleurd alert met link
{
"content": "Build #123 completed!",
"color": "green",
"title": "CI/CD Pipeline",
"title_url": "https://github.com/org/repo/actions/runs/123"
}
Fout-alert
{
"message_container": {
"type": "system_message",
"color": "red",
"title": "Alert: Database Error",
"description": "Connection failed: timeout after 30s",
"sub_title": "prod-db-01"
}
}
Deployment-goedkeuring met actions
{
"message_container": {
"color": "yellow",
"title": "Deployment Request",
"description": "User @johndoe requested a deployment to production."
},
"actions": [
{
"label": "Approve",
"type": "trigger:approve-deploy-trigger-guid",
"payload": { "deploy_id": "dep_123", "env": "production" }
},
{
"label": "Reject",
"type": "trigger:reject-deploy-trigger-guid",
"payload": { "deploy_id": "dep_123" }
},
{
"label": "View Changes",
"type": "url:https://github.com/org/repo/compare/main...deploy"
}
]
}
Trigger response: privébericht
{
"message_container": {
"description": "This is a private response only you can see."
},
"visible_to_member_guids": ["<member_guid from request>"],
"ephemeral": true
}
Trigger response: interactief menu
{
"message_container": {
"title": "What would you like to do?",
"description": "Choose an option below:"
},
"actions": [
{
"label": "Get Help",
"type": "trigger:help-trigger-guid"
},
{
"label": "View Stats",
"type": "trigger:stats-trigger-guid",
"payload": { "period": "weekly" }
}
]
}
Speciale Webhooks
mssgs herkent automatisch bepaalde webhook-types.
GitHub Webhooks
Automatisch gedetecteerd via de x-github-event header. Ondersteunde events: Push, Pull Requests, Issues, Releases en meer.
UniFi Protect Webhooks
Automatisch gedetecteerd via de user-agent: protect-alarm-manager header.
Opmerkingen
- Timeout: Je webhook moet binnen 5 seconden antwoorden. Bij een timeout wordt een foutmelding getoond aan de gebruiker. Gebruik de callback URL als je meer verwerkingstijd nodig hebt.
- Berichtopslag: Trigger response-berichten worden opgeslagen in de database en verschijnen in de kanaalgeschiedenis.
- Callback URL levensduur: Geldig voor 30 minuten vanaf het moment dat de trigger afvuurt. Daarna retourneren update/delete-requests
404. - Rate limiting: Gebruikers worden beperkt in snelheid om spam te voorkomen bij het afvuren van triggers.
Vragen?
We helpen je graag verder met je integratie.
developers@mss.gs