# Issue with RTMS: Missing Webhook Events and Scopes for WebSocket Connection

**URL:** <https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262>\
**Category:** Realtime Media Streams\
**Tags:** webhooks\
**Created:** [December 29, 2025, 11:26am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262 "2025-12-29T11:26:50Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [December 29, 2025, 11:26am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/1 "2025-12-29T11:26:50Z")

</div>

Hi,

I am currently a Zoom Pro user and am working on integrating **RTMS (Real-time Media Streaming)** into my application. However, I’ve encountered a few roadblocks and would appreciate some guidance.

**1. Scope Configuration Issues** I am currently configuring my app in the Marketplace Build flow. I’ve attached a screenshot of my current scopes. I am unable to find specific scopes like `meeting:read:meeting_audio`, which I understand are necessary for RTMS. Is there a specific app type or account requirement to enable these scopes?

**2. Webhook and WebSocket Connection Issue** I have successfully received the `meeting.started` webhook event. However, I am not receiving the specific **RTMS streaming start event** , which is preventing me from establishing a WebSocket connection.

**Current Setup:**

- **Environment:** Development

- **Status:** Successfully receiving standard meeting webhooks.

- **Problem:** No RTMS-related events triggered, so the WS connection cannot be initiated.

Could you please advise if there are additional settings I need to enable in the Zoom web portal or if I am missing a specific configuration in the App Marketplace?

Thank you in advance for your help!

**Added scopes:**

- meeting:read:meeting
- meeting:read:live\_streaming\_token
- meeting:read:livestream
- meeting:update:participant\_rtms\_app\_status
- rtms:read:rtms\_concurrency\_near\_limit
- rtms:read:rtms\_interrupted
- rtms:read:rtms\_concurrency\_limited
- rtms:read:rtms\_started
- rtms:read:rtms\_stopped

---

<div class="post-metadata">

**Author:** ![JenBrissman](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jenbrissman/32/70512_2.png) [@JenBrissman](https://devforum.zoom.us/u/JenBrissman)\
**Post date:** [December 30, 2025, 6:11pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/2 "2025-12-30T18:11:17Z")

</div>

Hi @Jangwon ! I hope you are doing well. I have just enabled your account for a free trial of RTMS. Let me know if that fixes things for you.

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [December 31, 2025, 8:34am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/3 "2025-12-31T08:34:55Z")

</div>

Hi Jen,

First of all, thank you for granting me the test permissions for RTMS.

I have successfully added the **`meeting:read:meeting_audio`** scope to my app and updated the configuration. However, even after starting a meeting, I am still not receiving the RTMS-specific webhook events.

I would like to clarify the correct implementation flow:

1. **Triggering RTMS:** Is it mandatory to manually call the **`PATCH /meetings/{meetingId}/livestream`** API to initiate the RTMS data stream? Or should the webhook be triggered automatically just by starting the meeting?

2. **Webhook to WebSocket Flow:** Is the correct sequence to wait for the `meeting.live_streaming_started` webhook, extract the `streaming_url`, and then establish the WebSocket connection?

3. **Missing Events:** If I have the correct scopes but am not receiving the webhooks, are there any specific account-level settings (other than “Custom Live Streaming Service”) that need to be toggled by Zoom or by me in the admin portal?

I am currently stuck at the step of receiving the webhook to get the WS connection details. Any guidance on what specifically to check next would be greatly appreciated.

---

<div class="post-metadata">

**Author:** ![JenBrissman](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jenbrissman/32/70512_2.png) [@JenBrissman](https://devforum.zoom.us/u/JenBrissman)\
**Post date:** [December 31, 2025, 8:37pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/4 "2025-12-31T20:37:36Z")

</div>

Hi there! No problem about granting the free trial of RTMS! We want you to be able to fully experience what is possible.

1. You don’t need to trigger your app starting via REST API. If you want your RTMS app to auto-start when a meeting starts, you’ll need to select that in your account settings. See screenshot attached:

 ![Zsu1rq-6SBWsLJ4qK9--dA](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/5/a/5af9900c735fe99ca78a2576f5af27385fb50929.png)

Did you authorize your app locally? See two screenshots attached.

 ![Screenshot 2025-12-31 at 12.22.52 PM](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/9/b/9bb10c7a2ebf47552d4481e8b21091f6f10a8853.png)  
 ![Screenshot 2025-12-31 at 12.22.34 PM](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/6/2/62287a535dd3d313a8b65a8e90c3814a781ecf68.png)

1. This should all be happening automatically once you configure everything correctly. Let’s come back to this later if it’s still an question for you.

2. In terms of missing events, you do need to set up webhook events when manging your app. I attached screenshots of the Access tab, Basic Information, and Surface tabs for an app I’ve recently built. Your app may have different end points than my example (such as /callback or /webhook). You can check out the README for the Arlo Meeting Assistant app [here](https://github.com/zoom/arlo-meeting-assistant). The README may help walk you through some getting started steps if you aren’t getting everything you need in the [RTMS docs](https://developers.zoom.us/docs/rtms/meetings/getting-started/).

 ![surface](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/1/3/136f32ac0b41a6712fc248de4d22eb5d43e9a36b.jpeg)  
 ![access](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/b/4/b4e986c01bdc94ef1ca36b594fdcac24671124f1.png)  
 ![basic info](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/c/a/ca264bfab1b41d89a335ac08399f1a42fdf07a8c.png)

Let me know if this helps! The screenshots can be helpful to see and pattern match where necessary.

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 6, 2026, 9:11am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/5 "2026-01-06T09:11:17Z")

</div>

Hi,

Thank you so much, it helped me solve the problem easily. However, I ran into the following problem.

I am integrating **Zoom RTMS** but the WebSocket connection closes with **status 1000** immediately (within 2 seconds) after I send the handshake message.

I have two major concerns:

1. **Lack of Error Response:** I am not receiving any response (not even `msg_type: 2` or an error message) before the connection closes. Is there any way to **debug why the server is rejecting my request**? (e.g., Server logs or a specific error packet)

2. **Handshake Protocol:** I am currently sending a binary packet: `[1-byte type] + [4-byte length] + [JSON]`.

**Environment:**

- **App Type:** Server-to-Server OAuth

- **Event:** `meeting.rtms_started`

- **Problem:** Closed with code 1000 without any response from Zoom.

Please let me know how I can validate if my handshake packet is malformed.

Best regards,

---

<div class="post-metadata">

**Author:** ![JenBrissman](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jenbrissman/32/70512_2.png) [@JenBrissman](https://devforum.zoom.us/u/JenBrissman)\
**Post date:** [January 6, 2026, 11:17pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/6 "2026-01-06T23:17:16Z")

</div>

Hi @Jangwon,

Glad to hear you made progress! Regarding the WebSocket closing with code 1000 right after the handshake, here are a few things to check:

1. **Handshake Validation**  
Zoom will close the RTMS WebSocket with status 1000 (“Normal close”) immediately after the handshake if the signature or handshake format is invalid. Make sure your initial message strictly follows the expected JSON structure:

```auto
{
  "msg_type": 1,
  "meeting_uuid": "<uuid>",
  "rtms_stream_id": "<stream_id>",
  "signature": "<HMAC-SHA256(clientId + meetingUuid + rtmsStreamId)>"
}

```

The JSON should be sent as a plain UTF‑8 string (not Protobuf) inside the WebSocket frame.  
2. **Binary Header Format**  
The handshake message should not include a custom binary prefix like `[1-byte type] + [4-byte length]`. Zoom expects a standard WebSocket text or binary frame containing the JSON payload directly. Adding extra bytes before the JSON can cause the server to reject the handshake.  
3. **Signature Construction**  
The signature must be an HMAC‑SHA256 hash of the concatenated string `clientId + meetingUuid + rtmsStreamId`, using your client secret as the key.  
4. **Connection Closing Without Error Message**  
Zoom does not currently return an explicit error packet for malformed handshakes. A silent close with code 1000 is the expected behavior when the handshake fails validation.  
5. **Post‑Handshake Keep‑Alive**  
Once the handshake succeeds, Zoom will periodically send `KEEP_ALIVE_REQ` messages (msg\_type 12). Your client must respond with `KEEP_ALIVE_RESP` to maintain the connection.

**Recommended next steps for you to try:**

- Remove any custom binary header and send only the JSON payload.
- Double‑check your HMAC signature generation logic.
- Log the exact JSON you send before encoding to confirm it matches the expected structure.

If the connection still closes immediately after these adjustments, please share a sanitized example of your handshake payload (without your secret, of course), and we can help verify the format.

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 7, 2026, 9:28am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/7 "2026-01-07T09:28:36Z")

</div>

I sent the following JSON: {“msg\_type”:1,“meeting\_uuid”:“RE/HWbQ7QESDTyweZXDZtA==”,“rtms\_stream\_id”:“1d330e9ca9c04407bded276b30b64be7”,“signature”:“8945981c3b510124a768427492a15999115842a76eb23924a8100723ccde1d8f”}

My clientId is 3UVtLa\_3TUa4lDu4V7lowA. Is the signature 894598… correct for this payload? If not, which exact string concatenation should I use for the HMAC-SHA256 input? Is it the Base64-encoded UUID including slashes and equal signs?

---

<div class="post-metadata">

**Author:** ![JenBrissman](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jenbrissman/32/70512_2.png) [@JenBrissman](https://devforum.zoom.us/u/JenBrissman)\
**Post date:** [January 7, 2026, 6:59pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/8 "2026-01-07T18:59:07Z")

</div>

Hi - I might not be understanding where you’re at now. What is the issue you are experiencing? Can you let me know what is working and what isn’t working at this point?

Some possibly helpful info for you:

```auto
signature = HMAC_SHA256(secret, clientId + meeting_uuid + rtms_stream_id)

```

**Key details:**

- The input string for the HMAC should be the **exact concatenation** (no delimiters) of:
  1. Your `clientId`
  2. The _Base64-encoded_ `meeting_uuid` (including `/` and `=` exactly as received)
  3. The `rtms_stream_id`

- The HMAC is then usually represented as a lowercase hex digest (as yours is).

So for your data:

```auto
clientId: 3UVtLa_3TUa4lDu4V7lowA
meeting_uuid: RE/HWbQ7QESDTyweZXDZtA==
rtms_stream_id: 1d330e9ca9c04407bded276b30b64be7

```

The **HMAC input string** should be:

```auto
3UVtLa_3TUa4lDu4V7lowARE/HWbQ7QESDTyweZXDZtA==1d330e9ca9c04407bded276b30b64be7

```

Then compute:

```auto
HMAC_SHA256(secret, "3UVtLa_3TUa4lDu4V7lowARE/HWbQ7QESDTyweZXDZtA==1d330e9ca9c04407bded276b30b64be7")

```

Compare the resulting hex digest with your `8945981c3b510124a768427492a15999115842a76eb23924a8100723ccde1d8f`.

**Important:**  
Yes, include the Base64-encoded UUID **as-is** — slashes (`/`) and equal signs (`=`) are part of the correct string.

---

<div class="post-metadata">

**Author:** ![JenBrissman](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jenbrissman/32/70512_2.png) [@JenBrissman](https://devforum.zoom.us/u/JenBrissman)\
**Post date:** [January 7, 2026, 7:05pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/9 "2026-01-07T19:05:36Z")

</div>

Basically, I can’t verify as correct or incorrect without knowing the **secret key** used to generate the HMAC. However, above I have tried to communicate the correct construction logic for the signature input so you can confirm it yourself. Let me know!

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 8, 2026, 2:02am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/10 "2026-01-08T02:02:03Z")

</div>

Thanks so much for the detailed response.

For the result you mentioned above that you suggested comparing  
8945981c3b510124a768427492a15999115842a76eb23924a8100723ccde1d8f,  
was the signature generated using “secret” as the secretKey?

---

<div class="post-metadata">

**Author:** ![JenBrissman](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jenbrissman/32/70512_2.png) [@JenBrissman](https://devforum.zoom.us/u/JenBrissman)\
**Post date:** [January 8, 2026, 2:15am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/11 "2026-01-08T02:15:10Z")

</div>

Hey, good question! I should have clarified that before. The hash I mentioned wasn’t actually generated using any real key (including the “secret.”) I just used your signature as an example so you’d have something to compare against.

If you want to confirm it yourself, try running the HMAC-SHA256 with your own secret key and this input string:

```auto
3UVtLa_3TUa4lDu4V7lowARE/HWbQ7QESDTyweZXDZtA==1d330e9ca9c04407bded276b30b64be7

```

Then you can check if your result matches `8945981c3b510124a768427492a15999115842a76eb23924a8100723ccde1d8f`.

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 8, 2026, 2:26am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/12 "2026-01-08T02:26:32Z")

</div>

Thank you for the explanation.

As you can see from the comment I posted at the link below,  
reply link: /t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/7?u=jangwon  
This was the message body I logged right before sending it over the WebSocket.  
I expected that the request had already been sent correctly at that time, but a **1000 close** still occurred.

Are there any additional points you would recommend that I check?  
As always, I sincerely appreciate your quick response.

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 12, 2026, 5:12am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/13 "2026-01-12T05:12:25Z")

</div>

@JenBrissman

Hello!  
Is there any way to further verify the above?

As you suggested, I’ve verified the signature and other details. As you can see from my comment, the data matches the information you provided. As you mentioned, the request was processed normally, but the socket is immediately disconnected with 1000.

Is there any way to determine what the issue is?

---

<div class="post-metadata">

**Author:** ![chunsiong.zoom](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/chunsiong.zoom/32/35488_2.png) [@chunsiong.zoom](https://devforum.zoom.us/u/chunsiong.zoom)\
**Post date:** [January 13, 2026, 2:54am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/14 "2026-01-13T02:54:06Z")

</div>

@Jangwon what programming language are you using?

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 13, 2026, 2:56pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/15 "2026-01-13T14:56:42Z")

</div>

Hello.

I’m using Kotlin (Java) and trying to establish a websocket connection using okHttpClient.

The connection is already successful, but when I send an authentication message, I get a 1000 close error.

---

<div class="post-metadata">

**Author:** ![chunsiong.zoom](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/chunsiong.zoom/32/35488_2.png) [@chunsiong.zoom](https://devforum.zoom.us/u/chunsiong.zoom)\
**Post date:** [January 13, 2026, 4:21pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/16 "2026-01-13T16:21:48Z")

</div>

@Jangwon I had some experience working with Java + Spring. After sending the authentication message, Zoom did send me a websocket message, but in my experience, you need to check both the plain text (onText) and binary (onBinary) message.

If i remember correctly, it is received on the onBinary side. If you don’t respond within like a few seconds, zoom’s server will termination the connection, hence error 1000

> <https://github.com/zoom/rtms-samples/blob/main/video-sdk/vsdk_working_java/src/main/java/com/zoom/rtms/vsdkworkingjava/service/RtmsService.java#L707>

---

<div class="post-metadata">

**Author:** ![Abdullah4](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/abdullah4/32/60165_2.png) [@Abdullah4](https://devforum.zoom.us/u/Abdullah4)\
**Post date:** [January 13, 2026, 4:56pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/17 "2026-01-13T16:56:34Z")

</div>

if the signature verification passes but the WebSocket immediately disconnects, the issue often relates to the validity or scope of the originating token used to generate the `rtms_stream_id`. Please confirm the TTL/expiration time on the initial JWT or OAuth token used, and ensure that relevant RTMS scopes (like `rtms:subscribe`) were successfully granted.

---

<div class="post-metadata">

**Author:** ![Jangwon](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/jangwon/32/52271_2.png) [@Jangwon](https://devforum.zoom.us/u/Jangwon)\
**Post date:** [January 14, 2026, 5:38am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/18 "2026-01-14T05:38:42Z")

</div>

@chunsiong.zoom @Abdullah4

Thank you both for your kind responses.

`msg_type: 1`  
`meeting_uuid: Value received via webhook payload`  
`rtms_stream_id: Value received via webhook payload`  
`signature: Hash value generated using clientId and secretKey (verified above)`

I’m sending this payload in JSON format (UTF-8, string).

Also, I’m listening and logging both onText and onBinary, but I’m not receiving any messages. Only the “1000 normal closing” message in onClosing is returned within 2 seconds.

Meeting\_uuid and rtms\_stream\_id are also received and passed as webhook values, so I don’t expect this to be a major issue. However, the issue remains unresolved.

Are there any other solutions I can try?  
Thank you.

---

<div class="post-metadata">

**Author:** ![Jermaine](https://avatars.discourse-cdn.com/v4/letter/j/9de0a6/32.png) [@Jermaine](https://devforum.zoom.us/u/Jermaine)\
**Post date:** [January 15, 2026, 8:54pm UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/19 "2026-01-15T20:54:00Z")

</div>

When I attempt #1 on a tester account that does not have Pro/RTMS, I do not see any of these settings. Does this mean that users who do not have Pro/an RTMS trial will not be able to use apps that leverage RTMS?

---

<div class="post-metadata">

**Author:** ![Jermaine](https://avatars.discourse-cdn.com/v4/letter/j/9de0a6/32.png) [@Jermaine](https://devforum.zoom.us/u/Jermaine)\
**Post date:** [January 20, 2026, 2:21am UTC](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262/20 "2026-01-20T02:21:55Z")

</div>

@JenBrissman @chunsiong.zoom tagging you for visibility regarding my previous reply to this thread/question

[Next page](https://devforum.zoom.us/t/issue-with-rtms-missing-webhook-events-and-scopes-for-websocket-connection/140262.md?page=2)
