Ga naar hoofdinhoud

Webhooks & Integraties

Bouw bots, automatiseringen en integraties met mssgs webhooks en triggers

Aan de slag

Met mssgs webhooks kun je berichten naar kanalen sturen en interactieve bots bouwen die reageren op commando's.

1

Maak een webhook aan

Ga naar Serverinstellingen > Integraties en maak een nieuwe webhook of trigger aan.

2

Kopieer de URL

Kopieer de webhook-URL of trigger-GUID voor je integratie.

3

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.

POST /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.

Heeft de webhook een Webhook Secret ingesteld, stuur dan ook een signature van de rauwe request body mee in de header X-Mssgs-Signature, in de vorm sha256=<hex>. Een request zonder signature krijgt dan 401 met {"error": "INVALID_SIGNATURE"}.

Request Body
{
  "content": "Hello from my integration!",
  "color": "green",
  "title": "My Bot"
}

Simple Format

De eenvoudigste manier om een bericht te versturen.

Simple Message
{
  "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.

Full Message Container
{
  "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 Array
{
  "fields": [
    { "field": "Status", "value": "Completed" },
    { "field": "Duration", "value": "2m 34s" },
    { "field": "Environment", "value": "Production" }
  ]
}

Bijlagen

Verstuur echte bestanden mee met een webhook-bericht: een logdump, een rapport, een screenshot. Ze worden weergegeven zoals bijlagen bij elk ander bericht, als downloadbare bestandsrijen of als inline media bij afbeeldingen, video en audio.

Een bericht met alleen bijlagen is geldig. Stuur attachments zonder content en zonder message_container, en de kaart bestaat alleen uit het bestand.

Logbestand met een samenvattingskaart
{
  "message_container": {
    "type": "embed_message",
    "color": "orange",
    "title": "Log dump: ios",
    "description": "DMs kwamen niet meer binnen na het wisselen van netwerk"
  },
  "attachments": [
    {
      "name": "mssgs-logs-20260803-141205.log",
      "content_base64": "MjAyNi0wOC0wMyAxNDoxMjowNSBbV1NdIGNvbm5lY3RlZAo=",
      "mime_type": "text/plain"
    }
  ]
}

Velden per bijlage

Veld Type Beschrijving
name string Bestandsnaam, en de naam waaronder het wordt gedownload. Wordt teruggebracht tot de basisnaam; een pad of een ../-prefix wordt verwijderd, niet gevolgd required
content_base64 string De bytes van het bestand als base64 (rauw, of een data:-URI). Wordt server-side in het kanaal geüpload en als gehost bestand geleverd; de base64 zelf wordt niet op het bericht opgeslagen
mime_type string Content type van content_base64. Gaat voor op het type in een data:-URI. Standaard text/plain
url string Een door mssgs gehost bestand dat je al geüpload hebt: een pad (/static/...) of een absolute https://mss.gs/...-URL, die wordt genormaliseerd naar het pad

Stuur precies één van content_base64 of url per bijlage. Beide is een fout, geen van beide is een fout.

Limieten

Limiet Waarde
Bijlagen per bericht 5
Grootte per bijlage (gedecodeerd) 8 MB
Lengte bestandsnaam 200 tekens

De limiet van 8 MB geldt per bestand ná het decoderen van de base64. Base64 groeit met een factor 4/3, dus een maximale bijlage is ongeveer 10,7 MB aan JSON. De requestlimiet is 16 MB, dus één maximale bijlage past en twee niet.

Waarom url alleen mssgs-hosts accepteert

Een webhook-URL is een bearer-credential die vaak in dashboards van derden wordt geplakt. Een gelekte URL mag geen manier worden om willekeurige externe content te tonen, of om elke client in het kanaal een request te laten doen naar een host die de afzender kiest. Staan je bytes op een andere host, stuur ze dan als content_base64; mssgs host ze dan voor je.

Geaccepteerd: /static/..., https://mss.gs/..., https://www.mss.gs/.... Al het andere geeft INVALID_ATTACHMENT_URL.

Controleer de response body, niet de HTTP-status

De publieke webhook-route antwoordt met 200 OK, ook als je payload is geweigerd; de fout staat alleen in de body. Behandel een JSON-body met error als een mislukking, ongeacht de statuscode. Zie Errors voor de codes en voor de statussen die wél eerlijk worden teruggegeven.

Een mislukte upload is stil

Validatie gebeurt vooraf, maar de upload zelf gebeurt later. Mislukt die upload, dan wordt die bijlage weggelaten en wordt de rest van het bericht gewoon geplaatst, zonder foutmelding. Dat is bewust zo: het bestand kwijtraken is minder erg dan het hele rapport kwijtraken. Is een bestand cruciaal, controleer dan of het is aangekomen in plaats van aan te nemen dat een response zonder fout dat garandeert. Mislukken alle bijlagen, dan wordt de sleutel attachments volledig van het bericht verwijderd.

Alleen een bijlage

JSON Body
{
  "attachments": [
    { "name": "nightly-report.csv", "url": "/static/mu/ab12/nightly-report.csv" }
  ]
}
cURL
curl -sS -X POST "$MSSGS_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d '{"attachments":[{"name":"report.csv","content_base64":"'"$(base64 < report.csv | tr -d '\n')"'","mime_type":"text/csv"}]}'
JavaScript
async function postWebhookAttachment (webhookUrl, name, bytes, mimeType) {
  const res = await fetch(webhookUrl, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      attachments: [{
        name,
        content_base64: Buffer.from(bytes).toString('base64'),
        mime_type: mimeType
      }]
    })
  });

  // De publieke webhook-route geeft 200 terug, ook als de payload is geweigerd;
  // de fout staat alleen in de body. Controleer beide.
  const body = await res.json().catch(() => null);
  if (!res.ok || (body && body.error)) {
    throw new Error(`webhook geweigerd: ${body?.error ?? res.status}`);
  }
  return body;
}

