# TikTok Video Downloader & API: No Watermark, HD & Bulk (`s_actors/tiktok-video-downloader`) Actor

Download TikTok videos without watermark in bulk: links, short links, IDs or whole profiles (latest videos, date range, only new ones). Pick the quality: H.264 that plays everywhere or 1080p HD. Photo post images, covers, MP3 sounds and one ZIP with metadata.

- **URL**: https://apify.com/s_actors/tiktok-video-downloader.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Social media, Videos, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 video downloads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### TikTok Video Downloader & API: No Watermark, HD & Bulk

Download **TikTok videos without watermark** in bulk: paste video links, short share links, IDs or **whole profiles**, and get every **MP4** with a permanent download link plus **one ZIP** of everything. **Pick the quality**: the best H.264 that plays everywhere, or **1080p HD** when TikTok has it. Photo posts give every image, and you can add **covers (JPG)** and **sounds (MP3)** for free.

```json
{ "videos": ["https://www.tiktok.com/@nasa/video/7665075736742530317", "@nasa"], "quality": "highest" }
```

No TikTok login, no cookies, no browser extension, no watermark remover. Use it as a **TikTok downloader API**: one call returns the files and clean JSON.

#### What you get

One row per video or photo post, and all files in `tiktok-videos.zip` (a folder per author + `metadata.csv`). Real example, October 2026:

| videoAuthorUsername | quality | width × height | codec | fileSizeMb | durationSeconds | files |
|---|---|---|---|---|---|---|
| nasa | highest | 1080 × 1920 | h265 | 3.05 | 25 | MP4, cover JPG, MP3 |
| nasa | compatible | 720 × 1280 | h264 | 3.36 | 25 | MP4 |
| charlidamelio | smallest | 576 × 1024 | h264 | 1.06 | 11 | MP4 |
| nytimes (photo post) | | | | | | 10 JPG images |

| Field | Description |
|---|---|
| `videoFileUrl` | Permanent download link of the MP4 without watermark |
| `imageFileUrls` | Photo posts (slideshows): a JPG link for every image |
| `coverFileUrl`, `audioFileUrl` | Cover JPG and sound MP3 with **Download covers** / **Download sounds** |
| `zipFile` | Which ZIP part holds the video's files (`tiktok-videos.zip`, `tiktok-videos-2.zip`...) |
| `quality`, `codec`, `width`, `height`, `bitrate`, `fileSizeMb` | The version saved: `h264` or `h265`, resolution, bitrate and size |
| `videoId`, `videoUrl`, `videoDescription`, `videoCreatedAt`, `durationSeconds` | Video ID, link, caption, exact posting time (UTC), length |
| `videoPlayCount`, `videoLikeCount`, `videoCommentCount`, `videoShareCount`, `videoSaveCount` | Plays, likes, comments, shares and saves as TikTok shows them |
| `hashtags`, `mentions`, `language`, `photoTitle` | Hashtags and @mentions from the caption, caption language, photo post title |
| `musicTitle`, `musicAuthor`, `musicIsOriginal`, `musicAudioUrl` | The sound and TikTok's own audio link |
| `videoAuthorUsername`, `videoAuthorName`, `videoAuthorId`, `videoAuthorVerified`, `videoAuthorFollowerCount` | The creator |
| `coverUrl` | TikTok's cover link (expires after a few days, the JPG copy does not) |
| `input`, `inputProfile`, `position`, `downloadedAt` | Which input the row came from |

#### How it works

1. Add **videos or profiles**: `tiktok.com/@user/video/...`, photo posts `/photo/...`, short links `vm.tiktok.com/...`, `vt.tiktok.com/...`, `tiktok.com/t/...`, video IDs, `tiktok.com/@user` or `@user`
2. Choose the **Quality**; optionally turn on covers and sounds
3. Run, then open the **ZIP** link in the status message (or the Output tab), or download single files from the dataset

| Input | What it does |
|---|---|
| **TikTok videos or profiles** | Any mix of links, short links, IDs and profiles |
| **Quality** | `compatible` (default): the sharpest H.264, plays on every device and editor. `highest`: the sharpest version, 1080p when it exists (often H.265/HEVC). `smallest`: the smallest file |
| **Videos per profile** | Latest N videos of each profile, newest first (default 20, `0` = all) |
| **Posted after / before** | Only videos from a date range: `2026-09-01` or `7 days`, `2 weeks`, `1 year` |
| **Only new videos since the previous run** | Skip what earlier runs already downloaded: schedule it to back up an account |
| **ZIP archive** | On by default: everything in one download, split every ~200 MB |
| **Download covers / sounds** | Cover JPG and sound MP3 for every video, free |

A video that is deleted, private or not found gives a row with `error` and is not charged.

#### Why this Actor

