# TikTok Video Downloader - No Watermark MP4 + MP3 (`khadinakbar/tiktok-no-watermark-downloader`) Actor

Download TikTok videos as no-watermark MP4 files plus optional MP3 audio and cover image, saved as permanent Apify Key-Value store URLs. Provider-backed, no cookies required, MCP optimized for AI agents.

- **URL**: https://apify.com/khadinakbar/tiktok-no-watermark-downloader.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Automation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 video downloadeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Video Downloader - No Watermark MP4 + MP3

Download TikTok videos as **no-watermark MP4** files (plus optional **MP3 audio** and **cover image**) saved as **permanent Apify Key-Value store URLs**. Built for content marketers, AI workflows, and agents that need an actual video binary - not an expiring CDN URL.

### What this actor does

Give it one or more TikTok video URLs. For each video it:

1. Resolves the canonical video metadata via **ScrapeCreators** (primary) or **SociaVault** (fallback).
2. Fetches the **no-watermark MP4** binary from the TikTok CDN.
3. Saves the MP4 to the run's Apify Key-Value store as `video__<videoId>`.
4. Optionally saves the **MP3 audio** track (`audio__<videoId>`) and **cover image JPEG** (`cover__<videoId>`).
5. Pushes a flat dataset record with the public **Apify Key-Value store URLs** for every saved binary, plus full video metadata (caption, author, stats, music, hashtags).

The URLs returned in the dataset are **permanent** for the lifetime of the run's KV store and do **not** expire on the TikTok CDN side - because the file is yours, not TikTok's.

### When to use this actor (and when NOT to)

**Use this actor when:**

- You need the actual `.mp4` or `.mp3` file (not just a URL).
- You're repurposing TikTok content into long-form video, Reels, Shorts, or YouTube.
- You're training/feeding an AI pipeline (multimodal models, ASR, video understanding) and need binaries.
- You're archiving content for research or compliance.
- You're an MCP agent that needs a single tool call: TikTok URL in, downloadable file out.

**Do NOT use this actor for:**

- **Metadata-only scraping** - use [`tiktok-video-scraper`](https://apify.com/khadinakbar/tiktok-video-scraper) instead. It's cheaper if you only need captions, stats, and CDN URLs.
- **Profile, hashtag, or keyword discovery** - this actor downloads specific videos by URL. Combine with `tiktok-video-scraper` for profile feeds first, then pipe URLs here.
- **Bulk channel rip in one click** - you must supply each video URL. Use `tiktok-video-scraper` to enumerate URLs from a profile, then this actor downloads them.

### Output

One dataset record per video. Key fields:

| Field | Type | Example |
|---|---|---|
| `videoId` | string | `7324105620095765765` |
| `videoUrl` | string | `https://www.tiktok.com/@stoolpresidente/video/...` |
| `authorUsername` | string | `stoolpresidente` |
| `authorNickname` | string | `Dave Portnoy` |
| `caption` | string | full caption text |
| `createdAt` | string | ISO 8601 |
| `durationMs` | int | `15800` |
| `width` / `height` | int | `1080` / `1920` |
| `playCount` / `likeCount` / `commentCount` / `shareCount` | int | counts at fetch time |
| `hashtags` | string\[] | `["barstool", "nyc"]` |
| `musicTitle` / `musicAuthor` | string | sound metadata |
| **`kvNoWatermarkUrl`** | string | **permanent Apify URL to the no-watermark MP4** |
| **`kvNoWatermarkBytes`** | int | file size |
| `kvWatermarkedUrl` | string | only when `includeWatermarked=true` |
| `kvMp3Url` | string | only when `extractAudio=true` |
| `kvCoverUrl` | string | only when `includeCover=true` (default) |
| `provider` | string | `scrapecreators` or `sociavault` |
| `scrapedAt` | string | ISO 8601 |
| `_error` | string | set only when a download failed |

### Pricing

**Pay-Per-Event (PPE) - billed only for successfully saved files:**

| Event | Price |
|---|---|
| `apify-actor-start` | $0.00005 per run |
| **`video-downloaded`** | **$0.012 per video** (no-watermark MP4 saved to KV) |
| `audio-extracted` | $0.008 per video (only when `extractAudio=true`) |

**Pay-Per-Usage** is also enabled for power users who prefer compute + proxy passthrough billing. Pick whichever model is cheaper for your job at run time.

**Typical run cost (PPE):**

- 10 videos, video only: **$0.12**
- 10 videos, video + audio + cover: **$0.20**
- 50 videos, default (video + cover): **$0.60**

### Quick start

#### Apify Console

1. Paste TikTok video URLs into **TikTok video URLs**.
2. Toggle **Extract MP3 audio**, **Include watermarked MP4**, **Include cover image** as needed.
3. Click **Start**.
4. After the run finishes, open the **Dataset** tab to see one row per video with clickable Key-Value store URLs.

#### API (cURL)

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~tiktok-no-watermark-downloader/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "videoUrls": [
      "https://www.tiktok.com/@stoolpresidente/video/7324105620095765765"
    ],
    "extractAudio": true,
    "includeCover": true
  }'