Goed om te weten

Bijlagen tellen als inhoud. Een bericht met alleen bijlagen komt door de inhoudscontrole, dus opvultekst is niet nodig.
allow_images: false blokkeert geen bijlagen. Die optie per webhook haalt afbeeldingen uit de kaart zelf (image_url, image_base64, de images-galerij). Bijlagen raakt hij niet, dus een webhook met afbeeldingen uit kan nog steeds een .png als bijlage plaatsen, die clients inline tonen zoals elke andere afbeeldingsbijlage. Er is op dit moment geen aparte schakelaar per webhook voor bijlagen; de enige controle is de webhook-URL zelf.
Een gehoste bijlage wordt opgeslagen als {name, url, guid} op het bericht. De content_base64 die je stuurde wordt nooit bewaard.

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.

Voorbeelden
Knoppen
Voorbeeld
Webhook body

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.

1

Gebruiker typt een commando

Een gebruiker stuurt een bericht dat begint met het prefix van je trigger, bijv. /help

2

mssgs roept je webhook aan

De backend stuurt een POST-request naar je geconfigureerde webhook-URL met de berichtgegevens.

3

Je antwoordt met JSON

Je server retourneert een JSON-response met de berichtinhoud, embeds en actions.

4

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:

POST {your_webhook_url}
Command Match Request
{
  "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:

Action Button Request
{
  "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

Simple Response
{
  "content": "Hello! How can I help you?"
}

Embed response

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

Full Response
{
  "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
Shorthand Actions
{
  "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.

webhook_action Voorbeeld
{
  "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

PUT {callback_url}
Update Request
{
  "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

DELETE {callback_url}

Geen request body nodig. Het bericht wordt permanent verwijderd uit het kanaal.

Responses

Callback 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

Progress Update Flow
// 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.

1
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.

2
200 ← message_container + actions
Je reply wordt een kaart

Antwoord met JSON en de kaart verschijnt in het kanaal: titel, beschrijving, status en knoppen.

3
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.

4
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.

# deploys
jasper 18:45 /deploy
System
Message from Deploy Bot• acme/acme-core

Deploy v2.1.0 to production?

Ready
All 42 checks passed. Last commit: 1a2b3c4.
System
Message from Deploy Bot• acme/acme-core
Deploying…Step 2/3: running migrations
System
Message from Deploy Bot• acme/acme-core

Deploy complete

Live
v2.1.0 is now live on production.

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.

MCP 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 Code koppelen
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/messageNieuwe berichten in kanalen die je kunt zien
notifications/mssgs/bot_eventKnopdrukken, reacties en replies op berichten die je assistent plaatste via send_bot_message
notifications/mssgs/presencePresence-wijzigingen
notifications/mssgs/typingTypindicatoren
notifications/mssgs/callVoice-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_messagePlaats een bericht of embed-kaart (met knoppen) als je assistent
get_bot_eventsHaal knopdrukken, reacties en replies op je botberichten op
edit_messageWerk de message_container van een geplaatst bericht op zijn plek bij
set_bot_statusStel 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 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
INVALID_SIGNATURE De webhook heeft een secret ingesteld en de header X-Mssgs-Signature ontbreekt of klopt niet

Foutcodes voor bijlagen

Code Beschrijving
INVALID_ATTACHMENTS_FORMAT attachments is geen array, of een item is geen object
TOO_MANY_ATTACHMENTS Meer dan 5 bijlagen
MISSING_ATTACHMENT_NAME name ontbreekt of is leeg
INVALID_ATTACHMENT_NAME name blijft niets bruikbaars over (., .., /)
MISSING_ATTACHMENT_SOURCE Noch url noch content_base64
AMBIGUOUS_ATTACHMENT_SOURCE Zowel url als content_base64
INVALID_ATTACHMENT_BASE64 content_base64 is niet te decoderen
ATTACHMENT_TOO_LARGE Gedecodeerde grootte boven 8 MB
INVALID_ATTACHMENT_URL url is geen door mssgs gehost pad

Statuscodes bij incoming webhooks

Je client moet de body controleren, niet de HTTP-status

De publieke webhook-URL geeft 200 OK terug bij een geweigerde payload; de foutcode staat alleen in de response body. Alleen response.ok controleren betekent dat elke weigering als succes wordt gemeld. Behandel een JSON-body met error als een mislukking, ongeacht de statuscode.

Zo ziet een geweigerde bijlage eruit
HTTP/1.1 200 OK
Content-Type: application/json

{ "error": "ATTACHMENT_TOO_LARGE" }

Deze statussen worden wél eerlijk teruggegeven, omdat ze bepaald worden voordat je payload verwerkt wordt:

Status Wanneer
401 De webhook heeft een secret en de signature ontbreekt of klopt niet (INVALID_SIGNATURE)
403 Webhook-token of kanaalkoppeling komt niet overeen
404 Webhook niet gevonden
200 Al het overige, inclusief geweigerde payloads. Lees de body

Succes response

Success
{
  "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
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

JSON Body
{
  "content": "Build #123 completed!",
  "color": "green",
  "title": "CI/CD Pipeline",
  "title_url": "https://github.com/org/repo/actions/runs/123"
}

Fout-alert

JSON Body
{
  "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

JSON Body
{
  "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

Private Response
{
  "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

Interactive 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. Incoming webhooks zijn beperkt tot 300 requests per 60 seconden per webhook-URL.

Vragen?

We helpen je graag verder met je integratie.

developers@mss.gs