| | |
|---|---|
| 🎞️ **Choose the quality** | Most downloaders save one version. Here: H.264 for any player, **1080p HD** (H.265) when TikTok has it, or the smallest file. The row shows codec and resolution |
| 🚫 **No watermark** | The clean video TikTok plays on its website, not the download version with the logo and @username |
| 🗜️ **One ZIP for everything** | A folder per author and `metadata.csv` with caption, date, stats and file name of every video |
| 👤 **Whole profiles** | All videos of a creator, a date range, or only the new ones since the last run |
| 🖼️ **Photo posts, covers, sounds** | Every slideshow image as JPG, covers and MP3 sounds included |
| 💰 **$2.49 per 1,000 videos** | Cheaper than the popular TikTok downloaders, no subscription, failed videos free |

#### Back up a TikTok account automatically

1. Add the profile (`@yourbrand`), set **Videos per profile** to `0` and turn on **Only new videos since the previous run**
2. Run once: every video is downloaded
3. Save as a task with a daily schedule: each run downloads only the videos posted since, and the ZIP holds just those

The list of downloaded videos is kept per profile in your account (key-value store `tiktok-downloader-state`). Add an integration to send the files to Google Drive, Dropbox or S3.

#### Pricing

Pay per downloaded video, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Video download (MP4 or all images of a photo post) | $0.00249 | $0.002241 | $0.001992 |

| Task | Cost |
|---|---|
| 10 videos | ~$0.026 |
| 1,000 videos | ~$2.49 |
| Daily backup of an account posting 2 videos a day, for a month | ~$0.18 per month |

Covers, sounds and the ZIP are free. Videos that are not found or fail are not charged. Downloaded files use your Apify storage.

#### Ready-made tasks

Open it, change the profile, and run:

