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

  1. Re-check the passcode against the one the sharer provided (watch for case and surrounding spaces)
  2. Confirm you are using the current share link — hosts can regenerate links with new passcodes
  3. 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

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


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/5284d2c88deaae94. Report an issue: GitHub.