Overview
Managing Zoom recording permissions correctly is one of the most common challenges developers face when building bots with the Zoom Meeting SDK. Whether your bot cannot start a local recording, never sees a permission popup, or is blocked at the connecting stage, the root cause almost always traces back to one of a few well-known permission issues.
This guide walks through every layer of the Zoom recording permissions system for local recording – from generating the right tokens to handling host authorization and automating permission requests.
What Are Zoom recording permissions?
Zoom recording permissions control which participants in a meeting are allowed to start a local recording. For bots using the Meeting SDK, this means:
-
The bot must join with the correct role and a valid join token
-
The host must actively authorize the bot to record (or have pre-authorized it via OAuth)
-
Local recording must be enabled at the account level for the permission prompt to appear at all
Understanding this three-layer model is essential before debugging any Zoom recording permissions issue.
Step 1: Generate a valid join token for local recording
The foundation of Zoom recording permissions for SDK bots is the join token for local recording. To obtain one:
-
Authenticate using Server-to-Server OAuth to get a valid access token
-
Call the Zoom API endpoint:
GET https://api.zoom.us/v2/meetings/{meeting_id}/jointoken/local_recording
- Pass the returned token when your bot joins the meeting, with role set to 1 (host)
Common error signals indicating a token or role problem:
-
CanStartRawRecording result: 2
-
Cannot start raw recording: no permissions yet, need host, co-host, or recording privilege
These logs mean the bot lacks recording privileges at join time -- almost always a token or role misconfiguration. You can read more about how to correctly create tokens for meeting bots in our guide to configuring zoom join tokens for local recording.
Step 2: Ensure host authorization for recording
Zoom recording permissions require explicit host authorization. Your app must be authorized by the meeting host via OAuth before it can auto-start recording. If this step is skipped, the SDK will report insufficient privileges regardless of the token used.
Things to check:
-
Confirm the host has authorized your app in their Zoom account
-
Verify that the OAuth scopes include recording permissions
Step 3: Handle the Zoom recording permission popup
The Zoom recording permission popup is shown only to the meeting host, not to all participants. If your bot isn't receiving or triggering the prompt, check the following:
-
Use IUserInfo.IsHost when participants join to confirm who Zoom recognizes as the host
-
Confirm that local recording is enabled on the host's Zoom account. If it's disabled at the account level, the permission popup will never appear
-
Consider assigning co-host status to relevant participants, since co-hosts can also grant recording permissions
Step 4: Automatically request Zoom recording permissions
To avoid relying on manual host interaction, implement automatic permission prompting in your bot:
-
Use the onInMeeting() method to request recording permission immediately after the bot joins
-
Implement onIsGivenRecordingPermission() as a callback to begin recording automatically once permission is granted
-
Register a MeetingParticipantsCtrlEventListener to detect when the host has joined, then invoke the recording check at that moment
This approach ensures your bot requests Zoom recording permissions as soon as the conditions are met, without polling or manual intervention.
Step 5: Join meetings without a password
Zoom recording permissions issues can sometimes be masked by a bot that never fully joins the meeting. To ensure clean meeting entry:
-
Use the meeting's join URL rather than supplying the meeting ID and password separately
-
If the meeting requires authentication, use a ZAK token to authenticate the bot
-
If the bot stalls at MEETING_STATUS_CONNECTING, review the account's security settings to confirm unauthenticated users are allowed, or that the bot is properly authenticated
Troubleshooting Zoom recording permissions
| Symptom | Likely Cause | Fix |
|---|---|---|
| CanStartRawRecording result: 2 | Missing or invalid join token | Regenerate token via API; verify OAuth scope |
| Permission popup never appears | Local recording disabled on host account | Enable local recording in Zoom account settings |
| Bot doesn't receive the popup | Bot is not the recognized host | Check IUserInfo.IsHost; adjust role at join |
| SDK reports insufficient privileges | Host hasn't authorized the app | Complete OAuth authorization flow with host |
| Bot stuck at MEETING_STATUS_CONNECTING | Authentication issue | Use ZAK token or join URL |
Frequently Asked Questions
Why does my bot have a valid join token but still can't record?
The token alone isn't enough. The bot must also join with role: 1 and the host must have authorized the app via OAuth.
Can a co-host grant Zoom recording permissions instead of the host?
Yes. Co-hosts have the ability to grant recording permissions, so assigning co-host status to a trusted participant is a valid workaround.
What's the difference between local recording permissions and cloud recording permissions?
Local recording permissions (managed via the jointoken/local_recording endpoint) control the Linux SDK's raw audio/video capture. Cloud recording is managed separately through Zoom's cloud recording settings and does not use the same token flow.
Why is the recording permission popup not showing up at all?
The most common reason is that local recording is disabled at the Zoom account or group level. Even with correct tokens and role settings, no popup will appear if the feature is turned off.
Summary
Getting Zoom recording permissions right for an SDK bot requires attention at every layer: a valid join token, proper OAuth host authorization, correct role assignment at join, and account-level settings that allow local recording. Use the onIsGivenRecordingPermission() callback to automate the flow once permissions are granted, and monitor IUserInfo.IsHost to ensure your bot triggers the prompt at the right moment.

