ZoomMtg.join() silently fails after Marketplace review session – WebSocket connects but participant never joins

Meeting SDK Type and Version: Web Meeting SDK 4.0.7 (General App / User Managed)

Description:
Our app was working correctly until March 23, 2026, when a Zoom Marketplace reviewer accessed our app for functional review. Since then, ZoomMtg.join() is called with valid credentials but no success or error callback is ever triggered — the participant never appears in the meeting.

What we have verified:

  • SDK Key, ZAK token (fresh from /v2/users/me/zak via OAuth), and JWT signature are all present and valid
  • ZoomMtg.init() completes successfully
  • ZoomMtg.join() is called with correct parameters
  • The WebSocket connection is established (HTTP 101 Switching Protocols)
  • Binary messages are exchanged (handshake + heartbeats of 16B)
  • The second WebSocket closes with a 21B message (clean close)
  • No error callbacks are fired, no error messages in console
  • Reproduced in Chrome, Edge, incognito mode
  • Reproduced with multiple meeting IDs including our own Personal Meeting Room
  • Reproduced with fresh OAuth tokens after full logout/re-authorization
  • This occurs even when joining meetings hosted by our own developer account

Console log (always ends here, no further output):
externalController sdk init
success load webim
success load tp
success load jsmedia
pre load wasm success
langDir …
you can remove sdkKey from join params since v4.0.0.
[silence — no success, no error]

Browser: Chrome 144, Edge 144, Windows 10

Question: Could the Marketplace review session have changed the state of our app or account on Zoom’s servers in a way that is silently blocking joins? We have been unable to resolve this from our side despite extensive debugging. Any guidance would be appreciated.

Update: I found this related thread: Join failing when using new App Client ID/Secret instead of legacy SDK keys. In that case, Zoom confirmed and fixed a bug on March 19 where new Client ID/Secret credentials failed for external meetings. My app uses Client ID/Secret as SDK Key/Secret (General App, no legacy SDK keys), and the issue started on March 23 after a Marketplace reviewer accessed the app. Could this be related to an incomplete fix rollout, or a similar server-side issue affecting my specific app/account?

Update March 28: I tested with a completely different Zoom account (different email, different credentials, new General App). Same result — SDK reaches init tp success and Video Version: 3987 but participant never appears in meeting. Tested joining both the original account’s meeting and the second account’s own meeting. This rules out account-specific blocking and credential issues. The problem appears to be general to the Web Meeting SDK 4.0.7 with General App credentials in the current environment.

Update March 28 (2): After fixing ZAK token to always be fresh, progress improved. With passcode, SDK now consistently reaches init tp success and Video Version: 3987. Without passcode it stops before init tp success. Participant still never appears in meeting. No success or error callbacks fired after Video Version: 3987. Tested with both original account and a second completely different Zoom account — identical behavior.

Resolved – Root cause found: sdkOverlay covering #meetingSDKElement blocked the join

After days of debugging, I found the root cause — sharing here in case it helps anyone.

The problem: Our app had a full-screen overlay div (position: fixed; inset: 0; z-index: 9999) displayed on top of #meetingSDKElement while the join was in progress. This caused ZoomMtg.join() to silently fail — the WebSocket connected, heartbeats were exchanged, but the server never made the inmeeting XHR call required to complete the join, and no success or error callbacks were fired.

The fix: Hide the overlay before calling ZoomMtg.init() / ZoomMtg.join(). After a successful join, the overlay can be safely restored.

javascript

// Hide overlay before join
document.getElementById("sdkOverlay").style.display = "none";

ZoomMtg.init({
  ...
  success: () => {
    ZoomMtg.join({
      ...
      success: () => {
        // Restore overlay after successful join
        document.getElementById("sdkOverlay").style.display = "flex";
      }
    });
  }
});

Why it was hard to find: A minimal test page without the overlay worked fine. The main app with the overlay failed silently. The SDK needs #meetingSDKElement to be unobstructed in the DOM during the join process — even if the element itself is not visually rendering anything.

Hope this saves someone else a few days of debugging!