ytdl-org/youtube-dl · error · ExtractorError
validation['errorMessage'] (dynamic server message)
Error message
validation['errorMessage'] (dynamic server message)
What it means
Raised by the Zoom extractor after a passcode was submitted to rec/validate(_meet)_passwd and the JSON response has status != true. The raised message is the server-provided errorMessage, marked expected=True, so it almost always means the passcode was wrong for this recording.
Source
Thrown at youtube_dl/extractor/zoom.py:51
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 {
'id': play_id,
'title': data['topic'],
'url': data['viewMp4Url'],
'width': int_or_none(data.get('viewResolvtionsWidth')),
'height': int_or_none(data.get('viewResolvtionsHeight')),
'http_headers': {
'Referer': base_url,
},
'filesize_approx': parse_filesize(data.get('fileSize')),
}
View on GitHub (pinned to 956b8c5855)
Solutions
- Re-check the passcode against the one the sharer provided (watch for case and surrounding spaces)
- Confirm you are using the current share link — hosts can regenerate links with new passcodes
- If the page shows a passcode prompt in a browser, test the same value there first
Defensive patterns
Strategy: try-catch
Try / catch
for attempt, pwd in enumerate(candidate_passcodes):
ydl.params['videopassword'] = pwd
try:
ydl.download([url]); break
except ExtractorError as e:
if 'passcode' not in str(e).lower() and 'password' not in str(e).lower():
raise # not an auth failure - stop
if attempt == len(candidate_passcodes) - 1:
raise Prevention
- Trim whitespace and preserve case when reading Zoom passcodes from email/chat
- Treat a wrong-passcode error as retryable only with a DIFFERENT passcode, never the same one
When it happens
Trigger: Calling with --video-password where the passcode does not match the recording: typos, case-sensitive mistakes, stale passcode after the link was re-shared with a new code, or submitting a 'meeting' passcode where the form expects the recording-file passcode.
Common situations: Copying the passcode with stray whitespace or quotes; the host rotated the passcode; confusing the meeting passcode with the recording passcode.
Related errors
- This album is protected by a password, use the --video-passw
- Wrong password
- This video is protected by a passcode, use the --video-passw
- No such Python version: %s
- This video is only available for users of participating TV p
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/5284d2c88deaae94.
Report an issue: GitHub.