# TikTok Video Downloader (`lurkapi/tiktok-video-downloader`) Actor

Extract no-watermark TikTok video download links. Supports standard URLs, short links, and batch processing with concurrent extraction.

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

## Pricing

from $1.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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

Download TikTok videos **without watermark**. Paste a link, get the video file.

### 🎬 What it does

Give it one or more TikTok video links, and it will:

1. **Download the video** without the TikTok watermark
2. **Save it** to your Apify storage with a direct download link
3. **Grab video details** like the creator's name, description, view count, and more

Works with any public TikTok video. Just copy the link from the TikTok app or website.

### 📋 How to use it

#### Step 1: Paste your links

Add your TikTok video URLs in the input. You can add up to 1,000 at a time.

```json
{
    "videoUrls": [
        "https://www.tiktok.com/@username/video/1234567890",
        "https://vm.tiktok.com/ZTR45GpSF/"
    ]
}
````

**Supported URL formats:**

- Full links: `tiktok.com/@username/video/1234567890`
- Short links: `vm.tiktok.com/...` or `vt.tiktok.com/...` (the ones you get when you tap "Share")
- Embed links: `tiktok.com/embed/1234567890`

#### Step 2: Run it

Click **Start** and wait for it to finish. Each video takes a few seconds.

#### Step 3: Get your videos

Once it's done, check the **Output** tab. For each video you'll get:

- **status**: Shows "Success" if the video was downloaded. If something went wrong, it tells you what happened and what you can do about it.
- **videoFileUrl**: Direct link to the MP4 file, stored in your Apify storage.
- **thumbnailFileUrl**: Direct link to the thumbnail image.
- **videoTiktokUrl**: Temporary streaming link from TikTok. Expires after a few hours.
- **thumbnailTiktokUrl**: Temporary thumbnail link from TikTok. Expires after a few hours.
- **author**: Creator's name and username.
- **title**: Video description/caption.
- **duration**: Video length in seconds.
- **stats**: Views, likes, shares, comments, and saves.

#### Example output

```json
{
    "status": "Success",
    "inputUrl": "https://www.tiktok.com/@rickastleyofficial/video/7593022588272561430",
    "videoId": "7593022588272561430",
    "videoFileUrl": "https://api.apify.com/v2/key-value-stores/.../records/video-7593022588272561430",
    "videoTiktokUrl": "https://v16-webapp-prime.tiktok.com/video/...",
    "thumbnailFileUrl": "https://api.apify.com/v2/key-value-stores/.../records/thumbnail-7593022588272561430",
    "thumbnailTiktokUrl": "https://p16-sign.tiktokcdn-us.com/...",
    "author": "Rick Astley",
    "authorId": "rickastleyofficial",
    "title": "",
    "duration": 15,
    "stats": {
        "plays": 386,
        "likes": 40,
        "shares": 0,
        "comments": 2,
        "saves": 9
    }
}
```

### 🌐 Proxy settings

By default, the Actor uses Apify's datacenter proxies to avoid IP blocks from TikTok.

You can change this in the **Proxy Configuration** section of the input:

- **Automatic (default)**: Apify selects the best proxy group automatically.
- **Datacenter**: Fast and cheap. Works for most videos.
- **Residential**: Use if you get frequent IP blocks. Slower and costs more, but most reliable.
- **Own proxies**: Provide your own proxy URLs.
- **No proxy**: Disable proxies entirely. There will be no IP rotation if you get blocked.

### 💰 Pricing

You pay per second of video downloaded: **$0.001 per second** ($1 = 1,000 seconds of video).

Examples:

- A 15-second TikTok costs $0.015
- A 60-second TikTok costs $0.06
- Minimum charge is 1 second per video

Failed downloads (e.g. private videos, IP blocks) are not charged.

### 💡 Good to know

- **Private videos** can't be downloaded. You'll get a clear error explaining why.
- **Short links** (like `vm.tiktok.com/...`) are resolved automatically.
- **Duplicate URLs** in your input are automatically removed.
- **Slideshow posts** (photo carousels) are not supported. This tool only downloads videos.
- **Storage**: Files at `videoFileUrl` and `thumbnailFileUrl` are stored in your Apify storage. How long they're kept depends on your Apify plan. The TikTok links (`videoTiktokUrl`, `thumbnailTiktokUrl`) expire after a few hours.
- You can adjust `maxConcurrency` (1 to 10) to process more videos in parallel.
- You can add up to 1,000 URLs per run.

### ❓ FAQ

**Why did my download fail?**

Check the `status` field in the output. Common reasons:

- The video is **private** or the account is private. Only public videos can be downloaded.
- The video was **removed** by the creator or by TikTok.
- TikTok is **blocking the request**. Try switching to residential proxies in the Proxy Configuration input.

**Which proxy should I use?**

Start with the default (Automatic). If you see errors about videos being unavailable or downloads being blocked, switch to **Residential**. It costs more but handles most blocking issues.

**How long are the downloaded files stored?**

The files at `videoFileUrl` and `thumbnailFileUrl` are stored in your Apify storage. How long they're kept depends on your Apify plan. You can check your plan's data retention in the Apify Console.

### 🔗 Other tools you might like

- [YouTube Video Downloader](https://apify.com/lurkapi/youtube-video-downloader) - Download YouTube videos and audio in any quality and format.

### ⚖️ Disclaimer

This tool is intended for personal, research, and educational use. You are responsible for complying with TikTok's Terms of Service and applicable laws in your jurisdiction. The developer is not liable for misuse. Video availability depends on TikTok at run time.

**Keywords:** TikTok video downloader, TikTok no watermark, TikTok video saver, download TikTok MP4, TikTok bulk download, social media video download

# Actor input Schema

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

Paste your TikTok video links here. Supports full URLs and short links (vm.tiktok.com).

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

Maximum number of videos to process in parallel.

## `proxyConfig` (type: `object`):

Select proxies for scraping TikTok. Datacenter proxies work for most videos. Use residential if you get frequent blocks.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@rickastleyofficial/video/7593022588272561430"
  ],
  "maxConcurrency": 3,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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/@rickastleyofficial/video/7593022588272561430"
    ],
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/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 = {
    "videoUrls": ["https://www.tiktok.com/@rickastleyofficial/video/7593022588272561430"],
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/@rickastleyofficial/video/7593022588272561430"
  ],
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call lurkapi/tiktok-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lurkapi/tiktok-video-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Video Downloader",
        "description": "Extract no-watermark TikTok video download links. Supports standard URLs, short links, and batch processing with concurrent extraction.",
        "version": "0.0",
        "x-build-id": "DMWmTQamRUU5g2lI8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lurkapi~tiktok-video-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lurkapi-tiktok-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lurkapi~tiktok-video-downloader/runs": {
            "post": {
                "operationId": "runs-sync-lurkapi-tiktok-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lurkapi~tiktok-video-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-lurkapi-tiktok-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "TikTok Video URLs",
                        "type": "array",
                        "description": "Paste your TikTok video links here. Supports full URLs and short links (vm.tiktok.com).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of videos to process in parallel.",
                        "default": 3
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Select proxies for scraping TikTok. Datacenter proxies work for most videos. Use residential if you get frequent blocks.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": []
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
