[Recall.ai has raised a $38M series B!](/content/blog/recall-ai-series-b-the-api-for-meeting-recording/index.html)

More resources

Filter by category

View all

Best Practices

Best Practices

Tutorials

Deep Dive

Zoom Developer Forum

.avif)
Google Meet Developer Forum

Microsoft Teams Developer Forum

Announcements

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form.

\\
A guide to programmatic screen capture on macOS\\
\\
Deep Dive](/content/blog/macos-screencapture-api/index.html)

\\
Joining multiple simultaneous meetings through the Zoom SDK\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-simultaneous-meeting-limitations/index.html)

\\
How to get transcripts from Microsoft Teams\\
\\
Tutorials](/content/blog/how-to-get-transcripts-from-microsoft-teams/index.html)

\\
How to Get Recordings and Transcripts from Slack Huddles\\
\\
Tutorials](/content/blog/get-recordings-and-transcripts-from-slack-huddles-api/index.html)

\\
Understanding the Zoom On Behalf Of (OBF) Token\\
\\
Deep Dive](/content/blog/zoom-obf/index.html)

\\
What is a meeting bot?\\
\\
Deep Dive](/content/blog/what-is-a-meeting-bot/index.html)

\\
Zoom SDK Credentials\\
\\
Deep Dive](/content/blog/zoom-sdk-credentials/index.html)

\\
What is a Zoom Access Key (ZAK) token?\\
\\
Deep Dive](/content/blog/what-is-a-zoom-access-key-zak-token/index.html)

\\
How WebSockets cost us $1M on our AWS bill\\
\\
Deep Dive](/content/blog/how-websockets-cost-us-1m-on-our-aws-bill/index.html)

\\
The fix for a segfault that never shipped\\
\\
Deep Dive](/content/blog/the-fix-for-a-segfault-that-never-shipped/index.html)

\\
Postgres Postmaster does not scale\\
\\
Deep Dive](/content/blog/postgres-postmaster-does-not-scale/index.html)

\\
How to access audio streams in the Zoom Web SDK?\\
\\
Zoom Developer Forum](/content/blog/how-to-access-audio-streams-in-the-zoom-web-sdk/index.html)

\\
How to determine if audio is connected on the Zoom Web SDK?\\
\\
Zoom Developer Forum](/content/blog/how-to-determine-if-audio-is-connected-on-the-zoom-web-sdk/index.html)

\\
Recall.ai Series B: The API for Meeting Recording\\
\\
Announcements](/content/blog/recall-ai-series-b-the-api-for-meeting-recording/index.html)

\\
How to build a Microsoft Teams Bot\\
\\
Tutorials](/content/blog/how-to-build-a-microsoft-teams-bot/index.html)

\\
What is the Google Meet Media API?\\
\\
Best Practices](/content/blog/what-is-the-google-meet-media-api/index.html)

\\
Postgres LISTEN/NOTIFY does not scale\\
\\
Deep Dive](/content/blog/postgres-listen-notify-does-not-scale/index.html)

\\
Code Walkthrough: Generating Meeting Action Items With Recall.ai\\
\\
Tutorials](/content/blog/generating-meeting-action-items-with-recall-ai/index.html)

\\
What are speaker labels and how to obtain them\\
\\
Tutorials](/content/blog/speaker-labels-and-names-explained/index.html)

\\
7 APIs to get Zoom transcripts: A comprehensive guide\\
\\
Best Practices](/content/blog/7-apis-to-get-zoom-transcripts-a-comprehensive-guide/index.html)

\\
How to get transcripts from Zoom\\
\\
Tutorials](/content/blog/how-to-get-transcripts-from-zoom/index.html)

\\
How to record Microsoft Teams\\
\\
Tutorials](/content/blog/how-to-get-recordings-from-microsoft-teams/index.html)

\\
New Recall.ai Pricing for 2026: $0.50 per Hour of Meeting Recording\\
\\
Announcements](/content/blog/new-recall-ai-pricing-for-2026/index.html)

\\
Open source Microsoft Teams recording software\\
\\
Microsoft Teams Developer Forum](/content/blog/microsoft-teams-recording-software-open-source/index.html)

\\
How to pick a meeting note taker\\
\\
Best Practices](/content/blog/how-to-pick-a-meeting-note-taker/index.html)

\\
How to Get a Recording from the Google Meet API\\
\\
Best Practices](/content/blog/how-to-get-a-recording-from-the-google-meet-api/index.html)

\\
How to get Google Meet transcripts programmatically\\
\\
Best Practices](/content/blog/how-to-get-transcripts-from-google-meet-developer-edition/index.html)

\\
What is Zoom RTMS?\\
\\
Best Practices](/content/blog/what-is-zoom-rtms/index.html)

\\
How to build a desktop recording app (Like Granola)\\
\\
Tutorials](/content/blog/how-to-build-a-desktop-recording-app/index.html)

\\
Speaker Diarization: What it is and how to get diarized transcripts\\
\\
Best Practices](/content/blog/speaker-diarization/index.html)

\\
Understanding Zoom RTMS Behavior and Its Constraints\\
\\
Best Practices](/content/blog/understanding-zoom-rtms-behavior-and-its-constraints/index.html)

\\
How to build a meeting notetaker\\
\\
Tutorials](/content/blog/how-to-build-a-meeting-notetaker/index.html)

\\
How to build a meeting bot \\
\\
Tutorials](/content/blog/how-to-build-a-meeting-bot/index.html)

