---
title: "Live-updates: mssgs-berichten aanpassen na het posten"
description: "Werk een mssgs-bericht bij of verwijder het via de callback-URL, toon voortgang met een loader en luister live naar antwoorden, reacties en knopdrukken."
canonical: https://mss.gs/nl/docs/live-updates
language: nl
---

# Berichten live bijwerken

Een bericht hoeft niet te blijven zoals het is gepost. Toon voortgang terwijl een taak loopt, vervang een loader door het resultaat, haal de knoppen weg zodra iemand heeft gekozen, of verwijder het. Iedereen in het kanaal ziet de wijziging meteen.

## Wat je kunt doen

- **De kaart bijwerken** Verander de tekst, de kleur en de knoppen, op dezelfde plek.

- **Voortgang tonen** Een loader die stap voor stap verder gaat, en dan het resultaat.

- **Het verwijderen** Haal een bericht weg zodra het niet meer klopt.

- **Ernaar luisteren** Antwoorden, reacties en knopdrukken op je bericht, live.

In de app

Gepost met een loader

Bijgewerkt: stap 2 van 3

#### Uitrol voltooid

Bijgewerkt: klaar, met een knop

Eén bericht, twee keer bijgewerkt via de callback-URL. Niemand ziet drie berichten, alleen één dat verandert.

- [Snel aan de slag](#quick-start)

- [Bijwerken](#update)

- [Voortgang tonen](#progress)

- [Verwijderen](#delete)

- [Luisteren](#stream)

## Snel aan de slag

### Bewaar de callback-URL

Elke post via een [webhook](https://mss.gs/nl/docs/webhooks) en elk request voor een [commando](https://mss.gs/nl/docs/commands) komt met een callback_url voor dat bericht.

```bash
BODY='{"message_container": {"color": "blue", "loader": true, "loader_text": "Deploying…"}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$MSSGS_WEBHOOK_SECRET" | sed 's/^.* //')

curl -X POST "$MSSGS_WEBHOOK_URL" -H "Content-Type: application/json" \
  -H "X-Mssgs-Signature: sha256=$SIG" -d "$BODY"

# {"success": true, "message_id": "...", "callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-..."}
```

### PUT om bij te werken

Stuur de nieuwe stand. De kaart verandert voor iedereen op dezelfde plek.

```bash
curl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \
  -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'
```

### DELETE om te verwijderen

Geen body nodig.

```bash
curl -X DELETE "$CALLBACK_URL"
```

## Een bericht bijwerken

PUT JSON naar de callback_url . Stuur alleen wat je wilt veranderen.

| Veld | Type | Wat het doet |
| --- | --- | --- |
| message_container | object | De nieuwe kaart. Zie [berichtkaarten](https://mss.gs/nl/docs/bots). |
| actions | array | Nieuwe knoppen. "actions": [] haalt ze allemaal weg; laat je het veld weg, dan blijven ze staan. |
| content | string | Nieuwe tekst. |
| title , description , color , loader , ... | string | Verkorte vorm: kaartvelden op het hoogste niveau worden voor je in een kaart gezet. |

### Antwoorden

| Status | Code | Betekenis |
| --- | --- | --- |
| 200 | {"success": true} | Geaccepteerd. De update volgt direct daarna. |
| 400 | MISSING_FIELDS | Niets om bij te werken in de body. |
| 400 | INVALID_BODY | De body is geen geldige JSON. |
| 400 | een knopcode | Er klopt iets niet aan een knop, zie [knoppen](https://mss.gs/nl/docs/buttons). |
| 401 | INVALID_TOKEN | De URL is niet geldig. |
| 404 | TOKEN_NOT_FOUND | De URL is verlopen of is gebruikt om het bericht te verwijderen. |
| 502 | PUBLISH_FAILED | De update kon niet worden afgeleverd. Probeer het opnieuw. |

### Hoe lang het werkt

30 minuten vanaf het moment dat het bericht is gepost, of dat het commando is gebruikt. Bijwerken verlengt dat niet. Het bericht verwijderen maakt de URL op. Via een update kun je geen bestanden toevoegen.

## Voortgang tonen

Post een kaart met een loader, werk de subtekst bij terwijl de taak vordert, en eindig met het resultaat. De loader is een spinner met een regel en een kleinere regel eronder ( loader_text , loader_sub_text ).

```javascript
const { callback_url } = await post({
  message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 1 of 3: building' }
});

const update = (body) => {
  return fetch(callback_url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
};

await build();
await update({ message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 2 of 3: running migrations' } });

await migrate();
await update({
  message_container: { color: 'green', title: 'Deploy complete', description: 'v2.1 is live on production.' },
  actions: [{ type: 'url:https://ci.example.com/deploys/218', text: 'View logs', color: 'green' }]
});
```

## Een bericht verwijderen

Stuur DELETE naar de callback_url en het bericht is voor iedereen weg. Daarna kun je de URL niet meer gebruiken.

## Naar een bericht luisteren

Een stream_url is een live stream (Server-Sent Events) van wat er op je bericht gebeurt. Open hem en events komen binnen zodra ze gebeuren, elk als een JSON-regel data: waarvan het type zegt wat het is:

```sse
curl -N "$STREAM_URL"

data: {"type": "reaction", "message_id": "...", "emoji": ":tada:", "action": "add", "member_guid": "...", "member": {...}, "ts": 1790000000000}

data: {"type": "action", "message_id": "...", "action_id": "approve", "action": {"id": "approve", "payload": {"deploy": 218}, ...}, "member_guid": "...", "member": {...}, "ts": 1790000004200}

data: {"type": "reply", "message_id": "...", "content": "Ship it!", "member_guid": "...", "member": {...}, "ts": 1790000009800}

event: expired
data: {}
```

| Event | Wanneer | Data |
| --- | --- | --- |
| action | Er is een knop ingedrukt. | action_id , en de opgeslagen knop in action met zijn payload |
| reaction | Er is een reactie toegevoegd of verwijderd. | emoji , en action : add, remove of removeall |
| reply | Iemand heeft op het bericht geantwoord. | De content van het antwoord |
| expired | De stream gaat dicht. Verstuurd als benoemd event. | Geen |

### Luisteren in JavaScript

```javascript
const events = new EventSource(streamUrl);

// Every event arrives as a plain message; its kind is in "type".
events.onmessage = (e) => {
  const ev = JSON.parse(e.data);
  if ((ev.type === 'action') && (ev.action_id === 'approve')) {
    startDeploy(ev.action.payload.deploy);
  }
};

// The one named event: the stream is closing.
events.addEventListener('expired', () => {
  events.close();
});
```

### Waar je er een krijgt

| Waar je hem krijgt | Open voor |
| --- | --- |
| Een webhookpost met knoppen | 10 minuten, of een uur met "sse_event_extended_timeout": true |
| Elk request voor een commando | 10 minuten |

### Fouten

| Status | Code | Betekenis |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Het token in de URL klopt niet. |
| 404 | NOT_FOUND | De stream is verlopen of heeft nooit bestaan. |

## Verder bouwen
