The free way to download every video from a TikTok profile is yt-dlp: point it at the profile URL, hand it your browser cookies, and let it pull the whole grid. Paste a profile below, pick whether you want the videos or just the audio, and copy the command:
Paste a TikTok 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.tiktok.com/@scout2015"Paste this into your terminal AI and it runs the command for you, installing the tool first if you do not have it. Works with Claude Code, OpenAI Codex CLI, Gemini CLI, GitHub Copilot CLI, Aider, Cursor Agent, Warp, OpenCode, Cline and any other CLI coding agent.
Goal: download the video from this TikTok link.
Run this command in my shell:
yt-dlp --merge-output-format mp4 "https://www.tiktok.com/@scout2015"
First check whether `yt-dlp` is installed (run `command -v yt-dlp`). If it is not, install it with my system's package manager before running anything: macOS `brew install yt-dlp ffmpeg`, Debian/Ubuntu `sudo apt install yt-dlp ffmpeg`, Fedora `sudo dnf install yt-dlp ffmpeg`, Windows `winget install yt-dlp ffmpeg`. Then run the command above.
Show me any command that needs sudo before you run it, tell me where the output file landed when you are done, and do not run anything else.You run this at your own risk. An AI agent can execute commands on your machine; review what it does before approving. TechEarl is not liable for the outcome, see the Terms of Service.
The short version is three lines:
# All videos from a profile (cookies needed for the full listing)
yt-dlp --cookies-from-browser firefox "https://www.tiktok.com/@username"The rest of this page is the detail behind that command: why cookies are effectively required, how to make the pull resumable so you can re-run it as a backup, how to organize the filenames, and how to avoid getting rate-limited on a profile with thousands of clips.
This downloads someone's entire body of work, so respect it. Saving your own account, content you have rights to, or material the creator has licensed for reuse is fine; bulk-downloading and redistributing another creator's videos is not, and mass scraping can violate TikTok's Terms of Service. The natural, legitimate use here is backing up your own TikTok (before you delete the app, or just to keep an offline copy). What you do with the files is on you.
Point yt-dlp at the profile URL
A TikTok profile lives at https://www.tiktok.com/@username. Hand that URL to yt-dlp and it treats the profile as a playlist, enumerating every video the account has posted and downloading each one:
yt-dlp --cookies-from-browser firefox "https://www.tiktok.com/@username"There is no separate "download profile" flag. The profile URL is the instruction; yt-dlp's TikTok extractor walks the listing and queues each video. The @ is part of the URL, so keep it.
Cookies are effectively required
This is the part that trips people up. A single TikTok video will often download with no cookies at all, but a full profile pull almost always needs them. TikTok gates the profile listing behind its anti-bot layer, and without a logged-in session yt-dlp frequently gets an empty or truncated list (a handful of videos, or zero). Passing cookies makes the request look like your real browser session and unlocks the complete grid:
yt-dlp --cookies-from-browser firefox "https://www.tiktok.com/@username"Use Firefox, not Chrome. Since Chrome 127 (around July 2024), Chrome encrypts its cookie store with app-bound encryption: the decryption key is tied to the Chrome binary, so reading Chrome cookies with an external tool like yt-dlp has become unreliable, and closing Chrome first does not help because this is a design of the encryption, not a file lock. Firefox stores cookies in a plain SQLite database with no such binding, so --cookies-from-browser firefox is the source that reliably works in 2026. Log into TikTok in Firefox once, then run the command. If you prefer to keep cookies separate from your daily browser, export them to a file with a cookies.txt extension and pass --cookies cookies.txt instead.
Make it resumable with a download archive
If you are backing up a profile, you do not want to re-download everything every time you run the command. The --download-archive flag records the ID of every video it successfully grabs into a text file, then skips anything already in that file on the next run. Point a cron job or a manual re-run at the same archive and you only ever pull new videos:
# Organized, resumable backup: skip anything already grabbed
yt-dlp --cookies-from-browser firefox \
--download-archive seen.txt \
-o "%(uploader)s/%(upload_date)s - %(id)s.%(ext)s" \
"https://www.tiktok.com/@username"That is the command I actually use for ongoing backups. The first run downloads the whole profile; every run after that finishes in seconds unless the account has posted something new. Keep seen.txt alongside your video folder and it becomes a durable, incremental mirror of the account.
Organize the filenames
By default yt-dlp bakes the video ID into the filename, which is unreadable at scale. An output template (-o) builds a folder structure instead:
yt-dlp --cookies-from-browser firefox \
-o "%(uploader)s/%(upload_date)s - %(id)s.%(ext)s" \
"https://www.tiktok.com/@username"That puts every clip under a folder named for the account, with files sorted by upload date. The fields in the %(...)s placeholders are output-template variables; there are dozens of them (%(title)s, %(id)s, %(duration)s). Keeping the video ID in the name is deliberate here: it is what --download-archive matches on, and TikTok titles are often empty or duplicated, so the ID is the only reliably unique part.
Be polite so you do not get blocked
A profile with thousands of videos is a lot of requests in a short window, and that is exactly the pattern TikTok's rate limiter watches for. Throttle the bandwidth and add a pause between requests so the run looks less like a scraper:
# Be polite to avoid blocks on a big profile
yt-dlp --cookies-from-browser firefox -r 2M --sleep-requests 2 "https://www.tiktok.com/@username"-r 2M caps the download rate at 2 MB/s; --sleep-requests 2 waits two seconds between metadata requests. For a very large account, raise the sleep further. If a run does get blocked partway through, the download archive means you can wait, re-run, and pick up exactly where it stopped without re-fetching anything.
Keep yt-dlp current (TikTok breaks things often)
TikTok changes its site and its anti-bot defenses more aggressively than almost any other platform yt-dlp supports, so the extractor breaks more often here than for, say, YouTube. When a profile pull suddenly returns nothing or errors out, update before you debug anything else: yt-dlp -U (standalone binary), pipx upgrade yt-dlp, or brew upgrade yt-dlp. A stale yt-dlp against the current TikTok is the single most common reason these commands stop working. For the install commands and a complete flag reference, the yt-dlp cheat sheet covers it.
If you only need a single clip rather than the whole account, downloading a single TikTok video is the simpler case (often no cookies needed at all). The same bulk pattern here also applies to other platforms; see download a YouTube playlist or channel for the equivalent archive-and-template workflow on YouTube.
Download TikTok slideshows from a profile (photo posts)
Everything above pulls videos. yt-dlp does not download TikTok slides, the photo-carousel posts (photo mode / slideshows): on a photo post it saves only the background audio, not the images. So if a profile backup comes back with a pile of stray .mp3/.m4a files, those are the account's slideshow posts, and the pictures were never downloaded. No yt-dlp flag changes that, it is a limitation of its TikTok extractor.
To back up the slideshows too, run gallery-dl alongside yt-dlp. It has a native TikTok extractor that understands photo posts, and pointed at a profile URL it walks the whole grid the same way yt-dlp does. Install it once (brew install gallery-dl on macOS, or pipx install gallery-dl on Linux/Windows), then pull every photo post into a tidy, resumable folder tree:
Set your backup folder and which browser to read TikTok cookies from. gallery-dl creates the folder, then a subfolder per post.
# Every slideshow from a profile, one folder per post, resumable
gallery-dl --cookies-from-browser firefox \
-d ~/TikTokSlides \
-o 'directory=["{user}","{id}"]' \
-o videos=false \
--download-archive slides-seen.txt \
"https://www.tiktok.com/@username"With the defaults filled in, that command is:
gallery-dl --cookies-from-browser firefox -d ~/TikTokSlides -o 'directory=["{user}","{id}"]' -o videos=false --download-archive slides-seen.txt "https://www.tiktok.com/@username"The pieces, top to bottom: --cookies-from-browser hands gallery-dl your logged-in session, which a full profile listing usually needs for the same anti-bot reason yt-dlp does (use Firefox, not Chrome, for the cookie reason explained above). -d is the base folder, created if it is missing. -o directory=["{user}","{id}"] is what keeps the pull from becoming a mess: every post gets its own subfolder under the creator, so each slideshow's images sit together inside <folder>/<creator>/<post-id>/, saved at their original resolution and numbered with a _01, _02 suffix. -o videos=false tells gallery-dl to grab only the photo posts and leave the regular videos to yt-dlp (drop it if you would rather gallery-dl pull both). --download-archive records what it already fetched so a re-run only grabs new posts, exactly like the yt-dlp backup. To skip the slideshow background sounds and keep only the images, add -o audio=false.
If the pull comes back empty or errors out, update gallery-dl first (brew upgrade gallery-dl, or pipx upgrade gallery-dl), then re-export fresh Firefox cookies; for a stubborn profile, gallery-dl can fall back to yt-dlp's extractor with -o ytdl=true. For a single slideshow rather than the whole account, downloading a single TikTok covers the one-post case.
That gives you a clean, dated mirror of the whole account: yt-dlp for the videos, gallery-dl for the slideshows, both incremental so a weekly re-run only pulls what is new.
FAQ
That is the no-cookies symptom. TikTok gates the full profile listing behind its anti-bot layer, so an anonymous request often returns a truncated list or nothing. Pass --cookies-from-browser firefox (after logging into TikTok in Firefox) to unlock the complete grid.
Since Chrome 127 (around July 2024), Chrome encrypts its cookie store with app-bound encryption tied to the Chrome binary, so external tools often cannot read Chrome cookies, and closing Chrome first does not help. Firefox keeps cookies in a plain SQLite database, so --cookies-from-browser firefox is the one that reliably works. You can also export to a cookies.txt file and use --cookies cookies.txt.
Use --download-archive seen.txt. yt-dlp records every video ID it successfully downloads and skips those on the next run, so re-running the same command only pulls new clips. It makes the profile pull an incremental mirror.
Yes, and that is the cleanest legitimate use. Point yt-dlp at your own profile URL with your cookies and the download archive, and you get a local, dated copy of everything you posted. You own that content, so there is no rights question on your own account.
Almost always TikTok changed something and your yt-dlp is now behind. Update first: yt-dlp -U, pipx upgrade yt-dlp, or brew upgrade yt-dlp. TikTok's extractor breaks more often than most, so keeping yt-dlp current is essential rather than optional.
Those are the account's slideshow posts (photo carousels). yt-dlp downloads videos and audio but cannot pull the images from a TikTok photo post, so it saves only the background sound. Use gallery-dl for the slideshows: gallery-dl --cookies-from-browser firefox -d ~/TikTokSlides -o 'directory=["{user}","{id}"]' "https://www.tiktok.com/@username" gives each post its own folder of images, and adding --download-archive slides-seen.txt makes the pull resumable. See the slideshow section above.
See also
- Download a single TikTok video: the one-clip case, often with no cookies required.
- Download a YouTube playlist or channel: the same archive-and-template bulk workflow, for YouTube.
- Download a YouTube video: the single-video walkthrough, quality selection, and the bot check.
- yt-dlp cheat sheet: every flag worth knowing, in one reference.
Sources
Authoritative references this article was fact-checked against.
- yt-dlp README (official)github.com
- yt-dlp FAQ: passing cookies (official wiki)github.com
- Google Security Blog: app-bound encryption for Chrome cookies (Chrome 127)security.googleblog.com
- gallery-dl README (official, downloads TikTok photo posts)github.com
- gallery-dl supported sites (lists TikTok)github.com