\\
When to build a Microsoft Teams bot with Puppeteer\\
\\
Microsoft Teams Developer Forum](/content/blog/puppeteer-microsoft-teams-bot/index.html)

\\
How to join a Zoom meeting using the Zoom Meeting SDK\\
\\
Zoom Developer Forum](/content/blog/how-to-join-a-zoom-meeting-using-the-zoom-meeting-sdk/index.html)

\\
Microsoft Teams open source bot\\
\\
Microsoft Teams Developer Forum](/content/blog/microsoft-teams-open-source-bot/index.html)

\\
How to Build a Google Meet Bot from Scratch\\
\\
Tutorials](/content/blog/how-i-built-an-in-house-google-meet-bot/index.html)

.avif)\\
Is there open source Google Meet recording software?\\
\\
Google Meet Developer Forum](/content/blog/is-there-open-source-google-meet-recording-software/index.html)

.avif)\\
Puppeteer Google Meet Bot\\
\\
Google Meet Developer Forum](/content/blog/puppeteer-google-meet-bot/index.html)

\\
Zoom recording software open source\\
\\
Zoom Developer Forum](/content/blog/zoom-recording-software-open-source/index.html)

\\
How to build a Chrome recording extension using tabCapture API\\
\\
Tutorials](/content/blog/how-to-build-a-chrome-recording-extension/index.html)

\\
Zoom Signature Invalid\\
\\
Zoom Developer Forum](/content/blog/zoom-signature-invalid/index.html)

\\
How to get automatic recordings from a Zoom bot\\
\\
Zoom Developer Forum](/content/blog/zoom-bot-automatic-recording/index.html)

\\
Retrieving participant names through the Zoom SDK\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-retrieving-participant-names/index.html)

\\
How to Access Live Transcription Data from Zoom Web SDK (Component View)\\
\\
Zoom Developer Forum](/content/blog/how-to-access-live-transcription-data-from-zoom-web-sdk-component-view/index.html)

\\
How to build a Zoom bot from scratch\\
\\
Tutorials](/content/blog/how-to-build-a-zoom-bot/index.html)

\\
Create a Google Meet Programmatically\\
\\
Tutorials](/content/blog/create-a-google-meet-programmatically/index.html)

\\
How to join Zoom using Puppeteer\\
\\
Zoom Developer Forum](/content/blog/how-to-join-zoom-using-puppeteer/index.html)

\\
Handling Zoom SDK recording permissions\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-recording-permissions/index.html)

\\
How to Enable a Zoom Bot to Skip the Waiting Room\\
\\
Zoom Developer Forum](/content/blog/zoom-bot-skip-waiting-room/index.html)

\\
How do I sync audio and video when processing raw audio/video from the Zoom SDK?\\
\\
Zoom Developer Forum](/content/blog/how-do-i-sync-audio-and-video-when-processing-raw-audio-video-from-the-zoom-sdk/index.html)

\\
Fixing DLL warnings in the Zoom Windows Meeting SDK\\
\\
Zoom Developer Forum](/content/blog/fixing-dll-warnings-in-the-zoom-windows-meeting-sdk/index.html)

\\
Zoom join tokens for local recording\\
\\
Best Practices](/content/blog/zoom-join-tokens-for-local-recording/index.html)

\\
How to get recordings from Zoom using a Zoom recording bot API\\
\\
Tutorials](/content/blog/how-to-get-recordings-from-zoom/index.html)

\\
How to manage ZAK Tokens for Zoom bots\\
\\
Zoom Developer Forum](/content/blog/how-to-manage-zak-tokens-for-zoom-bots/index.html)

\\
How to build a Zoom notetaker\\
\\
Tutorials](/content/blog/how-to-build-a-zoom-notetaker/index.html)

\\
Recall.ai Announces Participant Emails\\
\\
Announcements](/content/blog/recall-ai-announces-participant-emails/index.html)

\\
How often should I expect to receive the Zoom recording completed webhook for a single meeting?\\
\\
Zoom Developer Forum](/content/blog/how-often-should-i-expect-to-receive-the-zoom-recording-completed-webhook-for-a-single-meeting/index.html)

\\
Why are waiting rooms causing issues with the Zoom Web Meeting SDK?\\
\\
Zoom Developer Forum](/content/blog/why-are-waiting-rooms-causing-issues-with-the-zoom-web-meeting-sdk/index.html)

\\
Why is my Zoom recording completed webhook so delayed?\\
\\
Zoom Developer Forum](/content/blog/why-is-my-zoom-recording-completed-webhook-so-delayed/index.html)

\\
Why aren't transcription webhooks firing for my Zoom meetings?\\
\\
Zoom Developer Forum](/content/blog/why-arent-transcription-webhooks-firing-for-my-zoom-meetings/index.html)

\\
How do I track participants across Zoom breakout rooms?\\
\\
Zoom Developer Forum](/content/blog/how-do-i-track-participants-across-zoom-breakout-rooms/index.html)

\\
Can I identify meeting participants by email on Zoom?\\
\\
Zoom Developer Forum](/content/blog/can-i-identify-meeting-participants-by-email-on-zoom/index.html)

\\
How do I capture participant data in real time on Zoom?\\
\\
Zoom Developer Forum](/content/blog/how-do-i-capture-participant-data-in-real-time-on-zoom/index.html)

