yt-dlp/yt-dlp · error · ExtractorError
This video is password-protected, use the --video-password o
Error message
This video is password-protected, use the --video-password option
What it means
Loom's GraphQL endpoint GetVideoSSR returns an object whose __typename is 'VideoPasswordMissingOrIncorrect' for password-protected videos. When no password was supplied at all (get_param('videopassword') is falsy), the extractor raises this expected error telling you to pass --video-password. The video's owner set an access password; without it, metadata and sources are not served.
Source
Thrown at yt_dlp/extractor/loom.py:369
subs_data = self._call_graphql_api(
'FetchVideoTranscript', video_id, 'Downloading GraphQL subtitles JSON', fatal=False)
return filter_dict({
'en': traverse_obj(subs_data, (
'data', 'fetchVideoTranscript',
('source_url', 'captions_source_url'), {
'url': {url_or_none},
})) or None,
})
def _real_extract(self, url):
video_id = self._match_id(url)
metadata = traverse_obj(
self._call_graphql_api('GetVideoSSR', video_id, 'Downloading GraphQL metadata JSON', fatal=False),
('data', 'getVideo', {dict})) or {}
if metadata.get('__typename') == 'VideoPasswordMissingOrIncorrect':
if not self.get_param('videopassword'):
raise ExtractorError(
'This video is password-protected, use the --video-password option', expected=True)
raise ExtractorError('Invalid video password', expected=True)
video_data = self._call_graphql_api(
'GetVideoSource', video_id, 'Downloading GraphQL video JSON')
chapter_data = self._call_graphql_api(
'FetchChapters', video_id, 'Downloading GraphQL chapters JSON', fatal=False)
duration = traverse_obj(metadata, ('video_properties', 'duration', {int_or_none}))
return {
'id': video_id,
'duration': duration,
'chapters': self._extract_chapters_from_description(
traverse_obj(chapter_data, ('data', 'fetchVideoChapters', 'content', {str})), duration) or None,
'formats': self._extract_formats(video_id, metadata, video_data),
'subtitles': self.extract_subtitles(video_id),
**traverse_obj(metadata, {
'title': ('name', {str}),View on GitHub (pinned to 81ecd58b13)
Solutions
- Obtain the password from the video owner and supply it: yt-dlp --video-password SECRET 'https://www.loom.com/share/<id>'
- In the Python API, set 'videopassword': 'SECRET' in the YoutubeDL options dict
- In interactive tools, catch this error, prompt the user, and retry with the password
Example fix
# before
yt-dlp 'https://www.loom.com/share/abc123'
# -> ExtractorError: This video is password-protected, use the --video-password option
# after
yt-dlp --video-password 'hunter2' 'https://www.loom.com/share/abc123'
# Python API equivalent
import yt_dlp
opts = {'videopassword': 'hunter2'}
with yt_dlp.YoutubeDL(opts) as ydl:
ydl.extract_info(url, download=True) Defensive patterns
Strategy: retry
Type guard
def is_loom_password_needed(err) -> bool:
from yt_dlp.utils import ExtractorError
return isinstance(err, ExtractorError) and 'password-protected, use the --video-password option' in str(err) Try / catch
import yt_dlp
from yt_dlp.utils import ExtractorError
url = 'https://www.loom.com/share/abc123'
try:
with yt_dlp.YoutubeDL() as ydl:
info = ydl.extract_info(url, download=True)
except ExtractorError as e:
if 'password-protected' not in str(e):
raise
pw = ask_user_for_password() # or fetch from your secret store
with yt_dlp.YoutubeDL({'videopassword': pw}) as ydl:
info = ydl.extract_info(url, download=True) Prevention
- Collect video passwords up front for known-protected Loom links and pass the videopassword option
- Remember the flag is --video-password (-p for media), not --password (account)
- In pipelines, prompt-and-retry once on this message instead of failing the whole job
When it happens
Trigger: Extracting a loom.com/share/<id> URL for a password-protected video without the videopassword option/parameter set.
Common situations: Team/shared Loom links with password protection; CI pipelines or bots hitting protected share URLs; forgetting that the -p/--video-password flag (not -a/--password) is the right one for media passwords.
Related errors
- Invalid video password
- This video is protected by a password, use the --video-passw
- {self.IE_NAME} said: {expired}
- This video is not available yet. Release date: {start_date}
- {error}
AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22).
Data as JSON: /api/errors/f7f47281b76db78b.
Report an issue: GitHub.