{"id":30351594,"url":"https://github.com/zoom/rtms","last_synced_at":"2026-04-16T13:02:47.277Z","repository":{"id":297152435,"uuid":"926304076","full_name":"zoom/rtms","owner":"zoom","description":"Cross-platform wrapper for the Zoom RTMS C SDK, providing bindings for Node.js, Python, and Go","archived":false,"fork":false,"pushed_at":"2026-04-15T20:29:32.000Z","size":1274,"stargazers_count":35,"open_issues_count":13,"forks_count":13,"subscribers_count":20,"default_branch":"main","last_synced_at":"2026-04-15T22:25:05.631Z","etag":null,"topics":["events","go","meetings","node-addon-api","nodejs","pybind11","python","realtime","sdk","streaming","zoom"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zoom.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-03T02:02:56.000Z","updated_at":"2026-03-31T23:38:54.000Z","dependencies_parsed_at":"2025-06-04T10:26:07.699Z","dependency_job_id":"c98ec398-5b6c-415d-8cad-5eadb3ebf92e","html_url":"https://github.com/zoom/rtms","commit_stats":null,"previous_names":["zoom/rtms"],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/zoom/rtms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Frtms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Frtms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Frtms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Frtms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zoom","download_url":"https://codeload.github.com/zoom/rtms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Frtms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31886937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T11:36:10.202Z","status":"ssl_error","status_checked_at":"2026-04-16T11:36:09.652Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["events","go","meetings","node-addon-api","nodejs","pybind11","python","realtime","sdk","streaming","zoom"],"created_at":"2025-08-18T23:09:49.308Z","updated_at":"2026-04-16T13:02:47.271Z","avatar_url":"https://github.com/zoom.png","language":"C++","readme":"# Zoom Realtime Media Streams (RTMS) SDK\n\nBindings for real-time audio, video, and transcript streams from Zoom Meetings\n\n[![npm](https://img.shields.io/npm/v/@zoom/rtms)](https://www.npmjs.com/package/@zoom/rtms)\n[![PyPI](https://img.shields.io/pypi/v/rtms)](https://pypi.org/project/rtms/)\n[![docs](https://img.shields.io/badge/docs-online-blue)](https://zoom.github.io/rtms/)\n\n## Supported Products\n\nThe RTMS SDK works with multiple Zoom products:\n\n- **[Zoom Meetings](examples/meetings.md)** - Real-time streams from Zoom Meetings\n- **[Zoom Webinars](examples/webinars.md)** - Broadcast-quality streams from Zoom Webinars\n- **[Zoom Video SDK](examples/videosdk.md)** - Custom video experiences with RTMS access\n- **[Zoom Contact Center](examples/zcc.md)** - Real-time streams from Zoom Contact Center voice engagements\n\nSee [examples/](examples/) for complete guides and code samples.\n\n## Platform Support Status\n\n| Language | Status | Supported Platforms |\n|----------|--------|---------------------|\n| Node.js | ✅ Supported | darwin-arm64, linux-x64 |\n| Python | ✅ Supported | darwin-arm64, linux-x64 |\n| Go | 📅 Planned | - |\n\n\u003e We are actively working to expand both language and platform support in future releases.\n\n## Overview\n\nThe RTMS SDK allows developers to:\n\n- Connect to live Zoom meetings\n- Process real-time media streams (audio, video, transcripts)\n- Receive events about session and participant updates\n- Build applications that interact with Zoom meetings in real-time\n- Handle webhook events with full control over validation and responses\n\n## Installation\n\n### Node.js\n\n**⚠️ Requirements: Node.js \u003e= 22.0.0 (Node.js 24 LTS recommended)**\n\nThe RTMS SDK uses N-API versions 9 and 10, which require Node.js 22.0.0 or higher.\n\n```bash\n# Check your Node.js version\nnode --version\n\n# Install the package\nnpm install @zoom/rtms\n```\n\n#### Using NVM\n**If you're using an older version of Node.js:**\n```bash\n# Using nvm (recommended)\nnvm install 24       # Install Node.js 24 LTS (recommended)\nnvm use 24\n\n# Or install Node.js 22 LTS (minimum supported)\nnvm install 22\nnvm use 22\n\n# Reinstall the package\nnpm install @zoom/rtms\n```\n\n### Python\n\n**⚠️ Requirements: Python \u003e= 3.10 (Python 3.10, 3.11, 3.12, or 3.13)**\n\nThe RTMS SDK requires Python 3.10 or higher.\n\n```bash\n# Check your Python version\npython3 --version\n\n# Install from PyPI\npip install rtms\n```\n\n**If you're using an older version of Python:**\n```bash\n# Using pyenv (recommended)\npyenv install 3.12\npyenv local 3.12\n\n# Or using your system's package manager\n# Ubuntu/Debian: sudo apt install python3.12\n# macOS: brew install python@3.12\n```\n\n## Usage\n\nRegardless of the language that you use the RTMS SDK follows the same basic steps: \n\n - Receive and validate the webhook event\n - Create an RTMS SDK Client \n - Assign data callbacks to that client\n - Join the meeting with the event payload\n\n### Configure\n\nAll SDK languages read from the environment or a `.env` file:\n\n```bash\n# Required - Your Zoom OAuth credentials\nZM_RTMS_CLIENT=your_client_id\nZM_RTMS_SECRET=your_client_secret\n\n# Optional - Webhook server configuration\nZM_RTMS_PORT=8080\nZM_RTMS_PATH=/webhook\n\n# Optional - Logging configuration\nZM_RTMS_LOG_LEVEL=debug          # error, warn, info, debug, trace\nZM_RTMS_LOG_FORMAT=progressive    # progressive or json\nZM_RTMS_LOG_ENABLED=true          # true or false\n```\n\n### Node.js\n\nFor more details, see our [Quickstart App](https://github.com/zoom/rtms-quickstart-js)\n\n```javascript\nimport rtms from \"@zoom/rtms\";\n\n// CommonJS\n// const rtms = require('@zoom/rtms').default;\n\nrtms.onWebhookEvent(({event, payload}) =\u003e {\n    if (event !== \"meeting.rtms_started\") return;\n\n    const client = new rtms.Client();\n    \n    client.onAudioData((data, timestamp, metadata) =\u003e {\n        console.log(`Received audio: ${data.length} bytes from ${metadata.userName}`);\n    });\n\n    client.join(payload);\n});\n```\n\n\u003e **Production note:** The example above does not validate the incoming webhook signature. Zoom cryptographically signs every webhook — production apps must verify signatures before processing. See [Webhook Validation](examples/node.md#webhook-validation)\n\n### Python \n\nFor more details, see our [Quickstart App](https://github.com/zoom/rtms-quickstart-py)\n\n#### Environment Setup\n\nCreate a virtual environment and install dependencies:\n\n```bash\n# Create virtual environment\npython3 -m venv .venv\n\n# Activate virtual environment\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\n\n# Install dependencies\npip install python-dotenv\n\n# Install RTMS SDK\npip install rtms\n```\n\n#### Quickstart\n\n\n```python\nimport rtms\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nclients = {}\n\n\n@rtms.on_webhook_event\ndef handle_webhook(webhook):\n    event = webhook.get('event')\n    payload = webhook.get('payload', {})\n    stream_id = payload.get('rtms_stream_id')\n\n    if event == 'meeting.rtms_stopped':\n        client = clients.pop(stream_id, None)\n        if client:\n            client.leave()\n        return\n\n    if event != 'meeting.rtms_started':\n        return\n\n    client = rtms.Client()\n    clients[stream_id] = client\n\n    @client.on_transcript_data\n    def _(data, _, timestamp, metadata):\n        print(f'[transcript] ts={timestamp} user=\"{metadata.userName}\": {data.decode()}')\n\n    client.join(payload)\n\n\nrtms.run()\n```\n\n\u003e **Production note:** The example above does not validate the incoming webhook signature. Zoom cryptographically signs every webhook — production apps must verify signatures before processing. See [Webhook Validation](examples/python.md#webhook-validation) \n\n## Troubleshooting\n\nIf you encounter issues some of these steps may help.\n\n### 1. Segmentation Fault / Crash on Startup\n\n**Symptoms:**\n- Immediate crash when requiring/importing the module\n- Error message: `Segmentation fault (core dumped)`\n- Stack trace shows `napi_module_register_by_symbol`\n\n**Root Cause:** Using Node.js version \u003c 22.0.0\n\n**Solution:** See [Using NVM](#using-nvm)\n\n\n**Prevention:**\n- Always use Node.js 22.0.0 or higher\n- Use recommended version with `.nvmrc`: `nvm use` (Node.js 24 LTS)\n- Check version before installing: `node --version`\n\n### 2. Platform Support\nVerify you're using a supported platform (darwin-arm64 or linux-x64)\n\n### 3. SDK Files\nEnsure RTMS C++ SDK files are correctly placed in the appropriate lib directory\n\n### 4. Build Mode\nTry both debug and release modes (`npm run debug` or `npm run release`)\n\n### 5. Dependencies\nVerify all prerequisites are installed\n\n### 6. Audio Defaults Mismatch\nThis SDK uses different default audio parameters than the raw RTMS WebSocket protocol for better out-of-the-box quality. If you need to match the WebSocket protocol defaults, see [#92](https://github.com/zoom/rtms/issues/92) for details.\n\n### 7. Identifying Speakers with Mixed Audio Streams\nWhen using `AUDIO_MIXED_STREAM`, the audio callback's metadata does not identify the current speaker since all participants are mixed into a single stream. To identify who is speaking, use the `onActiveSpeakerEvent` callback:\n\n**Node.js:**\n```javascript\nclient.onActiveSpeakerEvent((timestamp, userId, userName) =\u003e {\n    console.log(`Active speaker: ${userName} (${userId})`);\n});\n```\n\n**Python:**\n```python\n@client.onActiveSpeakerEvent\ndef on_active_speaker(timestamp, user_id, user_name):\n    print(f\"Active speaker: {user_name} ({user_id})\")\n```\n\nThis callback notifies your application whenever the active speaker changes in the meeting. You can also use the lower-level `onEventEx` function with the active speaker event type directly. See [#80](https://github.com/zoom/rtms/issues/80) for more details.\n\n## Building from Source\n\nThe RTMS SDK can be built from source using either Docker (recommended) or local build tools.\n\n### Using Docker (Recommended)\n\n#### Prerequisites\n- Docker and Docker Compose\n- Zoom RTMS C++ SDK files (contact Zoom for access)\n- Task installed (or use Docker's Task installation)\n\n#### Steps\n```bash\n# Clone the repository\ngit clone https://github.com/zoom/rtms.git\ncd rtms\n\n# Place your SDK library files in the lib/{arch} folder\n# For linux-x64:\ncp ../librtmsdk.0.2025xxxx/librtmsdk.so.0 lib/linux-x64\n\n# For darwin-arm64 (Apple Silicon):\ncp ../librtmsdk.0.2025xxxx/librtmsdk.dylib lib/darwin-arm64\n\n# Place the include files in the proper directory\ncp ../librtmsdk.0.2025xxxx/h/* lib/include\n\n# Build using Docker Compose with Task\ndocker compose run --rm build task build:js    # Build Node.js for linux-x64\ndocker compose run --rm build task build:py    # Build Python wheel for linux-x64\n\n# Or use convenience services\ndocker compose run --rm test-js                # Build and test Node.js\ndocker compose run --rm test-py                # Build and test Python\n```\n\nDocker Compose creates **distributable packages** for linux-x64 (prebuilds for Node.js, wheels for Python). Use this when developing on macOS to build Linux packages for distribution.\n\n### Building Locally\n\n#### Prerequisites\n- Node.js (\u003e= 22.0.0, LTS recommended)\n- Python 3.10+ with pip (for Python build)\n- CMake 3.25+\n- C/C++ build tools\n- Task (go-task) - https://taskfile.dev/installation/\n- Zoom RTMS C++ SDK files (contact Zoom for access)\n\n#### Steps\n```bash\n# Install system dependencies\n## macOS\nbrew install cmake go-task python@3.13 node@24\n\n## Linux\nsudo apt update\nsudo apt install -y cmake python3-full python3-pip npm\nsh -c \"$(curl --location https://taskfile.dev/install.sh)\" -- -d -b ~/.local/bin\n\n# Clone and set up the repository\ngit clone https://github.com/zoom/rtms.git\ncd rtms\n\n# Place SDK files in the appropriate lib directory\n# lib/linux-x64/ or lib/darwin-arm64/\n\n# Verify your environment meets requirements\ntask doctor\n\n# Setup project (fetches SDK if not present, installs dependencies)\ntask setup\n\n# Build for specific language and platform\ntask build:js             # Build Node.js for current platform\ntask build:js:linux       # Build Node.js for Linux (via Docker)\ntask build:js:darwin      # Build Node.js for macOS\n\ntask build:py             # Build Python for current platform\ntask build:py:linux       # Build Python wheel for Linux (via Docker)\ntask build:py:darwin      # Build Python wheel for macOS\n```\n\n### Development Commands\n\nThe project uses Task (go-task) for build orchestration. Commands follow the pattern: `task \u003caction\u003e:\u003clang\u003e:\u003cplatform\u003e`\n\n```bash\n# See all available commands\ntask --list\n\n# Verify environment\ntask doctor                   # Check Node, Python, CMake, Docker versions\n\n# Setup project\ntask setup                    # Fetch SDK and install dependencies\n\n# Build modes\nBUILD_TYPE=Debug task build:js    # Build in debug mode\nBUILD_TYPE=Release task build:js  # Build in release mode (default)\n\n# Debug logging for C++ SDK callbacks\nRTMS_DEBUG=ON task build:js       # Enable verbose callback logging\n```\n\n## For Contributors\n\nFor detailed contribution guidelines, build instructions, and troubleshooting, see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## For Maintainers\n\nIf you're a maintainer looking to build, test, or publish new releases of the RTMS SDK, please refer to [PUBLISHING.md](PUBLISHING.md)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoom%2Frtms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzoom%2Frtms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoom%2Frtms/lists"}