\\
Tracking persistent Zoom meeting ID's for participants who leave and rejoin\\
\\
Zoom Developer Forum](/content/blog/tracking-persistent-zoom-meeting-ids-for-participants-who-leave-and-rejoin/index.html)

\\
Debugging issues with automatic cloud recording\\
\\
Zoom Developer Forum](/content/blog/debugging-issues-with-automatic-cloud-recording/index.html)

\\
Tracking Zoom meetings when using Zoom PMI\\
\\
Zoom Developer Forum](/content/blog/tracking-zoom-meetings-when-using-zoom-pmi/index.html)

\\
Encoding raw video from the Zoom SDK to MP4\\
\\
Zoom Developer Forum](/content/blog/encoding-raw-video-from-the-zoom-sdk/index.html)

\\
Handling crashes in the Zoom Windows Meeting SDK\\
\\
Zoom Developer Forum](/content/blog/handling-crashes-in-the-zoom-windows-meeting-sdk/index.html)

\\
Encoding raw video frames from the Zoom SDK to JPEG\\
\\
Zoom Developer Forum](/content/blog/decoding-raw-video-frames-from-the-zoom-sdk/index.html)

\\
Recording meetings without a local recording token\\
\\
Zoom Developer Forum](/content/blog/recording-meetings-without-a-local-recording-token/index.html)

\\
Resolving intermittent errors while downloading Zoom transcripts\\
\\
Zoom Developer Forum](/content/blog/resolving-intermittent-errors-while-downloading-zoom-transcripts/index.html)

\\
Applying account-level settings to meetings created via the Zoom API\\
\\
Zoom Developer Forum](/content/blog/applying-account-level-settings-to-meetings-created-via-the-zoom-api/index.html)

\\
Why can't my bot join meetings hosted by people outside of my Zoom organization?\\
\\
Zoom Developer Forum](/content/blog/why-cant-my-bot-join-meetings-hosted-by-people-outside-of-my-zoom-organization/index.html)

\\
Zoom Cloud Recording API: Transcript Tutorial, Common Pitfalls, and Workarounds\\
\\
Tutorials](/content/blog/zoom-transcript-api/index.html)

\\
Zoom Meeting Bots: What They Are and Solutions\\
\\
Deep Dive](/content/blog/zoom-bots/index.html)

\\
Can I access gallery view video on the Linux SDK?\\
\\
Zoom Developer Forum](/content/blog/can-i-access-gallery-view-video-on-the-linux-sdk/index.html)

\\
How to access the Zoom Archive Files API\\
\\
Zoom Developer Forum](/content/blog/how-to-access-the-zoom-archive-files-api/index.html)

\\
Resolving Web SDK local recording errors\\
\\
Zoom Developer Forum](/content/blog/resolving-web-sdk-local-recording-errors/index.html)

\\
How to resolve permissions errors with the Zoom Users API\\
\\
Zoom Developer Forum](/content/blog/how-to-resolve-permissions-errors-with-the-zoom-users-api/index.html)

\\
How to track participant name changes in breakout rooms\\
\\
Zoom Developer Forum](/content/blog/how-to-track-participant-name-changes-in-breakout-rooms/index.html)

\\
Why is the transcript.completed webhook not firing?\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-webhook-not-firing/index.html)

\\
Debugging Zoom SDK failed video capture\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-debugging-video-capture/index.html)

\\
Capturing video and audio streams through the Zoom SDK\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-receiving-video-streams/index.html)

\\
Can you suppress the Zoom recording consent prompt through the SDK?\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-suppressing-consent-prompt/index.html)

\\
How to stream video to a meeting through the Zoom SDK\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-streaming-video-to-meeting/index.html)

\\
Sending chat messages through the Zoom SDK\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-sending-chat-messages/index.html)

\\
Handling Zoom app OAuth redirect URL requirements\\
\\
Zoom Developer Forum](/content/blog/zoom-app-oauth-redirect-url-requirement/index.html)

\\
Debugging missing Zoom transcription webhooks\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-missing-transcription-webhooks/index.html)

\\
Handling Zoom SDK recording compliance requirements\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-compliance-requirements/index.html)

\\
Handling Zoom app verification\\
\\
Zoom Developer Forum](/content/blog/zoom-app-domain-verification/index.html)

\\
How to join registration-required meetings with a Zoom bot\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-joining-registration-required-meetings/index.html)

\\
How to use a Zoom bot to join meetings without passcodes\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-joining-meetings-without-passcodes/index.html)

\\
Debugging stuck Zoom SDK bots\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-docker-issues/index.html)

\\
How to create a voice agent to send to Zoom meetings\\
\\
Zoom Developer Forum](/content/blog/zoom-sdk-ai-voice-agent/index.html)

\\
How to capture Zoom audio and video with a meeting bot\\
\\
Zoom Developer Forum](/content/blog/create-audio-video-capture-bots/index.html)

\\
How to transcribe a Zoom meeting in real time\\
\\
Zoom Developer Forum](/content/blog/accessing-real-time-transcription-api/index.html)

\\
How to receive raw video from the Zoom SDK\\
\\
Zoom Developer Forum](/content/blog/accessing-host-video-stream/index.html)

\\
Announcing the Recall.ai and Speechmatics Integration\\
\\
Announcements](/content/blog/announcing-the-recall-ai-and-speechmatics-integration/index.html)

\\
Can I access raw audio data using the Zoom Web SDK?\\
\\
Zoom Developer Forum](/content/blog/can-i-access-raw-audio-data-using-the-zoom-web-sdk/index.html)

[Go To Blog](/content/blog/index.html)

Best Practices

# What is Zoom RTMS?

Updated at:

April 7, 2026

.avif)

Written By:

Maggie Veltri

Table of Contents

- [RTMS Cheat Sheet](/content/blog/what-is-zoom-rtms#rtms-cheat-sheet/index.html)
- [What data you can get from RTMS](/content/blog/what-is-zoom-rtms#what-data-you-can-get-from-rtms/index.html)
- [How RTMS integrates with a meeting](/content/blog/what-is-zoom-rtms#how-rtms-integrates-with-a-meeting/index.html)
- [What to take note of when building with RTMS](/content/blog/what-is-zoom-rtms#what-to-take-note-of-when-building-with-rtms/index.html)
  - [Who actually controls whether RTMS starts?](/content/blog/what-is-zoom-rtms#who-actually-controls-whether-rtms-starts/index.html)
- [How RTMS compares to other options](/content/blog/what-is-zoom-rtms#how-rtms-compares-to-other-options/index.html)
  - [RTMS vs Zoom REST API](/content/blog/what-is-zoom-rtms#rtms-vs-zoom-rest-api/index.html)
  - [RTMS vs Zoom Bots](/content/blog/what-is-zoom-rtms#rtms-vs-zoom-bots/index.html)
  - [RTMS with Recall.ai](/content/blog/what-is-zoom-rtms#rtms-with-recallai/index.html)
- [Form Factors for Recording Zoom Comparison Chart](/content/blog/what-is-zoom-rtms#form-factors-for-recording-zoom-comparison-chart/index.html)
- [When to use what](/content/blog/what-is-zoom-rtms#when-to-use-what/index.html)
- [Appendix](/content/blog/what-is-zoom-rtms#appendix/index.html)
  - [Authentication](/content/blog/what-is-zoom-rtms#authentication/index.html)
  - [Media formats & latency expectations](/content/blog/what-is-zoom-rtms#media-formats-latency-expectations/index.html)

[Zoom’s Real‑Time Media Streams (RTMS)](https://developers.zoom.us/docs/rtms/?ampDeviceId=767f7b73-7a33-458a-b8dc-e2400d4d01d7&ampSessionId=1751055092293&_ics=1751055091573&irclickid=~313VRQWRHByopmphjkah~12SVNFGFxAyqlqpqgha74VUJEzofa90&_gl=1*15ownd6*_gcl_au*MjY4MTAzNTI5LjE3NDU3ODM3NDg.*_ga*MTM4NzQxOTg3OS4xNzQ3Njg4MTEy*_ga_L8TBF28DDX*czE3NTEwNTUwOTEkbzEkZzAkdDE3NTEwNTUwOTEkajYwJGwwJGgw) is a WebSocket‑based streaming API built to provide live access to media like meeting audio, video, transcripts, and participant events as they occur. Unlike Zoom’s traditional REST APIs, which are asynchronous and post-meeting, RTMS lets you hook into Zoom’s media pipeline to receive live data, down to individual video frames, transcription, and speaker-change notifications. RTMS is still a newer product so supported features and aspects of the protocol may change.

This guide is written for engineers, PMs, and technical leaders evaluating RTMS. It covers what RTMS is, how it works, where it shines, and where its constraints show up in real end user experiences.

> If you’re interested in learning more about what the experience will look like for your end users, check out our blog on the [end user experience with RTMS](/content/blog/understanding-zoom-rtms-behavior-and-its-constraints/index.html).

### **RTMS Cheat Sheet**

- **Availability**: Zoom RTMS is in General Availability (GA). You [can contact Zoom](https://devforum.zoom.us/t/rtms-account-access-how-to-get-started/137072) to inquire about RTMS access for your account.
- **Pricing**: RTMS is a paid feature available via Zoom Developer Pack. No public pricing is provided, you must talk to the Zoom sales team.
- **No Bots Required**: RTMS provides in-meeting access without bot participants.
- **Platform Support:** RTMS is only available for Zoom. To integrate with other meeting platforms such as Google Meet or Microsoft Teams, use Recall.ai, which also provides RTMS as an integration option for Zoom.

**Data you can access through RTMS**

- **Audio & Video**: Raw audio packets + real-time video as JPG, PNG, or H.264
- **Transcripts**: Live transcripts
- **Metadata**: Join/leave notices, speaker changes, screenshare events

**Use cases that RTMS enables**

- Live transcription or live translations
- AI copilots that work mid-conversation
- Real-time dashboards tracking attendance dynamics

These examples were previously only achievable by [building a bot to join the meeting](/content/blog/how-i-built-an-in-house-google-meet-bot/index.html) or building a [desktop app to record](/content/product/desktop-recording-sdk/index.html) system-level audio. RTMS provides them natively within Zoom.

> If you want to know other ways to get transcripts from Zoom besides RTMS, check out [all the APIs to get transcripts from Zoom](/content/blog/7-apis-to-get-zoom-transcripts-a-comprehensive-guide/index.html) and if you’re interested in recordings we’ve written a similar guide going over [how to get recordings from Zoom](/content/blog/how-to-get-recordings-from-zoom#methods-to-get-recordings-from-zoom/index.html). You can combine RTMS with other capture approaches to ensure a seamless experience across different video conferencing platforms. If you're interested in also capturing meetings outside of Zoom, we’ll cover how Recall.ai supports RTMS alongside bots and other form factors later in this guide.

Zoom RTMS Explained: Realtime Media Streams from Zoom - YouTube

Tap to unmute

[Zoom RTMS Explained: Realtime Media Streams from Zoom](https://www.youtube.com/watch?v=IFXjw5QbQoM) [RecallAI](https://www.youtube.com/channel/UCQXsakK2EQOF4qrTsEbyZHg)

RecallAI288 subscribers

## What data you can get from RTMS

You can access transcripts, audio, video, and meeting metadata. However, if you’d like a full list of the data that you can get, Zoom has published a [data type definitions page](https://developers.zoom.us/docs/rtms/data-types/) in addition to the types they have in the [RTMS repo](https://github.com/zoom/rtms/blob/main/rtms.d.ts). For more information on the media formats and latency, [see the appendix](/content/blog/what-is-zoom-rtms#media-formats-latency-expectations/index.html).

## How RTMS integrates with a meeting

To get started with RTMS, your organization must first have access to RTMS and have it enabled at the account level. Once that's in place, you'll need to register a General App in the Zoom Marketplace, ensuring that RTMS-related scopes (like `meeting:rtms:read`) and meeting-related scopes are included under both **Scopes** and **Access**. You can find setup instructions in the [Zoom RTMS tutorial section](https://developers.zoom.us/docs/rtms/tutorial/).

After your app is registered and configured in the Zoom UI, you’re ready to implement the real-time connection logic that powers RTMS. This unfolds in two key phases: signaling and media streaming.

1. **Signaling WebSocket:** After enabling RTMS at the account level and subscribing to the `meeting.rtms_started` webhook, your backend establishes a [WebSocket “signaling”](https://developers.zoom.us/docs/rtms/meetings/work-with-streams/#step-3-app-establishes-signaling-connection) connection to Zoom. This handles authentication and negotiates which types of streams, such as audio, video, captions, or participant events, your client will receive.

2. **Media WebSocket:** Once signaling succeeds, Zoom returns a [second WebSocket](https://developers.zoom.us/docs/rtms/meetings/work-with-streams/#step-4-app-establishes-the-media-connection) endpoint streaming any or all of the below:

- Raw audio frames and speaker-separated audio channels
- Live raw video
- Transcript and live captions
- Join/leave events and speaker-change notifications

Your client must handle heartbeats, timeouts, and reconnections. Any data that isn’t captured during disconnects is gone forever.

If you’re looking for a deeper dive into how authentication works [check out the appendix](/content/blog/what-is-zoom-rtms#authentication/index.html).

## What to take note of when building with RTMS

### Who actually controls whether RTMS starts?

| Decision authority | What they must do for RTMS to start |
| --- | --- |
| **Zoom admin of host org** | **Enable RTMS and allow apps to access meeting content.** If this is disabled, RTMS will never work for meetings hosted by the organization. |
| **Meeting host** | **Approve real-time sharing and use a supported Zoom client.** The host can also block RTMS entirely, pause it, or interrupt RTMS mid-meeting. |
| **Your app** | **Request only necessary media, use correct scopes, and handle interruptions gracefully.** App design can reduce failure cases by attempting to fall back to other methods of data capture, but cannot override host or admin decisions. |
| **Participants** | **If using RTMS reliant app, have an updated Zoom client (6.5.5+).** Participants cannot enable RTMS, disable it, or opt out individually. The only impact that a non-host participant can have on RTMS working is the Zoom client version they are running in the event that they attempt to start an app that relies on RTMS. |

- **Admin and Host Permissions:** RTMS must be [enabled by a Zoom admin](https://developers.zoom.us/docs/rtms/ux-host-admin-tools-ctrls/) at the account, group, or user level in the Zoom Web Portal; otherwise, it won’t function, even if your app is set up with the correct scopes/access. By default RTMS is enabled. If the host’s org has disabled sharing data an app that depends on RTMS will simply **not receive any data**.

This means if an end user joins an external meeting in which they are not the host and the host doesn’t enable RTMS, anything reliant exclusively on RTMS will fail.

- **Account Setup & App Registration:** The app must be registered as a General App in the Zoom Marketplace. **Server-to-Server OAuth App** and **Webhook App** won’t work. WebSockets require a **General App** configuration. The RTMS scopes and access must be selected in the Zoom App Marketplace UI.

How to create a Zoom RTMS app - YouTube

Tap to unmute

[How to create a Zoom RTMS app](https://www.youtube.com/watch?v=N93KvM-ucgw) [RecallAI](https://www.youtube.com/channel/UCQXsakK2EQOF4qrTsEbyZHg)

RecallAI288 subscribers

- **Client Compatibility:** End users must be using up-to-date Zoom clients ( [Zoom client 6.5.5](https://developers.zoom.us/changelog/rtms/july-14-2025/) +) in order to approve RTMS access if they are the host and in order to attempt to use an app that relies on RTMS.

- **Host Controls:** Hosts can enable **Require host approval** for sharing real-time meeting content. If this is on:
  - Non-host RTMS requests will either be paused or blocked until approved.
  - If the host never joins, participants can’t enable RTMS. They may see a request message, but access will never be granted.
- **All-or-Nothing Access:** RTMS sharing is binary: while clients can choose to ask for specific media (eg. audio, transcript, etc), hosts cannot grant access selectively (e.g., audio _only_, not video or transcripts). There is no partial-content control.

- **Host Transitions:** If the original host leaves and the new host has sharing disabled on their account or manually disables sharing, your RTMS session will still work. The original host's settings override any settings on other meeting participant's workspaces even if the host role is transferred.

- **Pricing & Quotas:** RTMS is available through [Recall.ai](/content/pricing/index.html). To purchase from Zoom directly, you’ll need to consult your Zoom Sales or other contacts for pricing and quota information. If you prefer to purchase from Zoom, RTMS is currently part of the “Zoom Developer Pack”.

- **Auto-Start & Webhook Setup:** RTMS startup behavior depends heavily on admin configuration and webhook setup. Admin or group settings must enable **auto-start** under:

`settings -> allow apps to access meeting content -> edit -> toggle auto-start on`. Alternatively, you can also start RTMS via the REST API. You can also start RTMS using the JS SDK. Additionally, your end users can manually start RTMS using the button in-app. You must subscribe to the `meeting.rtms_started` webhook to be notified when a meeting is RTMS-ready, triggering your signaling WebSocket handshake.

**Note**: If approval is required and the host has not yet joined, or the designated alternate host isn’t present, **any attempt to start the stream via API or SDK by another participant will fail**. RTMS requires an active, eligible host in the meeting to grant access. The host can start Zoom meetings without joining. In the event that a host does allow a meeting to start without them being present, the host’s app will capture data if RTMS is set to auto-start.

- **WebSocket Auth & Session Lifecycle:** RTMS WebSockets use a one-time HMAC-SHA256 signature for authentication, not OAuth. If your connection drops and the session was not found, you cannot resume the session or rotate credentials. Instead, you must reinitiate the handshake.

- **Bidirectional not supported:** RTMS functions as a **receive-only** API, with the only exception being control packets (handshake and keep-alive). It gives you live access to in-meeting audio, video, transcripts, and events, but you **cannot send media back into the meeting** through RTMS meaning your app cannot post in the chat, speak, or interact with participants in real time. If you want to send media back into the meeting, using a [meeting bot](/content/product/meeting-bot-api/index.html) is the only option currently available to send data back into a meeting.

- **RTMS in Breakout Rooms**

Zoom has no officially documented RTMS support for breakout rooms. If your use case involves capturing media from breakout sessions, reach out to Zoom and test carefully before deploying. Our testing has found that RTMS in breakout rooms is not supported currently, but this may evolve over time. If you want to capture media from breakout rooms, using a [meeting bot](/content/product/meeting-bot-api/index.html) is the only option currently available to send data back into a meeting.

Zoom has stated that RTMS supports thousands of concurrent streams, but for an official limit, check with Zoom.

## How RTMS compares to other options

### **RTMS vs Zoom REST API**

Zoom’s REST API is designed for **meeting management and post-meeting data**. It includes endpoints for scheduling, managing participants, and downloading artifacts like recordings and transcripts after the meeting ends. Webhooks notify you of lifecycle events like start, end, or transcript completion.

This works well for **dashboards, reports, or post-hoc analysis**, but not for live use cases. Transcript and recording availability is delayed by a significant margin after a meeting ends, often approaching or exceeding the meeting's duration.

RTMS, by contrast, delivers **real-time audio, video, and metadata**, making it suitable for real-time suggestions and monitoring. However, it can’t schedule meetings or manage end users, you’ll still need the REST API for that.

### **RTMS vs Zoom Bots**

Before RTMS, accessing live Zoom data required **bots** that joined meetings as an additional participant. These bots streamed audio/video to backend servers for transcription or analysis.

Bots support **cross-platform use** and don’t depend on host org settings, but:

- Building a bot in-house is complex to maintain, due to bots joining via the Zoom web client in headless browsers, requiring orchestration of virtual displays, audio/video routing, and backend infrastructure for processing streams.
- Bots are visible in the meeting which is an end user experience consideration.

RTMS removes the need for bots and offers real-time data access via a Zoom-native API.

The tradeoff: it’s Zoom-only, and only works if the meeting host's org has enabled it and the host allows it.

### **RTMS with Recall.ai**

Recall.ai provides a **cross-platform API** that unifies access to Zoom, Google Meet, Microsoft Teams, Webex, Slack and GoTo Meeting through a single integration. It lets you access recordings, transcripts, and metadata across all platforms, through the form factor of your choosing - whether that’s [RTMS](https://docs.recall.ai/docs/meeting-direct-connect-for-zoom-rtms#/), [meeting bots](/content/product/meeting-bot-api/index.html), an [on-device desktop app](/content/product/desktop-recording-sdk/index.html), or [mobile recording app](/content/product/mobile-recording-sdk/index.html).

RTMS is Zoom-native, but requires specific setup and cannot be guaranteed to work if you’re in meetings happening where you do not have host status. Recall.ai offers the option to integrate RTMS in addition to other form factors. This ensures consistent behavior across platforms and meeting environments.

The options for gathering meeting data using Recall.ai are as follows:

## **Form Factors for Recording Zoom Comparison Chart**

| Feature | Zoom REST API | RTMS (Available through Zoom or Recall.ai) | Meeting bots (Available through Recall.ai) |
| --- | --- | --- | --- |
| **Schedule Meetings** | ✅ | ❌ | ❌ |
| **Attendance Logs** | ✅ Attendance logs available post-meeting | ✅ Participant join and leave events | ✅ [Available via live events or post-meeting](https://docs.recall.ai/docs/meeting-participants-events) |
| **Audio Capture** | ✅ Recording available post-meeting | ✅ Delivered via raw live audio packets | ✅ [Real-time audio](https://docs.recall.ai/docs/how-to-get-separate-audio-per-participant-realtime) and [async recording](https://docs.recall.ai/docs/how-to-get-separate-audio-per-participant-async) available |
| **Live Transcripts** | ❌ | ✅ | ✅ [Real-time](https://docs.recall.ai/docs/bot-real-time-transcription) and [post-meeting](https://docs.recall.ai/docs/async-transcription) transcripts available |
| **Speaker Diarization** | ✅ Speaker diarization available post-meeting | ✅ Live speaker-change events available | ✅ [Speaker diarization](/content/product/speaker-diarization-api/index.html) available in real-time over webhook, or available via API post-meeting |
| **Latency for transcripts to be available after the meeting** | High (minutes+) | Low (milliseconds to seconds) | Low (milliseconds to seconds) |
| **Platform Support** | Zoom only | Zoom only | Zoom, Google Meet, Microsoft Teams, Webex, Slack Huddles, GoTo Meeting, In-person meetings, and more. Check out the [full list of supported platforms](https://docs.recall.ai/docs/meeting-platforms). |

Note: This chart compares the most commonly used form factors for recording Zoom meetings at the time of publication. For information on other form factors to record meetings, such as [desktop recording](/content/product/desktop-recording-sdk/index.html), feel free to [reach out to the Recall.ai team](/content/book-a-demo/index.html).

## When to use what

- **Use the Zoom REST API** if all the meetings you want data from are hosted on Zoom and you don’t need data in real time.You or someone from your organization are the host of the meetings you want data for. REST is ideal for dashboards, attendance logs, or delayed analytics where real-time delivery isn't required.
- **Use RTMS** if all of the meetings that you want data from are hosted on Zoom. You need live access to transcripts, audio, video, or participant events during meetings. RTMS is best suited for live transcription or translation, mid-conversation AI copilots, or dashboards that update in real time. Access to data depends on meetings being hosted by organizations with RTMS enabled, or by free accounts where RTMS is correctly configured. Since RTMS doesn’t work across account boundaries unless the host permits access, it's not reliable for open or external-facing use cases on its own.
- **Use meeting bots** when your product needs to support multiple platforms (Google Meet and Microsoft Teams, etc) and needs to guarantee consistent behavior regardless of admin settings or client versions. When you want to send data back into the meeting, meeting bots are the only option.
- **Use Recall.ai** when you want access to data no matter what video conferencing platform the meeting takes place on. Recall.ai allows you to take advantage of RTMS when it is available. Recall.ai is the best choice when you want RTMS, coverage on other video conferencing platforms, and support for recording in-person meetings.

If you’re still mulling over whether RTMS makes sense for you or have decided that one of the other options is a better fit, we’re happy to help.

Book a [chat with a teammate](/content/book-a-demo/index.html), or [sign up for an account](https://us-west-2.recall.ai/auth/signup), and see you soon!

## Appendix

### Authentication

RTMS WebSocket connections are authenticated using a custom signature, not OAuth tokens. When initiating the signaling handshake, your client must include a [signed payload using HMAC-SHA256](https://developers.zoom.us/docs/rtms/signal-connection/#generate-a-signature):

`HMACSHA256(client_id + "," + meeting_uuid + "," + rtms_stream_id, client_secret)`

This signature, sent in the handshake message, authorizes the session and is valid only for that specific stream instance.

- This is static authentication so you don’t need to refresh tokens during the session.
- You must keep your client secret secure, as it's used to generate the signature and access raw media data.

Also note that if the host leaves and a new host lacks RTMS permissions, Zoom will close the WebSocket. Your app must wait for a new `meeting.rtms_started` webhook and then reconnect using a new signature to resume the stream.

### Media formats & latency expectations

RTMS delivers the audio, video, transcript data and more over WebSockets as lightweight, structured packets. Each stream is customizable via handshake parameters, and the latency and fidelity of the media vary based on format and configuration.

Below is an example of a Media handshake request for the audio. For other media types see the [Zoom documentation on connecting media streams](https://developers.zoom.us/docs/rtms/media-parameter-definition/)

1{

2"msg\_type": DATA\_HAND\_SHAKE\_REQ,

3"protocol\_version": 1,

4"sequence": 0,

5"meeting\_uuid": "YOUR\_MEETING\_ID",

6"rtms\_stream\_id": "YOUR\_RTMS\_STREAM\_ID",

7"signature": "YOUR\_AUTH\_SIGNATURE\_CREATED\_WITH\_APP\_CREDS\_AND\_MTG\_INFO",

8"media\_type": AUDIO,

9

10// If you do not specify any of the media\_params, default values will be set

11

12 “Media\_params”: {

13"audio": {

14"content\_type": RAW\_AUDIO,

15"sample\_rate": SR\_16K,

16"channel": MONO,

17"codec": G722,

18"data\_opt": AUDIO\_MIXED\_STREAM,

19"send\_rate": 20

20 }

21 }

22}

... See all 22 lines

**Audio** is sent as [uncompressed PCM](https://developers.zoom.us/docs/rtms/meetings/media/#audio) (L16) by default, with a sample rate of 16kHz (though 8kHz, 32kHz, and 48kHz are also supported) and mono or stereo channel options. The default delivery interval is [20 milliseconds](https://developers.zoom.us/docs/rtms/meetings/media/#send-rate), but this can be configured up to 1000 milliseconds in 20 millisecond intervals depending on use case.

**Video** is sent as JPG or PNG for lower frame rates ( [≤5 FPS](https://developers.zoom.us/docs/rtms/meetings/media/#codecs)), and H.264 for higher frame rates (>5 FPS). [Resolution options](https://developers.zoom.us/docs/rtms/meetings/media/#video) include SD, HD, FHD, and QHD, with delivery latency depending on network, resolution, and compression per frame and a max frames per second of 30.

**Transcripts** arrive in real-time as [UTF-8 text](https://developers.zoom.us/docs/rtms/meetings/media/#transcripts) and include speaker attribution, language metadata, and timestamps. RTMS currently supports [37 spoken languages](https://developers.zoom.us/docs/rtms/data-types/#rtms_transcript_language). Transcript messages are sent as soon as speech is detected and processed.

Developers can fine-tune stream frequency, fidelity, and codec preferences using the `media_params` [section](https://developers.zoom.us/docs/rtms/media-parameter-definition/) of the media handshake request.

.avif)

Written By:

Maggie Veltri

Table of Contents

## The API to get transcripts, recordings, and metadata from meetings.

[Start for free](/content/signup/index.html) [Get a demo](/content/book-a-demo/index.html)

Need help? Email us at [support@recall.ai](mailto:support@recall.ai)

Get transcripts, recordings and metadata from meetings

[Start for free](/content/signup/index.html)

**Product**

[Meeting Bot API\\
\\
\\
example](/content/product/meeting-bot-api/index.html) [Desktop Recording SDK\\
\\
\\
example](/content/product/desktop-recording-sdk/index.html) [Mobile Recording SDK\\
\\
\\
example](/content/product/mobile-recording-sdk/index.html) [Calendar Integration\\
\\
\\
example](/content/product/calendar-integration-api/index.html) [Storage and Playback\\
\\
\\
example](https://docs.recall.ai/docs/storage-and-playback)

**Company**

[Careers\\
\\
\\
We're hiring!](/content/careers/index.html) [Blog\\
\\
\\
example](/content/blog/index.html) [Case Studies\\
\\
\\
example](/content/customersold/index.html)

**Security**

[Security Portal\\
\\
\\
example](https://security.recall.ai/) [SOC 2\\
\\
\\
example](https://security.recall.ai/resources?s=6yae1gt76airvvh39f2vbh&name=soc-2-type-2-report) [ISO 27001\\
\\
\\
example](https://security.recall.ai/resources?s=e9egniy1sgrydeihajcmv&name=isms-certificate) [HIPAA\\
\\
\\
example](https://security.recall.ai/) [GDPR\\
\\
\\
example](https://security.recall.ai/) [CCPA\\
\\
\\
example](https://security.recall.ai/)

**Legal**

[Privacy\\
\\
\\
We're hiring!](/content/privacy/index.html) [Terms of Use\\
\\
\\
We're hiring!](/content/terms-of-use/index.html)

**Resources**

[API Docs\\
\\
\\
example](https://docs.recall.ai/) [Pricing\\
\\
\\
example](/content/pricing/index.html) [Notetaker API\\
\\
\\
example](/content/product/notetaker-api/index.html) [Meeting Recording API\\
\\
\\
example](/content/product/meeting-recording-api/index.html) [Transcription API\\
\\
\\
example](/content/product/transcription-api/index.html) [Meeting Transcription API\\
\\
\\
example](/content/product/meeting-transcription-api/index.html) [Compliance Recording API\\
\\
\\
example](/content/product/compliance-recording-api/index.html) [Speaker Diarization API\\
\\
\\
example](/content/product/speaker-diarization-api/index.html) [Slack Huddles API\\
\\
\\
example](/content/product/slack-huddles-api/index.html)

**Compare**

[Recall.ai vs Attendee\\
\\
\\
example](/content/recall-ai-vs-attendee/index.html) [Recall.ai vs Meeting BaaS\\
\\
\\
example](/content/recall-ai-vs-meetingbaas/index.html) [Recall.ai vs Nylas Notetaker\\
\\
\\
example](/content/recall-ai-vs-nylas-notetaker/index.html) [Recall.ai vs Skribby\\
\\
\\
example](/content/recall-ai-vs-skribby/index.html)

More

**Meeting Bots**

[Google Meet Bot API\\
\\
\\
example](/content/product/meeting-bot-api/google-meet/index.html) [Microsoft Teams Bot API\\
\\
\\
example](/content/product/meeting-bot-api/microsoft-teams/index.html) [Zoom Meeting Bot API\\
\\
\\
example](/content/product/meeting-bot-api/zoom/index.html)

**Recording**

[Google Meet Recording API\\
\\
\\
example](/content/product/google-meet-recording-api/index.html) [Microsoft Teams Recording API\\
\\
\\
example](/content/product/microsoft-teams-recording-api/index.html) [Zoom Meeting Recording API\\
\\
\\
example](/content/product/zoom-recording-api/index.html)

**Transcription**

[Google Meet Transcription API\\
\\
\\
example](/content/product/google-meet-transcription-api/index.html) [Microsoft Teams Transcription API\\
\\
\\
example](/content/product/microsoft-teams-transcription-api/index.html) [Zoom Meeting Transcription API\\
\\
\\
example](/content/product/zoom-transcription-api/index.html)
