API Webhooks
Notifications d'événements de meeting en temps réel
L'API Webhooks permet des notifications en temps réel pour les événements de meeting, permettant à vos applications de recevoir des mises à jour sur les démarrages de meeting, les fins de meeting, les événements de transcription, et bien plus encore.
- Recevoir des notifications de meeting en temps réel
- S'intégrer à vos outils de workflow existants
- Créer des gestionnaires d'événements personnalisés pour les événements de meeting
- Automatiser les processus post-meeting
Les webhooks offrent un moyen puissant de créer des applications réactives qui répondent aux événements du cycle de vie des meetings sans interrogation constante, permettant des intégrations efficaces avec les CRM, les plateformes d'analyse et d'autres systèmes métier.
Fonctionnalités clés
- Événements du cycle de vie des meetings : Recevez des notifications pour les démarrages, les fins et les échecs de meetings
- Événements de transcription : Obtenez des mises à jour lorsque la transcription est disponible ou mise à jour
- Événements de calendrier : Notifications pour les changements de calendrier et la synchronisation
- Mécanisme de nouvelle tentative : Endpoint d'API pour réessayer les livraisons de webhook échouées
- Endpoints personnalisables : Définissez différentes URL de webhook pour différents types d'événements
- Filtrage d'événements : Contrôlez quels événements déclenchent des notifications
Types d'événements webhook
Les webhooks Meeting BaaS délivrent les types d'événements suivants :
- meeting.started : Un bot a rejoint avec succès un meeting
- meeting.completed : Un meeting s'est terminé et les enregistrements sont disponibles
- meeting.failed : Un bot n'a pas réussi à rejoindre un meeting
- 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 paramétrage
Configurer l'endpoint webhook
Voici un exemple de configuration d'une URL de webhook pour les événements de meeting :
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 des événements webhook
Voici des exemples de payloads d'événements webhook :
Ces exemples JSON montrent le format des notifications d'événements de démarrage et de fin de meeting.
Événement de fin de meeting
{
"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 d'échec de meeting
{
"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':
# Handle meeting completion
bot_id = event_data['data']['bot_id']
transcript = event_data['data']['transcript']
recording_url = event_data['data']['mp4']
# Process the meeting data
process_meeting_completion(bot_id, transcript, recording_url)
elif event_data['event'] == 'failed':
# Handle meeting failure
bot_id = event_data['data']['bot_id']
error = event_data['data']['error']
message = event_data['data']['message']
# Log the failure
log_meeting_failure(bot_id, error, message)
return jsonify({"status": "success"}), 200
def process_meeting_completion(bot_id, transcript, recording_url):
# Your custom logic here
print(f"Meeting {bot_id} completed")
print(f"Recording available at: {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()
# Process different event types
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']
# Your custom logic here
print(f"Meeting {bot_id} completed")
print(f"Recording available at: {recording_url}")
async def handle_meeting_failure(data):
bot_id = data['bot_id']
error = data['error']
message = data['message']
# Your custom logic here
print(f"Meeting {bot_id} failed: {error} - {message}")
async def handle_transcription_complete(data):
bot_id = data['bot_id']
# Your custom logic here
print(f"Transcription completed for meeting {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(`Meeting ${bot_id} completed`);
console.log(`Recording available at: ${mp4}`);
// Your custom logic here
// e.g., save to database, send notifications, etc.
}
function handleMeetingFailure(data) {
const { bot_id, error, message } = data;
console.log(`Meeting ${bot_id} failed: ${error} - ${message}`);
// Your custom logic here
// e.g., retry logic, alert notifications, etc.
}
function handleTranscriptionComplete(data) {
const { bot_id } = data;
console.log(`Transcription completed for meeting ${bot_id}`);
// Your custom logic here
// e.g., process transcript, update database, etc.
}
app.listen(3000, () => {
console.log('Webhook server running on port 3000');
});Bonnes pratiques
Sécurité
- Vérifiez toujours les signatures des webhooks
- Utilisez des endpoints HTTPS
- Implémentez le rate limiting
- Validez les données des événements
Fiabilité
- Renvoyez rapidement des codes de statut 200
- Implémentez l'idempotence
- Gérez les événements en double
- Configurez la surveillance et les alertes
Gestion des erreurs
- Loggez tous les événements webhook
- Implémentez une logique de nouvelle tentative pour les échecs
- Configurez des files d'attente de lettres mortes
- Surveillez le statut de livraison des webhooks
Commencer
Prêt à intégrer les notifications de meeting en temps réel ? Consultez nos ressources complètes :