yt-dlp/yt-dlp · error · ExtractorError
This video is only available for registered users. You may w
Error message
This video is only available for registered users. You may want to use --cookies.
What it means
dplay/Discovery+ playback authorization error. _process_errors inspects the error JSON from a failed disco API call; error code 'access.denied.missingpackage' (your account's package lacks this content) or 'invalid.token' (missing or bad authorization token) raises this expected error suggesting cookies. The st cookie from a logged-in browser session is what the extractor needs to mint a valid Bearer token.
Source
Thrown at yt_dlp/extractor/dplay.py:49
query['deviceId'] = uuid.uuid4().hex
token = self._download_json(
disco_base + 'token', display_id, 'Downloading token',
query=query)['data']['attributes']['token']
# Save cache only if cookies are not being set
if not self._get_cookies(disco_base).get('st'):
self._auth_token_cache[key] = token
return f'Bearer {token}'
def _process_errors(self, e, geo_countries):
info = self._parse_json(e.cause.response.read().decode('utf-8'), None)
error = info['errors'][0]
error_code = error.get('code')
if error_code == 'access.denied.geoblocked':
self.raise_geo_restricted(countries=geo_countries)
elif error_code in ('access.denied.missingpackage', 'invalid.token'):
raise ExtractorError(
'This video is only available for registered users. You may want to use --cookies.', expected=True)
raise ExtractorError(info['errors'][0]['detail'], expected=True)
def _update_disco_api_headers(self, headers, disco_base, display_id, realm):
headers['Authorization'] = self._get_auth(disco_base, display_id, realm, False)
def _download_video_playback_info(self, disco_base, video_id, headers):
streaming = self._download_json(
disco_base + 'playback/videoPlaybackInfo/' + video_id,
video_id, headers=headers)['data']['attributes']['streaming']
streaming_list = []
for format_id, format_dict in streaming.items():
streaming_list.append({
'type': format_id,
'url': format_dict.get('url'),
})
return streaming_list
View on GitHub (pinned to 81ecd58b13)
Solutions
- Log in on the site in a browser and export cookies, then run with --cookies cookies.txt.
- If you already passed cookies, re-export them: they may be for the wrong domain/region or expired.
- missingpackage means your subscription tier does not include the content - check your plan in the account page.
- The geoblocked variant (access.denied.geoblocked) needs a --proxy in a licensed country, not cookies.
Example fix
# before yt-dlp https://www.dplay.com/video/... # after yt-dlp --cookies ~/cookies.txt https://www.dplay.com/video/...
Defensive patterns
Strategy: try-catch
Try / catch
from yt_dlp.utils import ExtractorError
try:
info = ydl.extract_info(url, download=False)
except ExtractorError as e:
if 'only available for registered users' in str(e):
enable_cookies('cookies.txt') # re-run with a logged-in session
raise Prevention
- Always export fresh cookies from a logged-in browser for dplay-family sites.
- Confirm your subscription tier includes the content (missingpackage) before reporting bugs.
When it happens
Trigger: Calling the disco playbackInfo API without a logged-in session for content requiring registration; an account without the required subscription package (missingpackage); expired session cookies (invalid.token).
Common situations: Downloading DPlay/Discovery+/Eurosport/food-network style URLs without --cookies; free-tier accounts hitting premium content; cookie files exported before the site session expired.
Related errors
- This video is only available for registered users
- info['errors'][0]['detail']
- Required cookies for the auth-id.nfl.com domain were not fou
- Failed to retrieve account info with provided cookies
- Unable to log in
AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22).
Data as JSON: /api/errors/813d4f1ca3dc1d5b.
Report an issue: GitHub.