API de Webhooks
Notificações de Eventos de Reunião em Tempo Real
A API de Webhooks permite notificações em tempo real para eventos de reunião, possibilitando que suas aplicações recebam atualizações sobre inícios de reuniões, conclusões, eventos de transcrição e muito mais.
- Receba notificações de reuniões em tempo real
- Integre com suas ferramentas de workflow existentes
- Crie handlers de eventos personalizados para eventos de reunião
- Automatize processos pós-reunião
Os webhooks oferecem uma maneira poderosa de criar aplicações responsivas que reagem a eventos do ciclo de vida das reuniões sem polling constante, permitindo integrações eficientes com CRMs, plataformas de análise e outros sistemas de negócios.
Principais Funcionalidades
- Eventos do Ciclo de Vida da Reunião: Receba notificações para inícios, conclusões e falhas de reuniões
- Eventos de Transcrição: Receba atualizações quando a transcrição estiver disponível ou atualizada
- Eventos de Calendário: Notificações para alterações e sincronização de calendário
- Mecanismo de Retry: Endpoint da API para reenviar entregas de webhook com falha
- Endpoints Personalizáveis: Defina diferentes URLs de webhook para diferentes tipos de eventos
- Filtragem de Eventos: Controle quais eventos acionam notificações
Tipos de Eventos de Webhook
Os webhooks do Meeting BaaS entregam os seguintes tipos de eventos:
- meeting.started: Um bot ingressou com sucesso em uma reunião
- meeting.completed: Uma reunião foi encerrada e as gravações estão disponíveis
- meeting.failed: Um bot falhou ao ingressar em uma reunião
- transcription.available: A transcrição inicial está disponível
- transcription.updated: A transcrição foi atualizada ou refinada
- calendar.synced: Um calendário foi sincronizado
- event.added: Um novo evento de calendário foi detectado
- event.updated: Um evento de calendário foi atualizado
- event.deleted: Um evento de calendário foi removido
Configuração e Instalação
Configurar Endpoint de Webhook
Veja um exemplo de como configurar uma URL de webhook para eventos de reunião:
Esta configuração JSON mostra como configurar um endpoint de webhook na sua conta do 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
}Listar Endpoints de Webhook
curl -X GET "https://api.meetingbaas.com/bots/webhooks/bot" \
-H "x-meeting-baas-api-key: <token>"Formatos de Eventos de Webhook
Veja exemplos de payloads de eventos de webhook:
Estes exemplos JSON mostram o formato das notificações de eventos de reunião iniciada e concluída.
Evento de Reunião Concluída
{
"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"
}
}Evento de Falha na Reunião
{
"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"
}
}Evento de Transcrição Concluída
{
"event": "transcription_complete",
"data": {
"bot_id": "123e4567-e89b-12d3-a456-426614174000"
}
}Exemplos de Implementação
Handler de Webhook em 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}")Handler de Webhook em 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');
});Boas Práticas
Segurança
- Sempre verifique as assinaturas do webhook
- Use endpoints HTTPS
- Implemente rate limiting
- Valide os dados do evento
Confiabilidade
- Retorne códigos de status 200 rapidamente
- Implemente idempotência
- Trate eventos duplicados
- Configure monitoramento e alertas
Tratamento de Erros
- Registre todos os eventos de webhook nos logs
- Implemente lógica de retry para falhas
- Configure dead letter queues
- Monitore o status de entrega dos webhooks
Primeiros Passos
Pronto para integrar notificações de reuniões em tempo real? Confira nossos recursos abrangentes: