Advanced Sample covers most complex scenarios that might be needed in apps.
App has reference implementation for:
Tech stack: react js, node.js, express, docker (optional)
Requirements:
Please see the .env.example file in the repository.
.env file by copying the example and filling in the values
DevelopmentZoom Apps do not support localhost, and must be served over https. To develop locally, you need to tunnel traffic to this application via https, because the application runs in Docker containers serving traffic from http://localhost. You can use Ngrok to do this. Once installed you may run this command from your terminal:
ngrok http 3000
Ngrok will output the origin it has created for your tunnel, eg https://9a20-38-99-100-7.ngrok.io. You'll need to use this across your Zoom App configuration in the Zoom Marketplace (web) build flow (see below).
Please copy the https origin from the Ngrok terminal output and paste it in the PUBLIC_URL value in the .env file.

Please note that this ngrok URL will change once you restart ngrok (unless you purchased your own ngrok pro account). If you shut down your Ngrok (there's no harm to leaving it on), upon restart you'll need to copy and paste the new origin into the .env file AND also to your Marketplace build flow.
The Zoom Marketplace build flow for a Zoom App may be found here. You will need a developer account with Zoom Apps enabled.
The following are steps to take in each of the tabs in the build flow . . .
If you enabled the "List app on Marketplace to be added by any Zoom user" toggle while creating your app on the Marketplace, you will see the following two sections: Development and Production. Note: The above option should only be selected if you intend to publish the app to the marketplace. This option can be enabled later as well under the "Activation" tab. The "Activation" tab only appears if you have not selected to list the app to be published
your Ngrok origin = ie. https://9a20-38-99-100-7.ngrok.io
Follow these instructions for the "Development" section
<your Ngrok origin>/api/zoomapp/home in the Home URL field.env file for this application<your Ngrok origin>/api/zoomapp/auth in the Redirect URL for OAuth field<your Ngrok origin>/api/zoomapp/auth in the OAuth allow list<your Ngrok origin>/api/zoomapp/proxy#/userinfo in the OAuth allow list
9a20-38-99-100-7.ngrok.io) in the Domain allow listappssdk.zoom.us in the Domain allow listimages.unsplash.com to the Domain allow listmy-cdn.example.com) in the Domain allow list**Important: All requests to domains NOT in the Domain allow list in the app's Marketplace build flow will be blocked in the Zoom Apps embedded browser
Zoom App SDK click Add APIs
allowParticipantToRecordauthorizecloudRecordingconnectexpandAppgetMeetingContextgetMeetingJoinUrlgetMeetingParticipantsgetMeetingUUIDgetRecordingContextgetRunningContextgetSupportedjsApisgetUserContextlistCamerasonActiveSpeakerChangeonAuthorizedonConnectonMeetingonMessageonMyUserContextChangeonSendAppInvitationonShareAppopenUrlpostMessagepromptAuthorizeremoveVirtualBackgroundsendAppInvitationshareAppshowAppInvitationDialogsendAppInvitationToMeetingOwnersendAppInvitationToAllParticipantssetVideoMirrorEffectsetVirtualBackgroundshowNotificationzoomapp:inmeeting, user:read
docker-compose tool from the root directory to start both the backend and frontend containers:docker-compose up
Before proceeding, make sure to:
To install your app and open it the Zoom client's embedded browser, visit:
<your Ngrok origin>/api/zoomapp/install
Any errors you encounter during the add flow are likely related to user mismatches or different/non-developer accounts. You may also want to double check that your Client ID and Client secret (in the .env file) are up to date.
After hitting the install URL, an authorization page will show up in the browser. After reviewing and accepting the permissions, the browser will prompt a redirect (AKA deeplink) to the Zoom Client. The client should open up and you should see the Reference App running in your client
The React-based UI will hot reload automatically with changes, thanks to the Webpack dev server. Visit each of the Zoom APIs demoed and test their functionality.
The backend will update live with any changes as well, thanks to the nodemon npm package.
The server will persist sessions for each device (eg system browser or embedded browser/Zoom client) that visits. A common mistake is to restart the Docker containers expecting user data to persist. This will cause problems. You should plan to revisit the install flow every time you restart your Docker containers.
Look for helpful logs from the frontend by opening the browser developer tools console in the Zoom Apps embedded browser (you must enable it first - see following instructions), and from the backend in your terminal window.
To enable the developer tools in the Zoom client:
defaults write ZoomChat webview.context.menu true
C:\Users\<username>\AppData\Roaming\Zoom\data[ZoomChat]
webview.context.menu=true
After following the above instructions, Right Click -> Inspect Element in the embedded browser (Zoom Apps panel in the Zoom client) to see the developer tools.
This Zoom App uses create-react-app for the frontend component. The express server/backend provides a proxy for this, so that it also can sit behind the Ngrok origin that you create.
The frontend app is quite simple:
index.html via a script <script src="https://appssdk.zoom.us/sdk.min.js"></script>The backend is a NodeJS/Express server. The routes include:
Redis:
The third party authentication example is optional - if you skip these steps, please leave the 'Auth0' - prefixed fields in the .env file empty or remove them entirely. Leaving out any of those three values from the .env file will disable this demonstration feature.
Auth0 steps for set up:
Regular Web ApplicationsAuth0 Management API (Doesn't really matter here)AllApplication Properties, make sure (or change) Token Endpoint Authentication Method to PostApplication URIs, fill in Allowed Callback URLs with https://<your Ngrok origin>/api/auth0/auth and Allowed Web Origins with https://<your Ngrok origin>Advanced Settings -> Grant Types, check Authorization CodeUser Management in the left-hand panel, select Users and create a user with username and password.Step 9 to login.Start building your app! You can check out the Zoom Apps developer docs for more information on the JS SDK. You can also explore the Zoom REST API or use the third party OAuth to call a different API.
frontend, backend, and redis):docker compose up --build
docker-compose up --build rtms-websocket
docker-compose up --build rtms-sdk
docker compose --profile websocket up --build
docker compose --profile sdk up --build
ℹ️ For more details on setting up rtms, including the sdk and websocket modes, please refer to the README inside the rtms folder.
JavaScript
88.8%
Shell
5.4%
CSS
2.3%
HTML
1.9%
Dockerfile
1.5%
Advanced Sample covers most complex scenarios that might be needed in apps.
App has reference implementation for:
Tech stack: react js, node.js, express, docker (optional)
Requirements:
Please see the .env.example file in the repository.
.env file by copying the example and filling in the values
DevelopmentZoom Apps do not support localhost, and must be served over https. To develop locally, you need to tunnel traffic to this application via https, because the application runs in Docker containers serving traffic from http://localhost. You can use Ngrok to do this. Once installed you may run this command from your terminal:
ngrok http 3000
Ngrok will output the origin it has created for your tunnel, eg https://9a20-38-99-100-7.ngrok.io. You'll need to use this across your Zoom App configuration in the Zoom Marketplace (web) build flow (see below).
Please copy the https origin from the Ngrok terminal output and paste it in the PUBLIC_URL value in the .env file.

