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_config.json
{
  "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

list_webhooks.sh
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

meeting_completed.json
{
  "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

meeting_failed.json
{
  "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

transcription_complete.json
{
  "event": "transcription_complete",
  "data": {
    "bot_id": "123e4567-e89b-12d3-a456-426614174000"
  }
}

Exemples d'implémentation

Gestionnaire webhook Python

webhook_handler_flask.py
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)
webhook_handler_fastapi.py
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

webhook_handler_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
Meeting BaaS API Preview Features

Commencer

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