Meeting Intelligence API (v1)
March 7, 2026 ยท View on GitHub
Design metadata:
design_created: 2026-02-23moved_to_docs_design: 2026-02-24original_location: historical API-related path (moved during docs reorganization)
Meeting Intelligence v1 is exposed under /api/v1/meetings and provides:
- Meeting sessions, templates, and artifacts CRUD.
- Finalization from transcript text to summary/action artifacts.
- Live updates via SSE and WebSocket.
- Sharing to Slack incoming webhooks and generic webhooks.
Auth
Use the same auth model as the rest of the API:
- Single-user:
X-API-KEY - Multi-user:
Authorization: Bearer <token>
Endpoints
Health:
GET /api/v1/meetings/health
Sessions:
POST /api/v1/meetings/sessionsGET /api/v1/meetings/sessionsGET /api/v1/meetings/sessions/{session_id}POST /api/v1/meetings/sessions/{session_id}/status
Templates:
POST /api/v1/meetings/templatesGET /api/v1/meetings/templatesGET /api/v1/meetings/templates/{template_id}
Artifacts:
POST /api/v1/meetings/sessions/{session_id}/artifactsGET /api/v1/meetings/sessions/{session_id}/artifactsPOST /api/v1/meetings/sessions/{session_id}/commit
Sharing:
POST /api/v1/meetings/sessions/{session_id}/share/slackPOST /api/v1/meetings/sessions/{session_id}/share/webhook
Live transport:
GET /api/v1/meetings/sessions/{session_id}/events(SSE)WS /api/v1/meetings/sessions/{session_id}/stream
Key Request Models
Create session:
{
"title": "Weekly Product Sync",
"meeting_type": "standup",
"source_type": "upload",
"language": "en"
}
Finalize/commit:
{
"transcript_text": "TODO: Alice updates API docs. DECISION: Ship in two phases.",
"include": ["summary", "action_items", "decisions", "speaker_stats"]
}
Share (Slack/webhook):
{
"webhook_url": "https://hooks.example.test/meeting",
"artifact_ids": ["art_123", "art_456"]
}
Event Envelope
SSE and WS use the same event shape:
{
"id": "evt_...",
"type": "artifact.ready",
"session_id": "sess_...",
"timestamp": "2026-02-23T00:00:00+00:00",
"data": {}
}
Current event types:
session.createdsession.statusartifact.readytranscript.partialtranscript.finalintegration.queuedintegration.retryingintegration.deliveredintegration.failedstream.complete
ID conventions:
idusesevt_<opaque-id>and is globally unique + immutable.session_idusessess_<opaque-id>and is globally unique + immutable.artifact_ids[]useart_<opaque-id>and are stable handles for persisted artifacts.- Opaque IDs may be UUID-, ULID-, or snowflake-like tokens, but the prefixes above are required for validation and routing contracts.
Sharing Worker and Retries
Queued dispatches are persisted in meeting_integration_dispatch and retried by:
tldw_Server_API/app/services/meetings_webhook_dlq_service.py
Worker controls:
MEETINGS_WEBHOOK_DLQ_ENABLED(bool, default:false)MEETINGS_WEBHOOK_DLQ_INTERVAL_SEC(intseconds, default:15)MEETINGS_WEBHOOK_DLQ_BATCH(intcount, default:25)MEETINGS_WEBHOOK_DLQ_TIMEOUT_SEC(floatseconds, default:10)MEETINGS_WEBHOOK_DLQ_MAX_ATTEMPTS(intcount, default:8)MEETINGS_WEBHOOK_DLQ_BASE_SEC(intseconds, default:30)MEETINGS_WEBHOOK_DLQ_MAX_BACKOFF_SEC(intseconds, default:3600)
Webhook delivery security requirements:
- Validate and normalize submitted URLs before any network call: hostname must be present, hostname is normalized (IDNA/lowercase/trailing-dot handling), and invalid ports are rejected.
- Enforce allowed schemes for webhook dispatches (
httpsrequired for production targets) and disallow protocol downgrade across retries/redirect paths. - Block private/local destinations by policy (
RFC1918, loopback/localhost, link-local, multicast, reserved ranges, and IPv6 equivalents) prior to send. - Apply DNS rebinding protection by resolving hostnames and re-evaluating resolved IPs on each retry attempt; if resolution fails or returns blocked ranges, mark dispatch as policy-denied.
- Do not auto-follow redirects for webhook dispatches (
follow_redirects=Falsein the shared HTTP client path); if redirect handling is introduced later, cap redirect count and re-run egress checks on each hop. - Enforce bounded connection/read timeouts via
MEETINGS_WEBHOOK_DLQ_TIMEOUT_SECand bounded retry/backoff viaMEETINGS_WEBHOOK_DLQ_MAX_ATTEMPTS,MEETINGS_WEBHOOK_DLQ_BASE_SEC, andMEETINGS_WEBHOOK_DLQ_MAX_BACKOFF_SEC. - Log and metricize policy denials, retries, deliveries, and terminal failures so operators can audit delivery decisions.
The worker marks dispatch rows as delivered, retrying, or failed after each attempt.
Current v1 Limits
- Integrations are limited to Slack incoming webhooks and generic webhooks.
- No calendar ingestion or conferencing connectors in this version.
- Finalize artifacts are deterministic/basic (summary/action/decision/stats) and can be expanded in later phases.