Sign inGet started

Realtime-Webhooks

Publishing sendet Events an Clients. Webhooks laufen in die andere Richtung: Der Realtime-Edge sendet per POST ein signiertes Event an Ihren Endpoint, wenn auf einem Channel etwas passiert.
Den Channel-Status können Sie bereits bei Bedarf mit Channel-Status abfragen lesen. Webhooks informieren Sie über eine Änderung, sobald sie eintritt, ohne Polling: ein Client abonniert, ein Mitglied schließt seinen letzten Tab, ein Client sendet einem anderen eine Cursorposition.

Die fünf Event-Gruppen

Abonnieren Sie eine oder mehrere Event-Gruppen:
GruppeWelche Frage sie beantwortetWas sie liefert
realtime.channel_existenceHört jemand zu?realtime.channel_occupied, realtime.channel_vacated
realtime.presenceWer ist da?realtime.member_added, realtime.member_removed
realtime.connection_countWie viele Verbindungen?realtime.connection_count
realtime.cache_channelsBraucht dieser Channel Daten?realtime.cache_miss
realtime.client_eventsWas senden Clients?ein Event pro Client-Event, nach diesem benannt
channel_existence meldet nur die beiden Ränder im Lebenszyklus eines Channels: channel_occupied, wenn er von null Verbindungen auf eine wechselt, channel_vacated, wenn die letzte Verbindung wegfällt. Abonnenten, die dazwischen kommen und gehen, erzeugen nichts – damit ist es die günstige Methode um festzustellen, ob sich das Publishing lohnt.
connection_count erfordert Verbindungszählung in der App. Ist die Einstellung deaktiviert, erzeugt die abonnierte Gruppe keine Events.

Einen Endpoint abonnieren

Öffnen Sie Webhooks, erstellen oder bearbeiten Sie einen Endpoint und suchen Sie den Abschnitt Realtime events. Wählen Sie eine Realtime-App und die gewünschten Gruppen aus.
Plattform-Event-Abonnements gelten workspace-weit, während realtime.*-Abonnements zu einer einzelnen App gehören. Sie können die Realtime-App des Endpoints nach dem Erstellen nicht mehr ändern, aber die abonnierten Gruppen aktualisieren.
Plattform- und Realtime-Events können sich einen Endpoint teilen. Ein Endpoint kann zum Beispiel email.bounced und realtime.presence abonnieren. Beide verwenden das Signing-Secret des Endpoints.
Realtime-Gruppen lassen sich derzeit nur im Dashboard konfigurieren. Ein öffentlicher POST /v1/webhooks-Request, der einen realtime.*-Event-Typ enthält, wird abgelehnt. Richten Sie diese Abonnements daher im Dashboard ein.

Wie eine Zustellung aussieht

Jeder POST enthält ein Event im Standard-Webhook-Envelope von Bird:
Codebeispiel
{
  "data": { "channel": "presence-room-1", "member_id": "u_42" },
  "timestamp": "2026-07-31T09:00:00Z",
  "type": "realtime.member_added"
}
type identifiziert das zugestellte Event. Zum Beispiel liefert die Gruppe realtime.presence die Events realtime.member_added und realtime.member_removed:
Zugestellter typedata-Felder
realtime.channel_occupiedchannel
realtime.channel_vacatedchannel
realtime.member_addedchannel, member_id
realtime.member_removedchannel, member_id
realtime.connection_countchannel, connection_count
realtime.cache_misschannel
realtime.<client event>channel_name, event, data, connection_id, plus member_id auf einem Presence-Channel
Bei Client-Events wählt der Client das Event-Suffix. Das Auslösen von client-typing erzeugt realtime.client-typing, und data.event enthält client-typing. Siehe Client-Events.

Eine Zustellung verifizieren

Realtime-Webhooks folgen Standard Webhooks und enthalten die Header webhook-id, webhook-timestamp und webhook-signature. Verifizieren Sie sie mit dem Signing-Secret des Endpoints.
Codebeispiel
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({
  apiKey: process.env.BIRD_API_KEY,
  webhooks: { secret: process.env.BIRD_WEBHOOK_SECRET },
});

app.post("/webhooks/bird", express.raw({ type: "*/*" }), (req, res) => {
  const event = bird.webhooks.unwrap(req.body, req.headers);
  res.sendStatus(200);

  switch (event.type) {
    case "realtime.channel_vacated":
      stopExpensiveWorkFor(event.data.channel);
      break;
    case "realtime.member_removed":
      markAway(event.data.member_id);
      break;
  }
});
Verifizieren Sie den rohen Request-Body, da das Parsen und erneute Serialisieren von JSON die signierten Bytes verändern kann. Behandeln Sie unbekannte Event-Typen in einem default-Zweig, damit neue Typen den Endpoint nicht beeinträchtigen. Siehe Webhook-Signaturen verifizieren für den vollständigen Vertrag.

Presence-Events zählen Mitglieder

member_added und member_removed folgen der Identität und stimmen daher nicht eins zu eins mit Verbindungen überein. Jemand, der Ihre App in drei Tabs geöffnet hat, ist ein Mitglied:
Was passiertWebhook
Erster Tab abonniertrealtime.member_added
Zweiter Tab abonniertkeiner
Zweiter Tab schließtkeiner
Letzter Tab schließtrealtime.member_removed
Verwenden Sie member_removed, um zu erkennen, wann eine Identität einen Channel verlässt. Das Beenden einer einzelnen Sitzung löst das Event nicht aus, solange eine andere Sitzung bestehen bleibt. Um Verbindungen zu verfolgen, abonnieren Sie realtime.connection_count. Siehe Presence-Channels.

Zustellverhalten von Realtime-Webhooks

Realtime-Zustellungen folgen diesen Regeln für Wiederholung und Sichtbarkeit:
  • Geben Sie 2xx umgehend zurück, nachdem Sie das Event dauerhaft angenommen haben, und verarbeiten Sie es dann asynchron.
  • Gibt Ihr Endpoint eine Nicht-2xx-Antwort zurück, versucht Realtime es mit exponentiellem Backoff bis zu 5 Minuten lang erneut.
  • Realtime-Events haben kein Replay und erscheinen nicht im Zustellversuch-Log des Endpoints.
  • Wird der Endpoint pausiert, stoppt das auch die Realtime-Zustellungen zusammen mit allem anderen. Beim erneuten Aktivieren werden sie fortgesetzt.
Zustellungen sind ungeordnet und bieten keine Empfangsbestätigung pro Event. Behandeln Sie sie als Änderungsbenachrichtigungen. Verwenden Sie Channel-Status abfragen, um den aktuellen Status nach verzögerten oder fehlenden Events abzurufen.

Nächste Schritte

  • Client-Events ist die Gruppe, deren Event-Namen und Payloads Sie selbst definieren.
  • Cache-Channels erklärt, was Sie mit realtime.cache_miss tun können.
  • Webhooks & Events behandelt Endpoint-Einrichtung, Signaturverifizierung und Secret-Rotation für jeden Bird-Webhook.