# Video Downloader for TikTok — Bulk HD, Slideshows & Audio (`logiover/tiktok-video-downloader`) Actor

Resolve public TikTok URLs in bulk. Get HD/no-watermark video links, slideshow images, audio, captions, authors and engagement metadata. No login or API key. Not affiliated with TikTok.

- **URL**: https://apify.com/logiover/tiktok-video-downloader.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Social media, Developer tools, Marketing
- **Stats:** 1 total users, 1 monthly users, 96.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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

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

## Video Downloader for TikTok — Bulk HD Videos, Slideshows & Audio

Resolve public TikTok post URLs in bulk and export direct **HD**, **no-watermark**, watermarked video, slideshow image and audio URLs together with captions, authors and engagement metadata. No TikTok login, cookies, browser or API key is required.

This Actor is designed for media archiving, creator workflows, UGC review, content moderation and datasets that need both downloadable assets and structured post metadata. It is not affiliated with, endorsed by or sponsored by TikTok; TikTok and related marks belong to their respective owners.

### What you get

- Best available direct `downloadUrl`, preferring HD when the source exposes it
- Separate `videoUrlHd`, `videoUrlNoWatermark` and `videoUrlWatermark` fields
- Every image from TikTok photo/slideshow posts in `slideshowImageUrls[]`
- Direct sound/music URL plus title, artist, duration and original-sound flag
- Caption, hashtags, author ID/username/nickname/avatar and canonical post URL
- Views, likes, comments, shares, saves, downloads and creation timestamp
- Bulk processing of up to 1,000 public TikTok URLs per run
- A useful trending sample when the Actor is run with empty input
- Official TikTok oEmbed fallback: a failed direct extraction can still return honest metadata with `metadataOnly: true`

### Input

Paste normal post URLs or `vm.tiktok.com` / `vt.tiktok.com` share links:

```json
{
  "startUrls": [
    { "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173" },
    { "url": "https://vm.tiktok.com/EXAMPLE/" }
  ],
  "maxResults": 100,
  "fallbackToOfficialMetadata": true
}
```

| Field | Description |
|---|---|
| `startUrls` | Public TikTok video/photo URLs or short share links. |
| `maxResults` | Global row cap, 1–1,000. Empty-input mode uses the same cap. |
| `region` | Country used only for the empty-input trending feed. |
| `fallbackToOfficialMetadata` | Save official oEmbed metadata if media extraction fails. |
| `concurrency` | Parallel URL requests, 1–10. Default `5`. |
| `includeRawRecord` | Include the original upstream response for custom parsing. |

With `{}` input, the Actor returns a bounded set of public trending posts for the selected region. This makes Store tests, first runs and integrations produce real data without inventing an input.

### Output

Each dataset item represents one TikTok post:

```json
{
  "recordType": "tiktokMedia",
  "id": "6718335390845095173",
  "tiktokUrl": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
  "mediaType": "video",
  "caption": "Scramble up ur name... #foryoupage #PetsOfTikTok",
  "hashtags": ["foryoupage", "PetsOfTikTok"],
  "authorUsername": "scout2015",
  "authorNickname": "Scout, Suki & Stella",
  "downloadUrl": "https://...tiktokcdn.../video/...",
  "videoUrlHd": "https://...tiktokcdn.../video/...",
  "videoUrlNoWatermark": "https://...tiktokcdn.../video/...",
  "audioUrl": "https://...tiktokcdn.../audio/...",
  "durationSeconds": 10,
  "viewCount": 158699,
  "likeCount": 35136,
  "commentCount": 5741,
  "shareCount": 1456,
  "metadataOnly": false,
  "sourceEngine": "tikwm",
  "scrapedAt": "2026-08-02T08:45:00.000Z"
}
```

Direct CDN links are signed by the media host and may expire, so download or copy them soon after the run. Private, friends-only, deleted, age-gated or region-restricted posts are outside the guaranteed scope.

### Reliability and data honesty

The primary extraction route uses TikWM's public API because direct anonymous TikTok pages are aggressively challenged and were not sustainable for the Actor this replaced. Requests are paced to the upstream public-API limit, and both HTTP errors and throttle messages returned inside HTTP 200 responses use bounded retry with jitter. If the direct route fails, the Actor optionally calls TikTok's official oEmbed endpoint and marks the result `metadataOnly: true`; it never fabricates a download URL.

The run fails explicitly when no usable rows can be produced. Individual failed URLs are listed in the run's `SUMMARY` key-value-store record while successful URLs remain in the dataset.

### Use cases

- Archive your own or licensed creator content in bulk
- Build a UGC approval and moderation queue
- Download slideshow assets and audio references for editing workflows
- Enrich TikTok URL lists with author and engagement metadata
- Feed permitted public media into an internal research or ML pipeline
- Sample regional trending media without maintaining a TikTok browser session

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~tiktok-video-downloader/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://www.tiktok.com/@scout2015/video/6718335390845095173"}]}'
```

### Responsible use

Download only content you own or are authorized to use. Public availability does not grant copyright, privacy or redistribution rights. You are responsible for complying with applicable law and platform terms.

### Changelog

#### 2026-08-02 — complete repurpose

- Retired the unreliable TikTok Brand Monitoring implementation after repeated IP-level challenge and empty-feed failures.
- Rebuilt the same Actor slot as a bulk TikTok video, slideshow and audio downloader with a completely new HTTP-only engine.
- Added live direct HD, no-watermark, watermarked video, slideshow image and audio URL extraction.
- Added author, caption, hashtag, post-time and engagement metadata with typed dataset views.
- Added empty-input regional trending mode, bounded retries, bulk concurrency, URL validation and per-run failure summary.
- Added an official TikTok oEmbed fallback that is clearly marked `metadataOnly` and never invents missing media URLs.
- Removed Playwright, residential proxy requirements and the former brand-monitoring schema to reduce cost and eliminate the failed approach.

# Actor input Schema

## `startUrls` (type: `array`):

Public TikTok video, photo/slideshow, vm.tiktok.com or vt.tiktok.com share URLs. Up to 1,000 URLs per run.

## `maxResults` (type: `integer`):

Maximum records to save. Also controls the size of the trending sample when no URL is supplied.

## `region` (type: `string`):

Country feed used only when no URL is supplied. It does not change URL-based downloads.

## `fallbackToOfficialMetadata` (type: `boolean`):

If direct media extraction fails, save the official TikTok oEmbed metadata instead of dropping the URL. Such rows are marked metadataOnly=true.

## `concurrency` (type: `integer`):

Number of TikTok URLs processed in parallel. Keep the default for stable upstream behavior.

## `includeRawRecord` (type: `boolean`):

Add the original upstream payload to each row for advanced debugging and custom parsing.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    }
  ],
  "maxResults": 20,
  "region": "US",
  "fallbackToOfficialMetadata": true,
  "concurrency": 5,
  "includeRawRecord": false
}
```

# Actor output Schema

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

Browse or export every resolved TikTok media record.

## `dataset` (type: `string`):

Open the dataset in Apify Console.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
        }
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "startUrls": [{ "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173" }],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "startUrls": [
    {
      "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    }
  ],
  "maxResults": 20
}' |
apify call logiover/tiktok-video-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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