Integrate Zoom API with Slack App via Webhook

Hi everybody!

I am trying to integrate Zoom with Slack to get real-time notification of events in our Zoom instance. The initial use cause is around Zoom Room alerts, but I would like to eventually expand this.

What I have done so far is:

Slack

  1. Created a custom application in Slack
  2. Generated a new incoming webhook
  3. Installed the application in the Workspace
  4. Invited the application/bot to the channel

Zoom

  1. Created a custom application in Zoom (webhook only)
  2. Enabled Event Subscription
  3. Created an Event Subscription pointing to the Slack webhook
  4. Successfully validate the URL
  5. Activated the application on the account

From here on, nothing works.

When I look at the Zoom API Call Logs > Webhook Logs, I see a bunch of entries with Status 400. At the same time, if I try to cURL a message to the Slack webhook URL, I can pass a simple “Hello World” message.

What am I missing? Could it be an authentication issue between the two apps? To be frank, I haven’t configured anything that would make the two apps trust one another…

Hi @mrc
Thanks for reaching out to us and welcome to the Zoom Developer Forum!
Have you been able to succesfully validate your endpoint URL in your webhook only app?

Hi @elisa.zoom - yes. No problems at all validating the endpoint

ok thanks for the clarification @mrc
Would you be able to share a payload from those entries with the Status 400? So we can take a closer look at this

Hi @elisa.zoom - below is a sample payload. I have removed some details ([…]), but should be clear enough. All Status 400 messages follow exactly the same structure, just different meeting events.

{
  "applicationId": "XTZ0KcZmQp2s6yW8O[...]",
  "monitorTime": 1756352294909,
  "requestId": "52a51e7c_45a6_4755_9a46_[...]",
  "traceId": "EventService_0198EEC1-2B60-7B08-B25E-[...]",
  "accountId": "rez1G_gHRkeqA-wa-[...]",
  "event": "meeting.sharing_started",
  "status": "400",
  "userId": "OkU_XDrQRIe2pz85[...]",
  "url": "https://hooks.slack.com/services/E093NC4KU0M/[...]",
  "subscriptionId": "6u3lgrTkS2mz-[...]",
  "requestHeaders": "N/A",
  "requestBody": "{\"event\":\"meeting.sharing_started\",\"payload\":{\"object\":{\"uuid\":\"FX8CZWeNSCix6BX[...]\",\"participant\":{\"id\":\"OkU_XDrQRIe2pz[...]\",\"user_id\":\"16778[...]\",\"user_name\":\"[...]\",\"sharing_details\":{\"link_source\":\"\",\"date_time\":\"2025-08-28T03:38:12Z\",\"file_link\":\"\",\"source\":\"\",\"content\":\"application\"}},\"id\":\"8711394[...]\",\"type\":8,\"topic\":\"Aquatic | Sprint Retrospective\",\"host_id\":\"OkU_XDrQRIe2pz85[...]\",\"duration\":60,\"start_time\":\"2025-08-28T03:30:45Z\",\"timezone\":\"Asia/Kolkata\"},\"account_id\":\"rez1G_gHRkeqA-wa-[...]\"},\"event_ts\":1756352294299}",
  "responseHeaders": "N/A",
  "responseData": "no_text",
  "runTime": "-545",
  "retryNum": 0,
  "ttl": 1757561894
}

Hey @mrc
Thanks for sharing that.
It looks like you are receiving the payload form us right? in the requestBody field.
So what is exactly de issue you are having with your integration?