API Webhooks
Notifications d'événements de réunion en temps réel
L'API Webhooks permet des notifications en temps réel pour les événements de réunion, permettant à vos applications de recevoir des mises à jour sur les débuts, fins, événements de transcription et plus encore.
- Recevoir des notifications de réunion en temps réel
- Intégrer avec vos outils de workflow existants
- Construire des gestionnaires d'événements personnalisés pour les événements de réunion
- Automatiser les processus post-réunion
Les webhooks fournissent un moyen puissant de construire des applications réactives qui réagissent aux événements du cycle de vie des réunions sans polling constant, permettant des intégrations efficaces avec les CRMs, plateformes d'analyse et autres systèmes métier.
Fonctionnalités principales
- Événements du cycle de vie des réunions : Recevoir des notifications pour les débuts, fins et échecs de réunions
- Événements de transcription : Obtenir des mises à jour quand la transcription est disponible ou mise à jour
- Événements de calendrier : Notifications pour les changements de calendrier et la synchronisation
- Mécanisme de retry : Endpoint API pour réessayer les livraisons de webhook échouées
- Endpoints personnalisables : Définir différentes URLs de webhook pour différents types d'événements
- Filtrage d'événements : Contrôler quels événements déclenchent des notifications
Types d'événements webhook
Les webhooks Meeting BaaS livrent les types d'événements suivants :
- meeting.started : Un bot a rejoint une réunion avec succès
- meeting.completed : Une réunion s'est terminée et les enregistrements sont disponibles
- meeting.failed : Un bot n'a pas pu rejoindre une réunion
- transcription.available : La transcription initiale est disponible
- transcription.updated : La transcription a été mise à jour ou affinée
- calendar.synced : Un calendrier a été synchronisé
- event.added : Un nouvel événement de calendrier a été détecté
- event.updated : Un événement de calendrier a été mis à jour
- event.deleted : Un événement de calendrier a été supprimé
Configuration et installation
Configurer l'endpoint webhook
Voici un exemple de comment configurer une URL webhook pour les événements de réunion :
Cette configuration JSON montre comment configurer un endpoint webhook dans votre compte Meeting BaaS.
{
"webhook_url": "https://your-app.com/webhooks/meetingbaas",
"events": [
"meeting.started",
"meeting.completed",
"meeting.failed",
"transcription.available"
],
"secret": "your-webhook-secret-key",
"enabled": true
}
Lister les endpoints webhook
curl -X GET "https://api.meetingbaas.com/bots/webhooks/bot" \
-H "x-meeting-baas-api-key: <token>"
Formats d'événements webhook
Voici des exemples de charges utiles d'événements webhook :
Ces exemples JSON montrent le format des notifications d'événements de début et fin de réunion.
Événement de réunion terminée
{
"event": "complete",
"data": {
"bot_id": "123e4567-e89b-12d3-a456-426614174000",
"transcript": [
{
"speaker": "John Doe",
"offset": 1.5,
"words": [
{
"start": 1.5,
"end": 1.9,
"word": "Hello"
},
{
"start": 2.0,
"end": 2.4,
"word": "everyone"
}
]
}
],
"speakers": [
"Jane Smith",
"John Doe"
],
"mp4": "https://storage.example.com/recordings/video123.mp4?token=abc",
"event": "complete"
}
}
Événement de réunion échouée
{
"event": "failed",
"data": {
"bot_id": "123e4567-e89b-12d3-a456-426614174000",
"error": "meeting_not_found",
"message": "Could not join meeting: The meeting ID was not found or has expired"
}
}
Événement de transcription terminée
{
"event": "transcription_complete",
"data": {
"bot_id": "123e4567-e89b-12d3-a456-426614174000"
}
}
Exemples d'implémentation
Gestionnaire webhook Python
from flask import Flask, request, jsonify
import hmac
import hashlib
app = Flask(__name__)
WEBHOOK_SECRET = "your-webhook-secret-key"
def verify_signature(payload, signature):
expected_signature = hmac.new(
WEBHOOK_SECRET.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected_signature)
@app.route('/webhooks/meetingbaas', methods=['POST'])
def webhook_handler():
signature = request.headers.get('X-MeetingBaas-Signature')
payload = request.get_data()
if not verify_signature(payload, signature):
return jsonify({"error": "Invalid signature"}), 401
event_data = request.json
if event_data['event'] == 'complete':
# Gérer la fin de réunion
bot_id = event_data['data']['bot_id']
transcript = event_data['data']['transcript']
recording_url = event_data['data']['mp4']
# Traiter les données de réunion
process_meeting_completion(bot_id, transcript, recording_url)
elif event_data['event'] == 'failed':
# Gérer l'échec de réunion
bot_id = event_data['data']['bot_id']
error = event_data['data']['error']
message = event_data['data']['message']
# Enregistrer l'échec
log_meeting_failure(bot_id, error, message)
return jsonify({"status": "success"}), 200
def process_meeting_completion(bot_id, transcript, recording_url):
# Votre logique personnalisée ici
print(f"Réunion {bot_id} terminée")
print(f"Enregistrement disponible à : {recording_url}")
if __name__ == '__main__':
app.run(debug=True, port=5000)
from fastapi import FastAPI, Request, HTTPException, Header
import hmac
import hashlib
from typing import Optional
app = FastAPI()
WEBHOOK_SECRET = "your-webhook-secret-key"
def verify_signature(payload: bytes, signature: str) -> bool:
expected_signature = hmac.new(
WEBHOOK_SECRET.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected_signature)
@app.post("/webhooks/meetingbaas")
async def webhook_handler(
request: Request,
x_meetingbaas_signature: Optional[str] = Header(None)
):
payload = await request.body()
if not x_meetingbaas_signature:
raise HTTPException(status_code=401, detail="Missing signature")
if not verify_signature(payload, x_meetingbaas_signature):
raise HTTPException(status_code=401, detail="Invalid signature")
event_data = await request.json()
# Traiter différents types d'événements
if event_data['event'] == 'complete':
await handle_meeting_completion(event_data['data'])
elif event_data['event'] == 'failed':
await handle_meeting_failure(event_data['data'])
elif event_data['event'] == 'transcription_complete':
await handle_transcription_complete(event_data['data'])
return {"status": "success"}
async def handle_meeting_completion(data):
bot_id = data['bot_id']
transcript = data['transcript']
recording_url = data['mp4']
# Votre logique personnalisée ici
print(f"Réunion {bot_id} terminée")
print(f"Enregistrement disponible à : {recording_url}")
async def handle_meeting_failure(data):
bot_id = data['bot_id']
error = data['error']
message = data['message']
# Votre logique personnalisée ici
print(f"Réunion {bot_id} échouée : {error} - {message}")
async def handle_transcription_complete(data):
bot_id = data['bot_id']
# Votre logique personnalisée ici
print(f"Transcription terminée pour la réunion {bot_id}")
Gestionnaire webhook Node.js
const express = require('express');
const crypto = require('crypto');
const app = express();
const WEBHOOK_SECRET = 'your-webhook-secret-key';
app.use(express.json());
function verifySignature(payload, signature) {
const expectedSignature = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
app.post('/webhooks/meetingbaas', (req, res) => {
const signature = req.headers['x-meetingbaas-signature'];
const payload = JSON.stringify(req.body);
if (!verifySignature(payload, signature)) {
return res.status(401).json({ error: 'Invalid signature' });
}
const eventData = req.body;
switch (eventData.event) {
case 'complete':
handleMeetingCompletion(eventData.data);
break;
case 'failed':
handleMeetingFailure(eventData.data);
break;
case 'transcription_complete':
handleTranscriptionComplete(eventData.data);
break;
default:
console.log(`Unknown event: ${eventData.event}`);
}
res.json({ status: 'success' });
});
function handleMeetingCompletion(data) {
const { bot_id, transcript, mp4 } = data;
console.log(`Réunion ${bot_id} terminée`);
console.log(`Enregistrement disponible à : ${mp4}`);
// Votre logique personnalisée ici
// ex: sauvegarder en base, envoyer des notifications, etc.
}
function handleMeetingFailure(data) {
const { bot_id, error, message } = data;
console.log(`Réunion ${bot_id} échouée : ${error} - ${message}`);
// Votre logique personnalisée ici
// ex: logique de retry, alertes, etc.
}
function handleTranscriptionComplete(data) {
const { bot_id } = data;
console.log(`Transcription terminée pour la réunion ${bot_id}`);
// Votre logique personnalisée ici
// ex: traiter la transcription, mettre à jour la base, etc.
}
app.listen(3000, () => {
console.log('Serveur webhook en cours d\'exécution sur le port 3000');
});
Bonnes pratiques
Sécurité
- Toujours vérifier les signatures webhook
- Utiliser des endpoints HTTPS
- Implémenter la limitation de débit
- Valider les données d'événement
Fiabilité
- Retourner rapidement les codes de statut 200
- Implémenter l'idempotence
- Gérer les événements en double
- Configurer la surveillance et les alertes
Gestion d'erreurs
- Enregistrer tous les événements webhook
- Implémenter la logique de retry pour les échecs
- Configurer les files d'attente de lettres mortes
- Surveiller le statut de livraison des webhooks

Commencer
Prêt à intégrer des notifications de réunion en temps réel ? Consultez nos ressources complètes :