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
2xxrapidement (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
Nous appelons l'URL configurée dans votre application.(votre URL)