### Automated GPU/CPU Setup Script Source: https://docs.vexa.ai/deployment Use this script for a fresh cloud VM setup. It automates the installation of Docker and Vexa. Specify --gpu or --cpu based on your host. ```bash git clone https://github.com/Vexa-ai/vexa.git && cd vexa sudo ./deploy/scripts/fresh_setup.sh --gpu # or --cpu for CPU-only hosts cp deploy/env-example .env # Edit .env make all ``` -------------------------------- ### Local Development Setup for Vexa Dashboard Source: https://docs.vexa.ai/ui-dashboard Follow these steps to set up the Vexa Dashboard for local development. This involves cloning the repository, installing dependencies, configuring environment variables, and starting the development server. ```bash git clone https://github.com/Vexa-ai/vexa.git cd vexa/services/dashboard npm install cp .env.example .env.local # edit .env.local: VEXA_API_URL + VEXA_ADMIN_API_KEY npm run dev ``` -------------------------------- ### Complete Workflow Example via curl Source: https://docs.vexa.ai/self-hosted-management A comprehensive example demonstrating the creation of a user, generation of an API token, and testing user API access using curl. It utilizes jq for parsing JSON responses. ```bash # Step 1: Create user USER_RESPONSE=$(curl -s -X POST http://localhost:8056/admin/users \ -H "Content-Type: application/json" \ -H "X-Admin-API-Key: token" \ -d '{ "email": "newuser@example.com", "name": "New User", "max_concurrent_bots": 2 }') USER_ID=$(echo $USER_RESPONSE | jq -r '.id') echo "Created user with ID: $USER_ID" # Step 2: Generate API token TOKEN_RESPONSE=$(curl -s -X POST http://localhost:8056/admin/users/${USER_ID}/tokens \ -H "X-Admin-API-Key: token") API_TOKEN=$(echo $TOKEN_RESPONSE | jq -r '.token') echo "Generated token: $API_TOKEN" # Step 3: Test user API access curl -X GET "http://localhost:8056/meetings" \ -H "X-API-Key: $API_TOKEN" ``` -------------------------------- ### Install Vexa Python Client Source: https://docs.vexa.ai/self-hosted-management Install the Vexa Python client library using pip. This is required for using the Python examples. ```bash pip install vexa-client ``` -------------------------------- ### Install NVIDIA Container Toolkit for GPU Deployment Source: https://docs.vexa.ai/deployment Installs the NVIDIA Container Toolkit necessary for GPU acceleration. Ensure `nvidia-smi` works before proceeding. ```bash curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \ sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg ``` ```bash curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list ``` ```bash sudo apt update && sudo apt install -y nvidia-container-toolkit ``` ```bash sudo nvidia-ctk runtime configure --runtime=docker ``` ```bash sudo systemctl restart docker ``` -------------------------------- ### Kubernetes Helm Install and Upgrade Source: https://docs.vexa.ai/scaling Use these commands to install or upgrade Vexa using Helm charts. Ensure you have a `your-values.yaml` file configured for your deployment. ```bash helm install vexa deploy/helm/charts/vexa \ -f your-values.yaml \ --namespace vexa --create-namespace ``` ```bash helm upgrade vexa deploy/helm/charts/vexa \ -f your-values.yaml \ --namespace vexa ``` -------------------------------- ### Install Docker Engine and Compose Plugin (Ubuntu/Debian) Source: https://docs.vexa.ai/deployment Installs Docker Engine and the Compose V2 plugin on Ubuntu/Debian systems. This is a prerequisite for running Docker Compose. ```bash # Prerequisites sudo apt update && sudo apt install -y \ python3 python3-pip python-is-python3 python3-venv \ make git curl jq ca-certificates gnupg # Docker Engine + Compose v2 sudo apt remove -y docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc || true sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update && sudo apt install -y \ docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker ``` -------------------------------- ### Environment Variables Setup Source: https://docs.vexa.ai/websocket Sets up essential environment variables for the application, including API base URL, WebSocket URL, and API key. ```bash export API_BASE="http://localhost:8056" export WS_URL="ws://localhost:8056/ws" export API_KEY="your_api_key_here" ``` -------------------------------- ### Example Scoped Tokens Source: https://docs.vexa.ai/token-scoping Illustrates the format of scoped tokens for different access levels. ```text vxa_bot_VDXyV683YBvsCRrlUtnWWKLC0qTtGNaxGgVS8F5s — bot scope ``` ```text vxa_tx_eFgh1234abcd5678... — transcription scope ``` ```text vxa_browser_xyz789... — browser scope ``` -------------------------------- ### Complete Workflow Example via Python Source: https://docs.vexa.ai/self-hosted-management Demonstrates the full user and token management workflow using the Vexa Python client. It includes creating a user, generating a token, and then using a new client instance with the API key to access user-specific endpoints. ```python from vexa_client import VexaClient # Step 1: Create user admin_client = VexaClient(base_url="http://localhost:8056", admin_key="token") user = admin_client.create_user( email="newuser@example.com", name="New User", max_concurrent_bots=2 ) print(f"✓ Created user: {user['email']}") # Step 2: Generate token token_info = admin_client.create_token(user_id=user['id']) api_token = token_info['token'] print(f"✓ Generated token: {api_token}") # Step 3: Test user access user_client = VexaClient(base_url="http://localhost:8056", api_key=api_token) meetings = user_client.get_meetings() print(f"✓ User API access working!") ``` -------------------------------- ### Set up Local PostgreSQL Database Source: https://docs.vexa.ai/vexa-lite-deployment Create a Docker network and run a PostgreSQL container for Vexa Lite. This setup is for local development and requires Vexa Lite to be connected to the same network with the correct database host. ```bash docker network create vexa-network docker run -d \ --name vexa-postgres \ --network vexa-network \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=your_password \ -e POSTGRES_DB=vexa \ -p 5432:5432 \ postgres:latest ``` -------------------------------- ### Clone Vexa Repository and Build Source: https://docs.vexa.ai/deployment Clones the Vexa repository, copies the environment example, and builds the project. Ensure you are in the cloned directory for subsequent commands. ```bash git clone https://github.com/Vexa-ai/vexa.git && cd vexa ``` ```bash cp deploy/env-example .env ``` ```bash make all ``` -------------------------------- ### Clone Vexa and Set Up Environment Variables Source: https://docs.vexa.ai/deployment Clone the Vexa repository and copy the environment example file. You must edit the .env file to set your transcription service URL and token before building. ```bash git clone https://github.com/Vexa-ai/vexa.git && cd vexa cp deploy/env-example .env # Edit .env — set TRANSCRIPTION_SERVICE_URL and TRANSCRIPTION_SERVICE_TOKEN make all ``` -------------------------------- ### Example Usage: Real-time Transcription Script Source: https://docs.vexa.ai/websocket Demonstrates how to run the real-time transcription script with basic and debug mode options. Requires setting environment variables beforehand. ```bash # Basic usage python testing/ws_realtime_transcription.py \ --api-base http://localhost:8056 \ --ws-url ws://localhost:8056/ws \ --api-key $API_KEY \ --platform google_meet \ --native-id abc-defg-hij # Debug mode (show raw frames) python testing/ws_realtime_transcription.py \ --api-base http://localhost:8056 \ --ws-url ws://localhost:8056/ws \ --api-key $API_KEY \ --platform google_meet \ --native-id abc-defg-hij \ --raw ``` -------------------------------- ### Example Log File Line Source: https://docs.vexa.ai/websocket Illustrates the format of a log file entry when the WebSocket messages are being recorded, useful for debugging message flow. ```log 2025-10-04T14:50:35.101823 - {"type": "transcript.mutable", "meeting": {"platform": "google_meet", "native_id": "tys-tztv-nrj"}, "payload": {"segments": [...]}, "ts": "2025-10-04T11:50:35.100142+00:00"} ``` -------------------------------- ### Starting a Bot Source: https://docs.vexa.ai/websocket Initiates a transcription bot for a meeting. Requires the meeting bot to be running and active. ```APIDOC ## POST /bots ### Description Starts a transcription bot for a meeting. ### Method POST ### Endpoint /bots ### Parameters #### Headers - **X-API-Key** (string) - Required - Your API key for authentication. #### Request Body - **platform** (string) - Required - The platform of the meeting (e.g., `google_meet`, `teams`). - **native_meeting_id** (string) - Required - The unique identifier for the meeting on its native platform. - **passcode** (string) - Optional - The passcode for the meeting, required for platforms like Microsoft Teams. ### Request Example ```json { "platform": "google_meet", "native_meeting_id": "your-meeting-id" } ``` ```json { "platform": "teams", "native_meeting_id": "1234567890123", "passcode": "YOUR_PASSCODE" } ``` ``` -------------------------------- ### GET /recording-config Source: https://docs.vexa.ai/api/settings Retrieves the current default recording configuration for the user. ```APIDOC ## GET /recording-config ### Description Get your default recording configuration. ### Method GET ### Endpoint /recording-config ### Response #### Success Response (200) - **enabled** (bool) - Indicates if recording is enabled. - **capture_modes** (string[]) - List of capture modes. #### Response Example { "enabled": true, "capture_modes": ["audio"] } ``` -------------------------------- ### Bot Creation Response (201) Source: https://docs.vexa.ai/api/bots Example of a successful bot creation response, including meeting details and status. ```json { "id": 219, "user_id": 4, "platform": "google_meet", "native_meeting_id": "abc-defg-hij", "constructed_meeting_url": "https://meet.google.com/abc-defg-hij", "status": "requested", "bot_container_id": "d21c5b0c5275...c9fe9333", "start_time": null, "end_time": null, "data": {}, "created_at": "2026-02-16T17:42:33.524137", "updated_at": "2026-02-16T17:42:33.535113" } ``` -------------------------------- ### Get Recording Configuration Source: https://docs.vexa.ai/vexa-mcp Retrieves the user's default recording settings. ```APIDOC ## GET /recording-config ### Description Get the user's default recording settings. ### Method GET ### Endpoint /recording-config ``` -------------------------------- ### Get Recording Configuration Source: https://docs.vexa.ai/api/settings Retrieve the current default recording settings for the user. This configuration applies to all new bots unless overridden. ```bash curl -H "X-API-Key: $API_KEY" \ "$API_BASE/recording-config" ``` -------------------------------- ### Compare Environment Variables Source: https://docs.vexa.ai/changelog Use the diff command to compare your current .env file with the example provided in the deploy directory. This helps identify new or changed environment variables required for the new version. ```bash diff .env deploy/env-example ``` -------------------------------- ### macOS CPU-only Deployment Setup Source: https://docs.vexa.ai/deployment Sets up Vexa for macOS using CPU only. Requires Docker Desktop. Remember to edit the `.env` file to set `TRANSCRIPTION_SERVICE_URL`. ```bash git clone https://github.com/Vexa-ai/vexa.git && cd vexa ``` ```bash cp deploy/env-example .env ``` ```bash # Edit .env — set TRANSCRIPTION_SERVICE_URL ``` ```bash make all ``` -------------------------------- ### Make a User API Request with API Key Source: https://docs.vexa.ai/authentication Use the `X-API-Key` header for all user-facing API requests. Get your API key from vexa.ai/account. ```bash curl -H "X-API-Key: YOUR_API_KEY" \ "https://api.cloud.vexa.ai/bots" ``` -------------------------------- ### Paginate List Endpoints Source: https://docs.vexa.ai/user_api_guide Use 'limit' and 'offset' query parameters to control the number of items returned and the starting point for lists. Adjust 'limit' for desired page size and 'offset' to skip items. ```bash GET /recordings?limit=50&offset=0 ``` ```bash GET /meetings?limit=100&offset=0 ``` -------------------------------- ### Start Screen Share Source: https://docs.vexa.ai/api/interactive-bots Initiates a screen share within a meeting, allowing you to display images, web pages, videos, or custom HTML content to participants. ```APIDOC ## POST /bots/{platform}/{native_meeting_id}/screen ### Description Show content via screen share. Content is rendered on an Xvfb display (1920x1080), then the bot starts presenting. ### Method POST ### Endpoint `/bots/{platform}/{native_meeting_id}/screen` ### Parameters #### Path Parameters - **platform** (string) - Required - The platform of the meeting (e.g., google_meet). - **native_meeting_id** (string) - Required - The unique identifier for the meeting on the specified platform. #### Request Body - **type** (string) - Required - Content type: `image`, `url`, `video`, or `html`. - **url** (string) - Required for `image`, `url`, `video` - The URL of the content to share. - **html** (string) - Required for `html` - Raw HTML content to render. - **start_share** (bool) - Optional - Defaults to `true`. Auto-starts screen sharing if not already active. ### Request Example ```json { "type": "image", "url": "https://example.com/quarterly-chart.png" } ``` ### Response #### Success Response (200) - **message** (string) - Confirmation message that the command was sent. - **meeting_id** (integer) - Internal Vexa meeting ID. #### Response Example ```json { "message": "Screen content command sent", "meeting_id": 220 } ``` #### Validation Error (400) - **detail** (string) - Error message indicating validation failure (e.g., invalid type). #### Response Example ```json { "detail": "type must be one of: image, video, url, html" } ``` ``` -------------------------------- ### Running Bots Status Response (200) Source: https://docs.vexa.ai/api/bots Example response detailing the status of running bots, including container information and meeting IDs. ```json { "running_bots": [ { "container_id": "d21c5b0c5275...c9fe9333", "container_name": "vexa-bot-219-fd0a58fb", "platform": "google_meet", "native_meeting_id": "abc-defg-hij", "status": "Up 4 seconds", "normalized_status": "Up", "created_at": "2026-02-16T17:42:33+00:00", "labels": { "vexa.user_id": "4" }, "meeting_id_from_name": "219" } ] } ``` -------------------------------- ### List All Users via curl Source: https://docs.vexa.ai/self-hosted-management Retrieve a list of all users with optional pagination parameters (skip and limit) by sending a GET request to the /admin/users endpoint. The X-Admin-API-Key header must be included. ```bash curl -X GET "http://localhost:8056/admin/users?skip=0&limit=100" \ -H "X-Admin-API-Key: token" ``` -------------------------------- ### Set up PostgreSQL for Vexa Lite Source: https://docs.vexa.ai/deployment Creates a Docker network and runs a PostgreSQL container for Vexa Lite. Ensure you replace `your_password` with a strong password. ```bash docker network create vexa-network ``` ```bash docker run -d \ --name vexa-postgres \ --network vexa-network \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=your_password \ -e POSTGRES_DB=vexa \ -p 5432:5432 \ postgres:latest ``` -------------------------------- ### Get User by Email via curl Source: https://docs.vexa.ai/self-hosted-management Retrieve user information by their email address using a GET request to the /admin/users/email/{email} endpoint. Requires the X-Admin-API-Key header. ```bash curl -X GET "http://localhost:8056/admin/users/email/user@example.com" \ -H "X-Admin-API-Key: token" ``` -------------------------------- ### Get Chat Messages Response Source: https://docs.vexa.ai/api/interactive-bots To retrieve chat messages, a GET request is made to the chat endpoint. The API returns a 200 OK status with a JSON object containing an array of messages. ```json { "messages": [...], "meeting_id": 220 } ``` -------------------------------- ### Get User by ID via curl Source: https://docs.vexa.ai/self-hosted-management Fetch detailed user information, including API tokens, by their unique ID using a GET request to the /admin/users/{id} endpoint. The X-Admin-API-Key header is necessary. ```bash curl -X GET "http://localhost:8056/admin/users/1" \ -H "X-Admin-API-Key: token" ``` -------------------------------- ### Run Vexa Lite with Local Database Source: https://docs.vexa.ai/vexa-lite-deployment Set up a local PostgreSQL database and then deploy Vexa Lite, connecting to the local database via a Docker network. The container automatically runs database migrations on startup. ```bash # Create network docker network create vexa-network # Start PostgreSQL docker run -d \ --name vexa-postgres \ --network vexa-network \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=your_password \ -e POSTGRES_DB=vexa \ -p 5432:5432 \ postgres:latest # Start Vexa Lite docker run -d \ --name vexa \ --network vexa-network \ -p 8056:8056 \ -e DATABASE_URL="postgresql://postgres:your_password@vexa-postgres:5432/vexa" \ -e ADMIN_API_TOKEN="your-secret-admin-token" \ -e TRANSCRIPTION_SERVICE_URL="https://transcription.vexa.ai/v1/audio/transcriptions" \ -e TRANSCRIPTION_SERVICE_TOKEN="your-transcription-api-key" \ -e OPENAI_API_KEY="sk-your-openai-key" \ vexaai/vexa-lite:latest ``` -------------------------------- ### Get a specific recording Source: https://docs.vexa.ai/user_api_guide Retrieves details for a specific recording by its ID. ```APIDOC ## GET /recordings/{recording_id} ### Description Retrieve details for a specific recording. ### Method GET ### Endpoint /recordings/{recording_id} ### Parameters #### Path Parameters - **recording_id** (string) - Required - The unique identifier for the recording. ### Response #### Success Response (200) - **recording_id** (string) - The unique identifier for the recording. - **meeting_id** (string) - The identifier of the meeting associated with the recording. - **start_time** (string) - The start time of the recording. - **end_time** (string) - The end time of the recording. - **media_files** (array) - Information about the media files associated with the recording. ``` -------------------------------- ### Get Recording Source: https://docs.vexa.ai/api/recordings Retrieves a specific recording and its associated media files by its ID. ```APIDOC ## GET /recordings/{recording_id} ### Description Get a recording and its `media_files`. ### Method GET ### Endpoint /recordings/{recording_id} ### Request Example ```bash curl -H "X-API-Key: $API_KEY" \ "$API_BASE/recordings/123456789" ``` ### Response (200) - **id** (integer) - The unique identifier for the recording. - **meeting_id** (integer) - The ID of the meeting associated with the recording. - **user_id** (integer) - The ID of the user who owns the recording. - **session_uid** (string) - The unique identifier for the session. - **source** (string) - The source of the recording (e.g., "bot"). - **status** (string) - The status of the recording (e.g., "completed"). - **error_message** (string) - An error message if the recording failed. - **created_at** (string) - The timestamp when the recording was created. - **completed_at** (string) - The timestamp when the recording was completed. - **media_files** (array) - An array of media files associated with the recording. ### Response Example ```json { "id": 906238426347, "meeting_id": 16, "user_id": 1, "session_uid": "d6e337d6-92cd-452f-b003-23c5498091ef", "source": "bot", "status": "completed", "error_message": null, "created_at": "2026-02-13T20:10:20Z", "completed_at": "2026-02-13T20:44:55Z", "media_files": [ { "id": 906238426348, "type": "audio", "format": "wav", "storage_backend": "s3", "file_size_bytes": 1234567, "duration_seconds": 2079.2, "metadata": { "sample_rate": 16000 }, "created_at": "2026-02-13T20:44:55Z" } ] } ``` ``` -------------------------------- ### Check Bot Status Source: https://docs.vexa.ai/vexa-mcp Retrieve the current status of all running bots. This is a simple GET request. ```json GET /bot-status ``` -------------------------------- ### Verify Vexa Services and API Source: https://docs.vexa.ai/changelog After rebuilding and restarting, use 'make ps' to check if all services are running. Then, use curl to test the API by accessing the documentation endpoint. ```bash # Check services are running make ps # Quick API test curl http://localhost:8056/docs ``` -------------------------------- ### Build Vexa Lite Image from Source Source: https://docs.vexa.ai/vexa-lite-deployment Clone the Vexa repository and build the Vexa Lite Docker image locally using make commands. This process generates a 'vexa-lite:dev' image. ```bash git clone https://github.com/Vexa-ai/vexa.git cd vexa/deploy/lite make build ``` -------------------------------- ### Get User by Email Source: https://docs.vexa.ai/self-hosted-management Retrieves user information by their email address. Requires an Admin API Key. ```APIDOC ## GET /admin/users/email/{EMAIL} ### Description Retrieve a user's information using their email address. ### Method GET ### Endpoint `http://localhost:8056/admin/users/email/{EMAIL}` ### Parameters #### Path Parameters - **EMAIL** (string) - Required - The email address of the user to retrieve. ### Headers - `X-Admin-API-Key`: (string) Your admin API token ### Response #### Success Response (200 OK) - **id** (integer) - Unique identifier for the user - **email** (string) - User's email address - **name** (string) - User's display name - **max_concurrent_bots** (integer) - Maximum concurrent bots allowed - **created_at** (string) - Timestamp of user creation (ISO 8601 format) #### Response Example ```json { "id": 1, "email": "user@example.com", "name": "John Doe", "max_concurrent_bots": 2, "created_at": "2025-10-10T12:00:00Z" } ``` ``` -------------------------------- ### Create a User via Admin API Source: https://docs.vexa.ai/authentication For self-hosted deployments, create users using the Admin API. Ensure the `$ADMIN_TOKEN` environment variable is set. ```bash # Create a user curl -X POST "http://localhost:8056/admin/users" \ -H "Content-Type: application/json" \ -H "X-Admin-API-Key: $ADMIN_TOKEN" \ -d '{"email": "user@example.com", "name": "User", "max_concurrent_bots": 5}' ``` -------------------------------- ### Sort Segments by Start Time Source: https://docs.vexa.ai/websocket Sorts the processed transcript segments in ascending order based on their 'absolute_start_time'. ```python sorted_segments = sorted( transcript_by_abs_start.values(), key=lambda s: s['absolute_start_time'] ) ``` -------------------------------- ### Render Custom HTML via Screen Share Source: https://docs.vexa.ai/api/interactive-bots Initiate a screen share to render custom HTML content. Requires the platform and native meeting ID. ```bash curl -X POST "$API_BASE/bots/google_meet/abc-defg-hij/screen" \ -H "Content-Type: application/json" \ -H "X-API-Key: $API_KEY" \ -d '{"type": "html", "html": "