Please note that this ngrok URL will change once you restart ngrok (unless you purchased your own ngrok pro account). If you shut down your Ngrok (there's no harm to leaving it on), upon restart you'll need to copy and paste the new origin into the .env file AND also to your Marketplace build flow.
The Zoom Marketplace build flow for a Zoom App may be found here. You will need a developer account with Zoom Apps enabled.
The following are steps to take in each of the tabs in the build flow . . .
If you enabled the "List app on Marketplace to be added by any Zoom user" toggle while creating your app on the Marketplace, you will see the following two sections: Development and Production. Note: The above option should only be selected if you intend to publish the app to the marketplace. This option can be enabled later as well under the "Activation" tab. The "Activation" tab only appears if you have not selected to list the app to be published
your Ngrok origin = ie. https://9a20-38-99-100-7.ngrok.io
Follow these instructions for the "Development" section
<your Ngrok origin>/api/zoomapp/home in the Home URL field.env file for this application<your Ngrok origin>/api/zoomapp/auth in the Redirect URL for OAuth field<your Ngrok origin>/api/zoomapp/auth in the OAuth allow list<your Ngrok origin>/api/zoomapp/proxy#/userinfo in the OAuth allow list
9a20-38-99-100-7.ngrok.io) in the Domain allow listappssdk.zoom.us in the Domain allow listimages.unsplash.com to the Domain allow listmy-cdn.example.com) in the Domain allow list**Important: All requests to domains NOT in the Domain allow list in the app's Marketplace build flow will be blocked in the Zoom Apps embedded browser
Zoom App SDK click Add APIs
allowParticipantToRecordauthorizecloudRecordingconnectexpandAppgetMeetingContextgetMeetingJoinUrlgetMeetingParticipantsgetMeetingUUIDgetRecordingContextgetRunningContextgetSupportedjsApisgetUserContextlistCamerasonActiveSpeakerChangeonAuthorizedonConnectonMeetingonMessageonMyUserContextChangeonSendAppInvitationonShareAppopenUrlpostMessagepromptAuthorizeremoveVirtualBackgroundsendAppInvitationshareAppshowAppInvitationDialogsendAppInvitationToMeetingOwnersendAppInvitationToAllParticipantssetVideoMirrorEffectsetVirtualBackgroundshowNotificationzoomapp:inmeeting, user:read
docker-compose tool from the root directory to start both the backend and frontend containers:docker-compose up
Before proceeding, make sure to:
To install your app and open it the Zoom client's embedded browser, visit:
<your Ngrok origin>/api/zoomapp/install
Any errors you encounter during the add flow are likely related to user mismatches or different/non-developer accounts. You may also want to double check that your Client ID and Client secret (in the .env file) are up to date.
After hitting the install URL, an authorization page will show up in the browser. After reviewing and accepting the permissions, the browser will prompt a redirect (AKA deeplink) to the Zoom Client. The client should open up and you should see the Reference App running in your client
The React-based UI will hot reload automatically with changes, thanks to the Webpack dev server. Visit each of the Zoom APIs demoed and test their functionality.
The backend will update live with any changes as well, thanks to the nodemon npm package.
The server will persist sessions for each device (eg system browser or embedded browser/Zoom client) that visits. A common mistake is to restart the Docker containers expecting user data to persist. This will cause problems. You should plan to revisit the install flow every time you restart your Docker containers.
Look for helpful logs from the frontend by opening the browser developer tools console in the Zoom Apps embedded browser (you must enable it first - see following instructions), and from the backend in your terminal window.
To enable the developer tools in the Zoom client:
defaults write ZoomChat webview.context.menu true
C:\Users\<username>\AppData\Roaming\Zoom\data[ZoomChat]
webview.context.menu=true
After following the above instructions, Right Click -> Inspect Element in the embedded browser (Zoom Apps panel in the Zoom client) to see the developer tools.
This Zoom App uses create-react-app for the frontend component. The express server/backend provides a proxy for this, so that it also can sit behind the Ngrok origin that you create.
The frontend app is quite simple:
index.html via a script <script src="https://appssdk.zoom.us/sdk.min.js"></script>The backend is a NodeJS/Express server. The routes include:
Redis:
The third party authentication example is optional - if you skip these steps, please leave the 'Auth0' - prefixed fields in the .env file empty or remove them entirely. Leaving out any of those three values from the .env file will disable this demonstration feature.
Auth0 steps for set up:
Regular Web ApplicationsAuth0 Management API (Doesn't really matter here)AllApplication Properties, make sure (or change) Token Endpoint Authentication Method to PostApplication URIs, fill in Allowed Callback URLs with https://<your Ngrok origin>/api/auth0/auth and Allowed Web Origins with https://<your Ngrok origin>Advanced Settings -> Grant Types, check Authorization CodeUser Management in the left-hand panel, select Users and create a user with username and password.Step 9 to login.Start building your app! You can check out the Zoom Apps developer docs for more information on the JS SDK. You can also explore the Zoom REST API or use the third party OAuth to call a different API.
frontend, backend, and redis):docker compose up --build
docker-compose up --build rtms-websocket
docker-compose up --build rtms-sdk
docker compose --profile websocket up --build
docker compose --profile sdk up --build
ℹ️ For more details on setting up rtms, including the sdk and websocket modes, please refer to the README inside the rtms folder.
JavaScript
88.8%
Shell
5.4%
CSS
2.3%
HTML
1.9%
Dockerfile
1.5%