{"id":21319506,"url":"https://github.com/zoom/webhook-sample","last_synced_at":"2025-07-09T19:38:16.973Z","repository":{"id":85790825,"uuid":"423965370","full_name":"zoom/webhook-sample","owner":"zoom","description":"Receive Zoom webhooks.","archived":false,"fork":false,"pushed_at":"2024-12-10T17:33:58.000Z","size":38,"stargazers_count":25,"open_issues_count":1,"forks_count":25,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-06T13:45:30.421Z","etag":null,"topics":["sample-app"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zoom.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2021-11-02T19:00:24.000Z","updated_at":"2025-03-18T08:42:52.000Z","dependencies_parsed_at":"2024-11-21T19:43:46.266Z","dependency_job_id":"dedb516d-416b-4e4a-a03e-0199386331cd","html_url":"https://github.com/zoom/webhook-sample","commit_stats":null,"previous_names":["zoom/webhook-sample"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zoom/webhook-sample","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Fwebhook-sample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Fwebhook-sample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Fwebhook-sample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Fwebhook-sample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zoom","download_url":"https://codeload.github.com/zoom/webhook-sample/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoom%2Fwebhook-sample/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264502493,"owners_count":23618619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["sample-app"],"created_at":"2024-11-21T19:42:28.861Z","updated_at":"2025-07-09T19:38:16.948Z","avatar_url":"https://github.com/zoom.png","language":"JavaScript","readme":"# Zoom Webhook sample\n\nUse of this sample app is subject to our [Terms of Use](https://explore.zoom.us/en/legal/zoom-api-license-and-tou/).\n\n---\n\n**NOTE:** This Sample App has been updated to use the [Webhook Secret Token](https://developers.zoom.us/docs/api/rest/webhook-reference/#verify-webhook-events) instead of the [Webhook Verification Token](https://developers.zoom.us/docs/api/rest/webhook-reference/#verify-webhook-events) to validate requests are sent from Zoom.\n\n---\n\nThis is a Node.js / Express server that receives [Zoom Platform Webhooks](https://developers.zoom.us/docs/api/rest/webhook-reference/#enable-webhooks) and [Zoom Video SDK Webhooks](https://developers.zoom.us/docs/api/rest/webhook-reference/#enable-webhooks).\n\nIf you would like to skip these steps and just deploy the finished code to a managed service, click the Deploy to Railway/Render/Heroku button. (You will still need to configure a few simple things, so skip to [Deployment](#deployment).)\n\n| Railway | Render | Heroku |\n|:-:|:-:|:-:|\n| [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/ERSEbO?referralCode=HTPdHX) | [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/zoom/webhook-sample) | [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/zoom/webhook-sample) | \n\n\n## Installation\n\nIn terminal, run the following command to clone the repo:\n\n`$ git clone https://github.com/zoom/webhook-sample.git`\n\n## Setup\n\n1. In terminal, cd into the cloned repo:\n\n   `$ cd webhook-sample`\n\n1. Then install the dependencies:\n\n   `$ npm install`\n\n1. Create an environment file to store your Webhook Secret Token:\n\n   `$ touch .env`\n\n1. Add the following code to the .env file, and insert your [Zoom Webhook Secret Token](https://developers.zoom.us/docs/api/rest/webhook-reference/#verify-webhook-events):\n\n   ```\n   ZOOM_WEBHOOK_SECRET_TOKEN=ZOOM_WEBHOOK_SECRET_TOKEN_HERE\n   ```\n\n   ![Zoom Webhook Secret Token](https://developers.zoom.us/img/nextImageExportOptimizer/webhook-secret-token-opt-640.WEBP \"Zoom Webhook Secret Token\")\n\n   \u003e The Webhook Secret Token allows you to [verify webhook requests come from Zoom](https://developers.zoom.us/docs/api/rest/webhook-reference/#verify-webhook-events) and for Zoom to [validate that you control your webhook endpoint](https://developers.zoom.us/docs/api/rest/webhook-reference/#validate-your-webhook-endpoint).\n\n1. Save and close .env.\n\n1. Start the server:\n\n   `$ npm run start`\n\n1. We need to expose the local server to the internet to accept post requests, we will use [Ngrok](https://ngrok.com) (free) for this.\n\n   Once installed, open a new terminal tab and run:\n\n   `$ ngrok http 4000`\n\n   \u003e NOTE: [I've put ngrok in my PATH so I can call it globally.](https://stackoverflow.com/a/36759493/6592510)\n\n1. Copy the ngrok https url and paste it in the Bot endpoint URL input on your Zoom App's Features section. Remember to include `/webhook` path.\n\n   Example: `https://abc123.ngrok.io/webhook`\n\n1. Click \"Validate\".\n\n   ![Zoom Webhook Configuration](https://developers.zoom.us/img/nextImageExportOptimizer/webhook-validate-opt-640.WEBP \"Zoom Webhook Configuration\")\n\n1. Choose the events you'd like to subscribe to.\n\n1. Click \"Save\".\n\n   ![Zoom Webhooks Configured](https://developers.zoom.us/img/nextImageExportOptimizer/webhook-validate-success-opt-640.WEBP \"Zoom Webhooks Configured\")\n\n## Usage\n\n1. Trigger the respective Webhook.\n\n   For example, if you chose the [Start Meeting Webhook](https://developers.zoom.us/docs/api/rest/reference/zoom-api/events/#operation/meeting.started), start a Zoom Meeting. You will see the Webhook headers and payload logged in terminal.\n\n   ```json\n   {\n     \"host\": \"abc123.ngrok.io\",\n     \"user-agent\": \"Zoom Marketplace/1.0a\",\n     \"content-length\": \"335\",\n     \"authorization\": \"{LEGACY_WEBHOOK_VERIFICATION_TOKEN}\",\n     \"clientid\": \"{CLIENT_ID}\",\n     \"content-type\": \"application/json; charset=utf-8\",\n     \"x-forwarded-for\": \"{X_FORWARDED_FOR}\",\n     \"x-forwarded-proto\": \"https\",\n     \"x-zm-request-timestamp\": \"X_ZM_REQUEST_TIMESTAMP\",\n     \"x-zm-signature\": \"v0={HASHED_WEBHOOK_SECRET_TOKEN}\",\n     \"x-zm-trackingid\": \"{X_ZM_TRACKINGID}\",\n     \"accept-encoding\": \"gzip\"\n   }\n   ```\n\n   ```json\n   {\n     \"event\": \"meeting.started\",\n     \"payload\": {\n       \"account_id\": \"{ACCOUNT_ID}\",\n       \"object\": {\n         \"duration\": 0,\n         \"start_time\": \"2021-11-02T20:43:19Z\",\n         \"timezone\": \"America/Denver\",\n         \"topic\": \"{TOPIC}\",\n         \"id\": \"{MEETING_ID}\",\n         \"type\": 4,\n         \"uuid\": \"{MEETING_UUID}\",\n         \"host_id\": \"{HOST_ID}\"\n       }\n     },\n     \"event_ts\": 1635885799302\n   }\n   ```\n\n## Deployment\n\n### Deploy to a Managed Service\n\n1. After clicking the \"Deploy to \u003cProvider\\\u003e\" button, enter a name for your app (or leave it blank to have a name generated for you), and insert your [Zoom Webhook Secret Token](https://developers.zoom.us/docs/api/rest/webhook-reference/#verify-webhook-events):\n\n   - `ZOOM_WEBHOOK_SECRET_TOKEN` (Your Zoom Webhook Secret Token, found on your App's Features page)\n\n1. Then click \"Deploy App\".\n\n1. Copy the url and paste it in the Event notification endpoint URL input on your Zoom App's Features section. Remember to include `/webhook` path.\n\n   Example: `https://abc123.provider.com/webhook`\n\n\u003c!-- ### Heroku (CLI)\n\n1. If you cloned this repo, you may use the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) to deploy your server. Remember to [set your config vars (envoirnment variables)](https://devcenter.heroku.com/articles/config-vars).\n\n1. Copy the Heroku url and paste it in the Event notification endpoint URL input on your Zoom App's Features section. Remember to include `/webhook` path.\n\n   Example: `https://abc123.herokuapp.com/webhook` --\u003e\n\n### Other Server Hosting\n\n1. For Other Server Hosting information, see [this tutorial](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/deployment#choosing_a_hosting_provider).\n\n1. Copy the deployed url and paste it in the Event notification endpoint URL input on your Zoom App's Features section. Remember to include `/webhook` path.\n\n   Example: `https://abc123.compute-1.amazonaws.com/webhook`\n\nNow you are ready to [receive Zoom webhooks](#usage).\n\n## Need help?\n\nIf you're looking for help, try [Developer Support](https://devsupport.zoom.us) or our [Developer Forum](https://devforum.zoom.us). Priority support is also available with [Premier Developer Support](https://explore.zoom.us/docs/en-us/developer-support-plans.html) plans.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoom%2Fwebhook-sample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzoom%2Fwebhook-sample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoom%2Fwebhook-sample/lists"}