| Task | What you get |
|---|---|
| [Download All TikTok Videos From a Profile, No Watermark](https://apify.com/s_actors/tiktok-video-downloader/examples/tiktok-profile-downloader) | The latest videos of a TikTok account as MP4 files and one ZIP |

#### FAQ

**Does the MP4 have a watermark?** No. The Actor saves the clean version TikTok plays on its website, not the "save video" version with the logo and @username.

**What is the difference between the qualities?** TikTok keeps several versions of each video. `compatible` takes the sharpest H.264 one (usually 720p, sometimes 540p for older videos), which plays everywhere. `highest` takes the sharpest version of any codec: often 1080p in H.265/HEVC, which plays on phones, Macs, Chrome, Edge and VLC (older Windows players need Microsoft's free HEVC extension). `smallest` is for large archives. TikTok does not keep 4K versions.

**Can I download all videos of a TikTok profile?** Yes: add `@username`, set **Videos per profile** to `0`. Private accounts cannot be downloaded.

**How long do the download links work?** `videoFileUrl`, `imageFileUrls`, `coverFileUrl`, `audioFileUrl` and the ZIP point to your Apify storage and work as long as the run's storage is kept (unnamed storages are removed after your plan's data retention period). TikTok's own links (`coverUrl`, `musicAudioUrl`) expire after a few days.

**Does it work with short links and photo posts?** Yes: `vm.tiktok.com`, `vt.tiktok.com` and `tiktok.com/t/` links and `/photo/` posts work like videos.

**Do I need a TikTok account or cookies?** No. The Actor reads public videos the way the TikTok website does for a visitor.

**I only need the stats, not the files.** Use [TikTok Video Scraper](https://apify.com/s_actors/tiktok-video-scraper): $0.29 per 1,000 videos, with a views tracker.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client: the dataset gives each file's link, and the ZIP is at `https://api.apify.com/v2/key-value-stores/<storeId>/records/tiktok-videos.zip`. Or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Download the last 10 videos of @nasa in HD".

#### Other tools

| Tool | What it does |
|---|---|
| [TikTok Video Scraper](https://apify.com/s_actors/tiktok-video-scraper) | Stats of TikTok videos: plays, likes, shares, saves, hashtags, place, views growth between runs |
| [TikTok Profile Scraper](https://apify.com/s_actors/tiktok-profile-scraper) | All videos of TikTok profiles: plays, likes, dates, exact followers, new-video alerts, MP4 download |
| [TikTok Transcript Scraper](https://apify.com/s_actors/tiktok-transcript-scraper) | Transcripts and subtitles of TikTok videos and profiles: text, SRT, VTT, translations |
| [TikTok Comments Scraper](https://apify.com/s_actors/tiktok-comments-scraper) | Comments and replies of TikTok videos and profiles, keyword filter, only-new alerts |
| [TikTok Trending Sounds & Songs Scraper](https://apify.com/s_actors/tiktok-trending-sounds-scraper) | Trending TikTok sounds and songs by country and Explore category: videos using each sound, plays, creators, commercial use, MP3 |
| [TikTok Viral Videos & Explore Scraper](https://apify.com/s_actors/tiktok-explore-scraper) | Viral TikTok videos from the Explore page in any country and 21 categories: plays, likes, plays per hour, creators, new-video alerts |
| [YouTube Thumbnail Downloader](https://apify.com/s_actors/youtube-thumbnail-downloader) | Every size of YouTube thumbnails, channel avatars and banners, in one ZIP |
| [Bulk Image Downloader](https://apify.com/s_actors/bulk-image-downloader) | Full-size images from Google Images, URL lists or datasets, in one ZIP |

#### Is it legal?

The Actor downloads only public videos that TikTok shows to any visitor, without logging in. Videos, sounds and captions are the creators' content: download your own videos, ones you have permission to use, or use them in line with copyright law (for example research or commentary), and handle personal data such as usernames in line with GDPR and other privacy laws.

# Actor input Schema

## `videos` (type: `array`):

One per line: video or photo post links (tiktok.com/@user/video/..., /photo/...), short share links (vm.tiktok.com/..., vt.tiktok.com/..., tiktok.com/t/...), video IDs, or profiles (tiktok.com/@user or @user). A profile downloads its latest videos (see Videos per profile).

## `quality` (type: `string`):

Which of TikTok's versions of the video to save. Best H.264 is the sharpest MP4 that plays on every device and editor (usually 720p, the one tiktok.com plays). Highest resolution takes 1080p when it exists, often encoded in H.265/HEVC (plays on phones, Macs, Chrome and VLC; older Windows players need the free HEVC extension). Smallest file saves storage and bandwidth. All without the watermark; each row shows the codec and resolution saved.

## `maxVideosPerProfile` (type: `integer`):

Used only when you add a profile (tiktok.com/@user or @user): how many of its latest videos to download, newest first. 0 = every video of the profile. Video links are not affected.

## `postedAfter` (type: `string`):

Only videos posted after this: a date (2026-09-01) or a relative time (7 days, 2 weeks, 1 month, 1 year). Profiles only.

## `postedBefore` (type: `string`):

Only videos posted before this: a date (2026-10-01) or a relative time (30 days). Profiles only.

## `onlyNewVideos` (type: `boolean`):

For profiles: skip the videos that earlier runs with this option already downloaded (remembered per profile in your key-value store tiktok-downloader-state). Schedule the run daily to back up an account or collect a creator's new posts automatically.

## `skipPhotoPosts` (type: `boolean`):

For profiles: download only videos, not photo carousels.

## `createZip` (type: `boolean`):

Also pack all downloaded files into tiktok-videos.zip (a folder per author, plus metadata.csv with the caption, date, stats and file of every video). Large runs are split into parts of ~200 MB (tiktok-videos-2.zip, ...). The link is in the run's status message and in the Output tab.

## `downloadCovers` (type: `boolean`):

Also save each video's cover image as JPG (coverFileUrl). Free. TikTok's own cover links stop working after a few days.

## `downloadAudio` (type: `boolean`):

Also save each video's sound (music or original audio) as MP3 (audioFileUrl). Free.

## `maxConcurrency` (type: `integer`):

How many TikTok requests run at the same time. Downloads run at most 4 at a time.

## `proxyConfiguration` (type: `object`):

Requests go direct first and switch to Apify datacenter proxies when TikTok refuses them. The default works for most runs.

## `debugLog` (type: `boolean`):

Log every retried request (for troubleshooting).

## Actor input object example

```json
{
  "videos": [
    "https://www.tiktok.com/@nasa/video/7665075736742530317",
    "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
  ],
  "quality": "compatible",
  "maxVideosPerProfile": 20,
  "onlyNewVideos": false,
  "skipPhotoPosts": false,
  "createZip": true,
  "downloadCovers": false,
  "downloadAudio": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

## `zip` (type: `string`):

All downloaded files in one ZIP (a folder per author + metadata.csv). Large runs add tiktok-videos-2.zip and on (see Files).

## `downloads` (type: `string`):

MP4 link, resolution, codec, size, cover and sound links of every video.

## `details` (type: `string`):

Caption, date, plays, likes, comments, shares, hashtags and sound of every video.

## `files` (type: `string`):

Every MP4, image, cover, MP3 and ZIP saved by the run.

## `all` (type: `string`):

Every field of every row.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "videos": [
        "https://www.tiktok.com/@nasa/video/7665075736742530317",
        "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/tiktok-video-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "videos": [
        "https://www.tiktok.com/@nasa/video/7665075736742530317",
        "https://www.tiktok.com/@charlidamelio/video/7137423965982592302",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/tiktok-video-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "videos": [
    "https://www.tiktok.com/@nasa/video/7665075736742530317",
    "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
  ]
}' |
apify call s_actors/tiktok-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/tiktok-video-downloader"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qhB0bBpDjgbPm2lUP/builds/rOPADCKbkmUYWpgxP/openapi.json
