The error#
1[gallery-dl][error] Unsupported URL 'https://www.example.com/some/page'Releases from a few years back, 1.17.0 for one, word it differently:
1[gallery-dl][error] No suitable extractor found for 'https://www.example.com/some/page'The exception is NoExtractorError, an InputError in gallery_dl/exception.py. Job.__init__ in gallery_dl/job.py raises it when extractor.find returns nothing, and the main loop in gallery_dl/__init__.py logs the line and adds 64 to the exit status. The line carries the program's name, not a site's, because no site was picked.
What causes it#
extractor.find tries each extractor's regular expression against the URL, in order, and takes the first match. Nothing about the page itself is checked, so the reason is always in the link or in the version.
- The site has no extractor. The supported sites list has no entry for it. Among the big social platforms, LinkedIn, Threads and YouTube are missing.
- The site is there, this kind of page is not. Every extractor covers certain paths. An Instagram profile, post, reel, story, highlight or hashtag link matches; a link to an Instagram page outside those paths does not.
- Your release predates the pattern. New page types arrive in new versions. TikTok photo slideshows answered
Unsupported URLuntil support landed through pull request #6708 in February 2025, which is the history behind issue #6878. - The link was cut or changed on the way. A URL with
&that is not in quotes gets split by the shell, and a link copied from an app can carry a wrapper domain in front of the real one.
How to tell which one it is#
List the extractors for a site, with an example URL for each:
1gallery-dl --list-extractors tiktokEach entry prints its class name, a one-line description, its category and subcategory, and a line that starts with Example :. Compare your link with those examples.
| What you find | Cause |
|---|---|
| The command prints nothing for that name | 1, or the category has another name, so try --list-extractors alone and search |
| Examples exist, none has your link's shape | 2 |
| The changelog shows a newer version adding this shape | 3 |
| The link works in quotes but not without | 4 |
How to fix it#
1. Update. It is the cheapest test of cause 3:
1python3 -m pip install -U gallery-dl2gallery-dl --version2. Quote the link. Quotes stop the shell from acting on &, ? and #:
1gallery-dl "https://www.example.com/watch?id=123&list=456"3. Rewrite it into a shape the extractor knows. Use the Example : line as the template. For X, links on x.com, twitter.com, the mobile domain and fixup mirrors such as fxtwitter and vxtwitter all match.
4. Hand it to yt-dlp. gallery-dl has an extractor called ytdl that passes a link to yt-dlp when you put ytdl: in front. yt-dlp has to be installed in the same Python.
1gallery-dl "ytdl:https://www.youtube.com/watch?v=VIDEO_ID"To send every unmatched link there without the prefix, turn the extractor on in the config. The docs describe that setting as "Process URLs otherwise unsupported by gallery-dl with |ytdl|".
1{2 "extractor": {3 "ytdl": {4 "enabled": true5 }6 }7}5. Ask for the site. Requests for a new site go to the tracker on codeberg.org/mikf/gallery-dl, where the maintainer labels them site:support.
Platforms gallery-dl has no extractor for#
SocialScrape covers three of the platforms missing from gallery-dl's list, each returning JSON from one request:
| Link | Endpoint |
|---|---|
| A Threads profile | GET /v1/threads/profile, and GET /v1/threads/profile/posts for its latest 20 to 30 posts |
| A Threads post | GET /v1/threads/post |
| A LinkedIn profile, company or post | GET /v1/linkedin/profile, GET /v1/linkedin/company, GET /v1/linkedin/post |
| A YouTube channel or video | GET /v1/youtube/channel, GET /v1/youtube/channel/videos, GET /v1/youtube/video |
A link the API does not recognise is answered with unsupported_url (HTTP 400) before anything is fetched, and like every failure it costs nothing. A request that returns data is 1 credit, and 100 credits are yours when you open an account.