Skip to main content
Deploy Vexa yourself for full control over your data and infrastructure. This guide walks through the full self-hosted lifecycle.

Just want to try the API?

Use the hosted service — no deployment needed.

1) Choose a Deployment

OptionBest forGuide
Vexa LiteProduction — single container + external Postgres + remote transcriptionDeploy Vexa Lite
Docker ComposeDevelopment/testing — full local stackDocker Compose setup

2) Create Users and API Tokens

Once your instance is running, use the Admin API to create users and mint API tokens.
export API_BASE="http://localhost:8056"
export ADMIN_TOKEN="your-admin-api-token"

# Create a user
curl -X POST "$API_BASE/admin/users" \
  -H "Content-Type: application/json" \
  -H "X-Admin-API-Key: $ADMIN_TOKEN" \
  -d '{"email": "user@example.com", "name": "User", "max_concurrent_bots": 2}'

# Generate an API token for the user (save it — cannot be retrieved later)
curl -X POST "$API_BASE/admin/users/1/tokens" \
  -H "X-Admin-API-Key: $ADMIN_TOKEN"
Full admin guide: Admin API

3) Send a Bot to a Meeting

export API_KEY="YOUR_USER_API_TOKEN"

Google Meet

curl -X POST "$API_BASE/bots" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $API_KEY" \
  -d '{
    "platform": "google_meet",
    "native_meeting_id": "abc-defg-hij",
    "recording_enabled": true,
    "transcribe_enabled": true,
    "transcription_tier": "realtime"
  }'

Microsoft Teams

Teams requires the numeric meeting ID (not the full URL). If your Teams URL contains ?p=..., pass it as passcode.
curl -X POST "$API_BASE/bots" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $API_KEY" \
  -d '{
    "platform": "teams",
    "native_meeting_id": "1234567890123",
    "passcode": "YOUR_TEAMS_P_VALUE",
    "recording_enabled": true,
    "transcribe_enabled": true,
    "transcription_tier": "realtime"
  }'

Zoom

Zoom requires extra setup and (typically) Marketplace approval. See: Zoom Integration Setup Guide
curl -X POST "$API_BASE/bots" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $API_KEY" \
  -d '{
    "platform": "zoom",
    "native_meeting_id": "YOUR_MEETING_ID",
    "passcode": "YOUR_PWD",
    "recording_enabled": true,
    "transcribe_enabled": true,
    "transcription_tier": "realtime"
  }'
Full API details: API overview

4) Watch Transcripts (REST + WebSocket)

REST

curl -H "X-API-Key: $API_KEY" \
  "$API_BASE/transcripts/google_meet/abc-defg-hij"
Use the WebSocket guide for low-latency updates:

5) Stop the Bot

curl -X DELETE \
  -H "X-API-Key: $API_KEY" \
  "$API_BASE/bots/google_meet/abc-defg-hij"

6) Post-Meeting: Recording & Playback

If recording is enabled and a recording was captured, GET /transcripts/{platform}/{native_meeting_id} includes a recordings array. Playback/streaming options:
  • /recordings/{recording_id}/media/{media_file_id}/raw (authenticated streaming; supports Range/206 seeking)
  • /recordings/{recording_id}/media/{media_file_id}/download (presigned URL for object storage backends)
Storage configuration and playback behavior: Recording storage

7) Cleanup: Delete/Anonymize a Meeting

curl -X DELETE \
  -H "X-API-Key: $API_KEY" \
  "$API_BASE/meetings/google_meet/abc-defg-hij"
This purges transcript artifacts and recording objects (best-effort) and anonymizes the meeting for telemetry.

8) Use the Dashboard (optional)

For a web UI to join meetings, view live transcripts, and review history, use the open-source Vexa Dashboard: