TikTok Media Downloader
Pricing
from $15.00 / 1,000 media downloadeds
TikTok Media Downloader
This powerful tool enables the seamless downloading of premium quality TikTok content. Extract videos with or without watermarks and save audio tracks separately with just a few clicks. Perfect for content creators, marketers, and researchers who need reliable TikTok media extraction.
Pricing
from $15.00 / 1,000 media downloadeds
Rating
5.0
(1)
Developer
Web Harvester
Maintained by CommunityActor stats
2
Bookmarked
30
Total users
2
Monthly active users
11 days ago
Last modified
Categories
Share
Apify Actor that downloads video or audio from TikTok post URLs. Media is resolved via upstream services, downloaded through residential-friendly proxies, and stored in the default key-value store with a per-URL dataset report.
Features
- Download TikTok videos in the highest available quality
- Optional watermark-free video only (
noWatermarkOnly) - Audio-only or video-only download modes
- Automatic fallback when the primary source cannot satisfy the request
- Proxy rotation on stalled or slow downloads
- In-run deduplication for duplicate input URLs
- Per-URL dataset rows for downloaded, skipped, and failed outcomes
Input Parameters
Required
-
startUrls(array) — TikTok post URLs to process.[{ "url": "https://www.tiktok.com/@mysticwild/video/7435475440392850721" }] -
downloadType(string) — What to download:"video"— video only (default)"audio"— audio only"videoOrAudio"— video when available, otherwise audio
-
proxyConfiguration(object) — Proxy settings. Residential proxies are strongly recommended; datacenter IPs are often blocked by the download CDN.
Optional
| Field | Type | Default | Description |
|---|---|---|---|
noWatermarkOnly | boolean | false | Skip posts that have no watermark-free video |
downloadTimeoutSecs | integer | 500 | Per-request CDN download timeout |
stallTimeoutSecs | integer | 30 | Abort and retry if no bytes arrive for this long |
slowDownloadTimeoutSecs | integer | 120 | Abort and retry if the whole download exceeds this; 0 disables |
maxRequestRetries | integer | 25 | Crawlee retry count per URL |
maxConcurrency | integer | 5 | Parallel downloads (1–15) |
verboseProgress | boolean | false | Log per-chunk download progress |
Output
Every input URL produces one dataset row.
Downloaded
{"sourceUrl": "https://www.tiktok.com/@mysticwild/video/7435475440392850721","status": "downloaded","statusNote": null,"quality": "HD Original","type": "MP4","timestamp": "2025-03-16T01:08:56.082Z","filename": "a076ba86-10e4-476b-b17e-b63caf0071b3.mp4","fileUrl": "https://api.apify.com/v2/key-value-stores/[store-id]/records/[filename]","fileSize": 9876543,"fileSizeFormatted": "9.4 MB","fileType": "video"}
status—downloaded,skipped, orfailedstatusNote— reason when skipped or failed;nullon successfileType—videooraudiofileSize— exact size in bytesfileSizeFormatted— human-readable size for display (e.g.9.4 MB)filename/fileUrl— present only whenstatusisdownloaded
Skipped or failed
{"sourceUrl": "https://www.tiktok.com/@mysticwild/video/7435475440392850721","status": "skipped","statusNote": "no watermark-free video available (all sources tried)","timestamp": "2025-03-16T01:08:56.082Z"}
Media files live in the default key-value store and are linked from fileUrl.
Usage
- Create a task on Apify and add TikTok post URLs to
startUrls. - Set
downloadTypeandproxyConfiguration(residential recommended). - Run the Actor and filter the dataset by
status.
Best Practices
- Proxies — Use Apify residential proxy; datacenter IPs frequently get empty CDN responses.
- Download type — Default
videois appropriate for most runs; useaudioorvideoOrAudiowhen needed. - Concurrency — Keep
maxConcurrencymoderate (default5); each download buffers the full file in memory. - Timeouts — Raise
downloadTimeoutSecsfor large files; tunestallTimeoutSecs/slowDownloadTimeoutSecsif proxies are slow. - URLs — Use direct TikTok post links (
tiktok.com,vm.tiktok.com,vt.tiktok.com).
Development
npm installnpm testnpm run start:dev
Live integration tests (network required):
$RUN_LIVE_TESTS=1 npm run test:live
