Webhooks

Recevez en temps réel les événements de vos salles, arrivées, départs, fin de session, directement sur votre serveur.

Configurez une URL de webhook dans votre application (tableau de bord → Webhooks). À chaque événement, nous envoyons une requête POST signée à cette URL. Chaque endpoint possède un secret pour vérifier l'authenticité.

Événements disponibles

  • session.started, une salle passe de vide à active.
  • session.ended, la salle se vide, la session se termine.
  • participant.joined, un participant rejoint.
  • participant.left, un participant quitte.
  • track.published / track.unpublished, une piste média est (dé)publiée.

Format de la requête

Le corps est un JSON et trois en-têtes accompagnent chaque livraison :

  • X-Lunion-Event, le type d'événement.
  • X-Lunion-Signature, sha256=<hmac> du corps brut.
  • X-Lunion-Delivery, identifiant unique de la livraison.
payload
{  "event": "participant.joined",  "createdAt": "2026-06-25T10:05:00.000Z",  "data": {    "room": "calm-otter-1289",    "identity": "user-42",    "name": "Awa Diop"  }}

Vérifier la signature

Vérifiez toujours la signature avant de traiter l'événement, à partir du corps brut de la requête (non parsé). Le SDK serveur fournit WebhookReceiver.

webhook.ts (Express)
import express from "express";import { WebhookReceiver } from "@lunionlab/meet-server-sdk"; const receiver = new WebhookReceiver(process.env.LUNION_WEBHOOK_SECRET!);const app = express(); // Important : on a besoin du corps BRUT pour vérifier la signature.app.post("/webhooks/lunion", express.raw({ type: "application/json" }), (req, res) => {  try {    const event = receiver.receive(      req.body.toString("utf8"),      req.header("X-Lunion-Signature"),    );    // event.event, event.data ...    if (event.event === "participant.joined") {      // votre logique métier    }    res.sendStatus(200);  } catch {    res.sendStatus(401); // signature invalide  }});

Le corps brut est indispensable

Si un middleware parse le JSON avant vous, la signature ne correspondra plus. Servez le corps brut sur la route du webhook (ci-dessus, express.raw).

Réessais

  • Répondez en 2xx rapidement (sous 10 s). Tout le reste est considéré comme un échec.
  • En cas d'échec, la livraison est réessayée automatiquement avec un délai croissant.
  • Les livraisons (succès comme échecs) sont consultables et rejouables depuis le tableau de bord.

Point d'entrée concerné

POST(votre URL)
Nous appelons l'URL configurée dans votre application.