The reliable, free way to download a Facebook video in 2026 is yt-dlp, the same open-source command-line downloader people reach for on YouTube. No website, no ads, no upload limits, nothing to pay. Paste a Facebook URL below, choose video or audio, and copy the command:
Paste a Facebook URL, choose what to grab, and copy the command. It updates as you change the options.
Resolution is a maximum, not a guarantee. yt-dlp grabs the best quality at or below your pick, capped by what was actually uploaded. Choose 8K on a 720p video and you get 720p, not an error and not an upscale.
yt-dlp --merge-output-format mp4 "https://www.facebook.com/watch/?v=10153231379946729"For a public video that is usually the whole job: yt-dlp resolves the messy Facebook URL, grabs the best video and audio, and merges them into one file. The rest of this page is the detail behind it: which links need login cookies, how to pick a resolution, why Firefox is the cookie source that actually works, and what to do when a specific video refuses to extract.
Download only what you have the right to. Saving your own videos, content the poster has made public for sharing, or video the rights holder permits is one thing; redistributing someone else's copyrighted video, or pulling content from private groups you would not otherwise share, is another, and it can violate Facebook's Terms of Service. This guide is for the legitimate cases. What you do with the file is on you.
Install yt-dlp (and ffmpeg)
Pick your platform. Install ffmpeg too: yt-dlp needs it to merge the separate video and audio streams Facebook serves at higher resolutions, and a missing ffmpeg is the single most common reason a download comes out lower-quality than expected.
Pick your OS for the install command.
# Cross-platform and always current:
pipx install yt-dlp
sudo apt install ffmpeg # or your distro's package managerFacebook changes its player and page markup often, and a stale yt-dlp simply stops extracting. pipx install yt-dlp (then pipx upgrade yt-dlp) is the cleanest cross-platform install; the standalone binary self-updates with yt-dlp -U, and Homebrew uses brew upgrade yt-dlp. Keeping yt-dlp current matters more on Facebook than almost anywhere else. When a download that worked last month suddenly fails, updating is the first thing to try. Facebook is also one of the extractor's flakier targets: even on a current build, a specific video can fail with a Cannot parse data error while older posts and Reels keep working, because the extractor is chasing a moving page format. If an up-to-date yt-dlp still chokes on one video, that is usually upstream catching up, not something you did wrong.
Download a public Facebook video
Public videos, the facebook.com/watch player, /videos/ permalinks, fb.watch short links, and public Reels, usually download with no login at all:
# A public Facebook video
yt-dlp "https://www.facebook.com/watch/?v=VIDEO_ID"A short fb.watch link works exactly the same way; yt-dlp follows the redirect to the real video:
# A short fb.watch link
yt-dlp "https://fb.watch/XXXXXXX/"Always wrap the URL in quotes. Facebook URLs are messy, full of tracking parameters (?fs=, ?__tn__=, &mibextid=, long __cft__ blobs), and an unquoted & will be read by your shell as a command separator. The good news is you do not need to clean any of that up by hand: yt-dlp parses the noise and finds the video ID itself. Copy the link straight from the address bar or the Facebook "copy link" menu, quote it, and run it.
Private, group, or login-gated videos
Anything you can only see while logged in, a video in a private group, a friends-only post, an unlisted video shared with you, needs your session. Hand yt-dlp your browser cookies so the request looks like you:
# Private / group video you can see while logged in
yt-dlp --cookies-from-browser firefox "URL"Use Firefox, not Chrome. Since around July 2024 Chrome encrypts its cookie store with app-bound encryption, and external tools (yt-dlp included) can no longer read Chrome's cookies on a running profile. Firefox's cookie store is still readable, so --cookies-from-browser firefox is the reliable source in 2026. Log into Facebook in Firefox once, then point yt-dlp at it. If a public video ever throws a "login required" or "content isn't available" error, the cookies flag is usually the fix there too.
Choose the quality
Facebook typically offers an SD and an HD rendition, sometimes more. List what a given video actually has, then pick:
yt-dlp -F "URL"That prints a table of formats with IDs, resolutions, and codecs. To cap the download at a height and give it a clean name in one go:
# Cap the resolution and pick a clean name
yt-dlp -f "bv*[height<=1080]+ba/b" -o "%(uploader)s - %(id)s.%(ext)s" "URL"The format selector reads as "best video up to 1080p plus best audio, or fall back to the best single file if that fails." The resolution is a ceiling, not a request: [height<=1080] means "the best stream at or below 1080p," so you only get 1080p if the poster uploaded at that resolution. yt-dlp never upscales a low-quality source, and it will not error if the video tops out lower; it just gives you what exists. Run yt-dlp -F first if you want to see the available renditions before choosing.
The -o template is worth keeping. By default yt-dlp bakes a long numeric ID into the filename; %(uploader)s - %(id)s.%(ext)s gives you something you can actually find later. There are dozens of fields (%(title)s, %(upload_date)s, %(resolution)s) for building a folder structure that suits your library.
See also
- Download a YouTube video with yt-dlp: the same tool on YouTube, with resolution selection and the bot-check workaround.
- Download an Instagram Reel: the cookies note Instagram needs, and how Reels differ from posts.
- yt-dlp cheat sheet: every flag worth knowing, in one reference.
FAQ
Sources
Authoritative references this article was fact-checked against.
- yt-dlp README (official)github.com
- yt-dlp format selection (official docs)github.com
- yt-dlp FAQ: passing cookies (official wiki)github.com