```

#### Node.js SDK

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('khadinakbar/tiktok-no-watermark-downloader').call({
  videoUrls: ['https://www.tiktok.com/@user/video/1234567890'],
  extractAudio: false,
  includeCover: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].kvNoWatermarkUrl);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("khadinakbar/tiktok-no-watermark-downloader").call(run_input={
    "videoUrls": ["https://www.tiktok.com/@user/video/1234567890"],
    "extractAudio": False,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["kvNoWatermarkUrl"])
```

#### MCP / Claude / GPT agents

Available in [Apify MCP](https://mcp.apify.com) as `apify--tiktok-no-watermark-downloader`. Single tool call: video URL in, MP4 download URL out. Predictable PPE pricing per call (~$0.012 per video). Perfect tool when an agent is asked to "download this TikTok" or "save this video for later editing".

### How it works under the hood

1. URLs in `videoUrls` are normalized (short share links like `vm.tiktok.com/ZXXX/` are preserved and resolved upstream).
2. Each URL is sent to the configured providers in `providerOrder` (default: ScrapeCreators first, SociaVault on failure). Both expose TikTok's public video endpoint and return the same canonical aweme structure.
3. The actor extracts the no-watermark download URL (`video.download_no_watermark_addr` or fallback to `video.play_addr` with no-watermark flag), the music URL, and the cover URL.
4. Each binary is fetched with mobile-Safari headers + `Referer: https://www.tiktok.com/`. TikTok's CDN serves signed URLs but accepts any user-agent.
5. Files are written to the run's default Key-Value store. The dataset row stores the **public Apify URL** for each binary.

### Sister actors (TikTok cluster)

- [`tiktok-video-scraper`](https://apify.com/khadinakbar/tiktok-video-scraper) - video metadata + creator profile feeds (URLs only, cheaper).
- [`tiktok-profile-scraper`](https://apify.com/khadinakbar/tiktok-profile-scraper) - profile bio, follower count, recent videos.
- [`tiktok-video-comments-scraper`](https://apify.com/khadinakbar/tiktok-video-comments-scraper) - comments by video URL.
- [`tiktok-transcript-scraper`](https://apify.com/khadinakbar/tiktok-transcript-scraper) - WEBVTT transcripts.
- [`tiktok-trending-hashtags-scraper`](https://apify.com/khadinakbar/tiktok-trending-hashtags-scraper) - trending hashtag discovery.

Typical pipeline: discover videos with `tiktok-video-scraper` → pipe URLs into this actor → save MP4 files.

### Notes & limitations

- **Watermark removal** depends on the provider surfacing a no-watermark URL. When only a watermarked URL is available, the actor saves that (and `kvWatermarkedUrl` matches `kvNoWatermarkUrl`). The `_error` field is set only when no video URL is surfaced at all.
- **MP3 extraction** uses the TikTok music/sound URL surfaced by the provider, not ffmpeg re-encoding. The original sound is what's saved.
- **File size cap** is 100 MB per binary (sane bound; TikTok videos are typically 1-10 MB).
- **PPE billing**: you are charged only for videos that are successfully saved. Failed downloads do not bill the `video-downloaded` event but the `apify-actor-start` charge applies once per run.

### FAQ

**Q: Do I need a TikTok cookie or login?**
No. The actor is fully provider-backed. No cookies, no TikTok credentials.

**Q: Are downloaded files private?**
The Apify Key-Value store records have public read URLs scoped to the run. If your run is private, only token-authenticated callers can read them. For public-actor runs, the URLs are accessible to anyone with the URL.

**Q: How long are the KV URLs valid?**
For the lifetime of the run's data retention (default: indefinite on paid plans; subject to your Apify plan retention policy). For permanent off-Apify storage, pull the binaries from the URLs into S3 / Cloudflare R2 / your own bucket.

**Q: Can I download multiple videos at once?**
Yes. Pass up to 500 URLs in `videoUrls`. Default cap is 50 (set via `maxVideos`). Videos are processed sequentially to keep memory low.

**Q: What happens on a failed download?**
The dataset row gets an `_error` field with the reason. PPE is NOT charged for that video. If ALL downloads fail, the run is marked FAILED to keep the success-rate metric honest.

### Legal

This actor downloads publicly accessible TikTok content. You are responsible for complying with TikTok's Terms of Service, applicable copyright law, and any platform-specific rules (e.g. attribution requirements, commercial use restrictions). Do not redistribute copyrighted content without permission from the rights holder.

The actor is independent and not affiliated with, endorsed by, or sponsored by TikTok Inc. or ByteDance.

### Support

Open an issue in the actor's **Issues** tab on the Apify Store page. Include your run ID for fastest triage.

# Actor input Schema

## `videoUrls` (type: `array`):

One or more TikTok video URLs to download. Accepts canonical URLs like 'https://www.tiktok.com/@user/video/1234567890' and short share links like 'https://vm.tiktok.com/ZXXX/'. Defaults to one prefilled example. NOT a profile URL or hashtag - this actor downloads specific videos by URL only.

## `extractAudio` (type: `boolean`):

When true, save the video's music or sound track as an MP3 file in the Apify Key-Value store and return a kvMp3Url. Defaults to false. Adds $0.008 per video to the PPE bill via the audio-extracted event. Source is the TikTok music URL surfaced by the provider, not an ffmpeg re-encode.

## `includeWatermarked` (type: `boolean`):

When true, also save the standard watermarked TikTok MP4 alongside the no-watermark version and return a kvWatermarkedUrl. Defaults to false. Useful if you need both versions for comparison or fallback when the no-watermark URL fails. Does not affect billing.

## `includeCover` (type: `boolean`):

When true, save the video's cover thumbnail as a JPEG in the Key-Value store and return a kvCoverUrl. Defaults to true. Useful for video previews in dashboards, CMS imports, and AI-generated thumbnails. Does not affect billing.

## `providerOrder` (type: `string`):

Order in which the upstream data providers (ScrapeCreators and SociaVault) are tried for the video metadata lookup. Defaults to 'scrapecreators-first'. Use 'sociavault-first' if ScrapeCreators is down. The 'only' variants disable failover. Binary download happens against the TikTok CDN URLs returned by whichever provider succeeds.

## `maxVideos` (type: `integer`):

Hard cap on the number of videos downloaded in this run. Used to keep PPE bill predictable. Defaults to 50. Range 1 to 500. Excess URLs in 'videoUrls' beyond this cap are skipped and reported in the run summary, not silently dropped.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@user/video/7324105620095765765",
    "https://vm.tiktok.com/ZMhuLkX5J/"
  ],
  "extractAudio": false,
  "includeWatermarked": false,
  "includeCover": true,
  "providerOrder": "scrapecreators-first",
  "maxVideos": 50
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of normalized records with kvNoWatermarkUrl, kvMp3Url, kvCoverUrl, kvWatermarkedUrl, full video metadata, and provider diagnostics.

## `runSummary` (type: `string`):

Per-run summary with counts of downloaded videos, audio extracts, covers, failures, and PPE billing estimate.

# 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 = {
    "videoUrls": [
        "https://www.tiktok.com/@mrbeast/video/7654638524729216287"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/tiktok-no-watermark-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 = { "videoUrls": ["https://www.tiktok.com/@mrbeast/video/7654638524729216287"] }

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/tiktok-no-watermark-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 '{
  "videoUrls": [
    "https://www.tiktok.com/@mrbeast/video/7654638524729216287"
  ]
}' |
apify call khadinakbar/tiktok-no-watermark-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/tiktok-no-watermark-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/H579OVnVcstIvkQcF/builds/l5O2ISc3KqMLoDJ86/openapi.json
