ytdl-org/youtube-dl · error · ExtractorError
This video is protected by a passcode, use the --video-passw
Error message
This video is protected by a passcode, use the --video-password option
What it means
Raised by the Zoom extractor when the recording page contains a 'password_form' (the recording is protected by a passcode) but no --video-password option was supplied. It tells the user the download cannot proceed without the passcode.
Source
Thrown at youtube_dl/extractor/zoom.py:40
'info_dict': {
'id': 'dUk_CNBETmZ5VA2BwEl-jjakPpJ3M1pcfVYAPRsoIbEByGsLjUZtaa4yCATQuOL3der8BlTwxQePl_j0.EImBkXzTIaPvdZO5',
'ext': 'mp4',
'title': 'China\'s "two sessions" and the new five-year plan',
}
}
def _real_extract(self, url):
base_url, play_id = re.match(self._VALID_URL, url).groups()
webpage = self._download_webpage(url, play_id)
try:
form = self._form_hidden_inputs('password_form', webpage)
except ExtractorError:
form = None
if form:
password = self._downloader.params.get('videopassword')
if not password:
raise ExtractorError(
'This video is protected by a passcode, use the --video-password option', expected=True)
is_meeting = form.get('useWhichPasswd') == 'meeting'
validation = self._download_json(
base_url + 'rec/validate%s_passwd' % ('_meet' if is_meeting else ''),
play_id, 'Validating passcode', 'Wrong passcode', data=urlencode_postdata({
'id': form[('meet' if is_meeting else 'file') + 'Id'],
'passwd': password,
'action': form.get('action'),
}))
if not validation.get('status'):
raise ExtractorError(validation['errorMessage'], expected=True)
webpage = self._download_webpage(url, play_id)
data = self._parse_json(self._search_regex(
r'(?s)window\.__data__\s*=\s*({.+?});',
webpage, 'data'), play_id, js_to_json)
return {View on GitHub (pinned to 956b8c5855)
Solutions
- Get the passcode from the person who shared the recording link (usually alongside the URL)
- Supply it with --video-password '<passcode>'
- Alternatively use a URL that already embeds the passcode ( '?pwd=...' ) if the sharer provided one
Example fix
# before youtube-dl 'https://zoom.us/rec/share/abc-def' # after youtube-dl --video-password '123456' 'https://zoom.us/rec/share/abc-def'
Defensive patterns
Strategy: validation
Validate before calling
# before calling youtube_dl, require the passcode for known Zoom share links
if 'zoom.us/rec/' in url or 'zoom.us/rec/share/' in url:
assert options.get('videopassword'), 'Zoom recording URL needs --video-password' Try / catch
try:
ydl.download([url])
except ExtractorError as e:
if 'protected by a passcode' in str(e):
prompt_for_password_and_retry(url) # prompt once, then set ydl params['videopassword'] Prevention
- Always collect the passcode together with the share link from the sender
- Store passcodes alongside URLs in your job config so --video-password can be supplied automatically
When it happens
Trigger: Running youtube-dl against a shared Zoom cloud-recording URL that has a passcode, without passing --video-password. The extractor detects the hidden password form on the page and immediately raises (expected=True).
Common situations: Following a recording link from email/chat where the passcode is in a separate part of the message; company Zoom accounts that enforce passcodes on all shared recordings.
Related errors
- This album is protected by a password, use the --video-passw
- validation['errorMessage'] (dynamic server message)
- Invalid path
- Unauthorized user "%s"
- Missing "id" field in extractor result
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/875d17db358bc2f5.
Report an issue: GitHub.