# TikTok Video Scraper — Creator Feeds (`herus13/tiktok-video-scraper`) Actor

Scrape any public TikTok creator's recent videos: views, likes, comments, shares, description, music, cover, and timestamps. Browser-signed, no login.

- **URL**: https://apify.com/herus13/tiktok-video-scraper.md
- **Developed by:** [bootforge](https://apify.com/herus13) (community)
- **Categories:** Automation, Social media, Videos
- **Stats:** 10 total users, 4 monthly users, 90.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 video scrapeds

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

## TikTok Video Scraper

The TikTok Video Scraper is an Apify actor that extracts a public [TikTok](https://www.tiktok.com) creator's **recent videos** by handle or profile URL — no login, no account, no cookies. It returns one structured record per video: description, timestamp, view/like/comment/share counts, duration, cover image, and TikTok's CDN video link. Optionally downloads each video's file too, so you get a link that actually plays outside TikTok.

Use it for creator research, content benchmarking, trend tracking, and social-media analytics — exported to JSON, CSV, or Excel.

> **How it works:** this actor is browser-signed — it drives a real anti-detect browser (Camoufox) to obtain TikTok's request signature, so results are reliable but it is slower and pricier per unit than pure-HTTP scrapers. For profile identity and stats only (no videos), use the companion [TikTok Profile Scraper](https://apify.com/herus13/tiktok-profile-scraper).

### Table of contents

- [What the TikTok video scraper does](#what-the-tiktok-video-scraper-does)
- [Use cases](#use-cases)
- [How to scrape TikTok videos](#how-to-scrape-tiktok-videos)
- [TikTok video scraper input](#tiktok-video-scraper-input)
- [TikTok video data output](#tiktok-video-data-output)
- [How much it costs](#how-much-it-costs)
- [Recommended proxies for TikTok videos](#recommended-proxies-for-tiktok-videos)
- [Why this TikTok video scraper](#why-this-tiktok-video-scraper)
- [FAQ](#faq)
- [Rate this actor](#rate-this-actor-)
- [Related actors](#related-actors)

### What the TikTok video scraper does

- 🔓 **No login required** — anonymous, browser-signed extraction; no TikTok account, password, or session cookie.
- 🔗 **Handle or URL input** — accepts `duolingo`, `@duolingo`, or `https://www.tiktok.com/@duolingo`.
- 🎬 **Recent-video feed per handle** — description, timestamps, view/like/comment/share counts, duration, cover, and video URL, one row per video.
- 🎚️ **Configurable depth** — `max_videos` caps how many recent videos to pull per handle (default 30, ~one feed page).
- ⬇️ **Optional playable download link** — `download_videos` downloads each video's file and hosts it for you, so you get a `download_url` that plays anywhere (the raw `video_url` is TikTok's signed CDN link and only works from our scrape session).
- 📊 **Flat, join-ready output** — every video row carries the parent creator's `unique_id`/`sec_uid`, so it joins cleanly across handles in CSV or a dataset.
- 💵 **Pay only for delivered videos** — $0.003 per video; not-found, blocked, and errored handles are never charged. Video downloads are billed separately, per 10MB.

### Use cases

**Content benchmarking** — One record per video — description, timestamp, view/like/comment/share counts, duration, and cover image — shows which of a creator's videos actually worked and what they had in common.

**Trend tracking** — Timestamps plus engagement counts across a creator set reveal which formats and topics are gaining traction, early enough to act on.

**Archiving and repurposing** — TikTok's CDN video link is returned, and `download_videos` optionally fetches the file, so you get a link that plays outside TikTok rather than one that expires or requires the app.

**Social analytics pipelines** — Share counts are the strongest organic-reach signal TikTok exposes; pulling them alongside views and likes gives a fuller performance picture than a like count alone. No login, account, or cookies required.

### How to scrape TikTok videos

1. Click **Try for free** and open the actor.
2. Add one or more `targets` (handles or profile URLs).
3. Set `max_videos` — how many recent videos to pull per handle.
4. Optional: set `max_profiles` to cap how many handles to process.
5. Keep the default **US residential** proxy prefill, then click **Start**.
6. Export the data as **JSON, CSV, or Excel**, or pull it from the [Apify API](https://docs.apify.com/api/v2).

Scrape one creator's recent videos:

```json
{
  "targets": ["duolingo"],
  "max_videos": 30,
  "proxy": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}
}
```

Scrape several handles, capped:

```json
{
  "targets": ["duolingo", "@ryanair", "https://www.tiktok.com/@khaby.lame"],
  "max_videos": 10,
  "max_profiles": 2,
  "proxy": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}
}
```

Scrape with a playable download link per video:

```json
{
  "targets": ["duolingo"],
  "max_videos": 10,
  "download_videos": true,
  "proxy": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}
}
```

### TikTok video scraper input

| Field | Description |
|---|---|
| `targets` | Handles or profile URLs (`duolingo`, `@duolingo`, or `https://www.tiktok.com/@duolingo`). Returns each creator's recent videos. Required. |
| `max_videos` | How many recent videos to fetch per handle (default 30, ~one feed page). |
| `max_profiles` | Optional cap on how many handles from `targets` to process. |
| `proxy` | Optional. Leaving it as-is (or picking Apify Proxy) routes the run through this actor's own managed US residential pool — TikTok blocks datacenter and non-US IPs, so US residential is required and handled for you. Choosing your own BrightData / Oxylabs / SmartProxy / custom URLs overrides that and is used exactly as given. |
| `download_videos` | Optional, off by default. Downloads each video's file and adds a `download_url` you can play/download from anywhere. Adds a per-10MB charge (see pricing below). |

### TikTok video data output

Each delivered video is one flat dataset row, keyed by `video_id` and carrying the parent creator's `unique_id`/`sec_uid`. Sample (with `download_videos: true`):

```json
{
  "unique_id": "duolingo",
  "sec_uid": "MS4wLjABAAAAxzJGbseZk0TDBgT88nlMt8s4rjFp-Um-B7X545vT-MaVZiZE",
  "video_id": "7514320905909194030",
  "description": "Rook-ies welcome!\u265f\ufe0f Chess lessons are here on iOS! #duolingo",
  "create_time": 1749564234,
  "play_count": 2600000,
  "digg_count": 127700,
  "comment_count": 7403,
  "share_count": 7786,
  "duration_sec": 21,
  "cover_url": "https://p16-common-sign.tiktokcdn-us.com/...",
  "video_url": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/...&signature=...",
  "download_url": "https://api.apify.com/v2/key-value-stores/abc123/records/7514320905909194030-tiktok-video",
  "download_note": "download_url is a direct link to the video file... use download_url instead.",
  "source": "item_list",
  "scraped_at": "2026-08-02T10:51:09+00:00"
}
```

| Field | Description |
|---|---|
| `unique_id` | Parent creator handle the video belongs to. |
| `sec_uid` | Creator's stable TikTok ID (joins rows across handles). |
| `video_id` | Unique video ID. |
| `description` | Video caption text. |
| `create_time` | Post timestamp, Unix seconds. |
| `play_count` | View count. |
| `digg_count` | Like count. |
| `comment_count` | Comment count. |
| `share_count` | Share count. |
| `duration_sec` | Video length in seconds. |
| `cover_url` | Thumbnail/cover image URL. |
| `video_url` | TikTok's raw, signed CDN link to the video file. **Not directly playable outside our scrape session** — it's signed against the proxy IP that fetched it and returns 403 from any other IP. Set `download_videos: true` for a link that actually plays. |
| `download_url` | Only present when `download_videos: true`. A direct, playable download link (hosted in this run's Apify key-value store); its lifetime follows your Apify plan's data-retention setting. |
| `download_note` | Only present when `download_videos: true`. Short explanation of the `video_url` vs `download_url` difference above. |
| `source` | How the row was obtained (e.g. `item_list`). |
| `scraped_at` | ISO timestamp of the scrape. |

Handles that error out (not found, blocked, or fetch failure) contribute zero rows and are never charged.

### How much it costs

This actor uses **pay-per-event** pricing — you pay for the videos you scrape, not for time.

| Event | USD |
|---|---|
| Actor start (per GB memory) | $0.0001 |
| Video scraped | $0.003 |
| Video file, per 10MB (only with `download_videos: true`) | $0.02 |

| Typical run (default 2 GB) | Videos | Cost |
|---|---|---|
| Single handle, 30 videos | 30 | ~$0.0902 |
| 10 creators, 30 videos each | 300 | ~$0.9002 |
| 100 creators, 10 videos each | 1,000 | ~$3.0002 |
| Single handle, 30 videos, `download_videos: true` (~5MB avg) | 30 | ~$0.6902 |

You only pay for videos actually delivered. Handles that are not-found, blocked, or errored are **not** charged. The per-10MB video-file charge only applies when `download_videos: true` and only for videos successfully downloaded.

### Recommended proxies for TikTok videos

A **US residential** proxy is required — TikTok blocks datacenter IPs (like Apify's servers) and non-US exits. The proxy input prefills Apify's RESIDENTIAL group **pinned to the US** (`apifyProxyCountry: "US"`), and the scraper defaults any provider to a US exit unless you set a country, so the correct region is applied out of the box.

The actor supports **Apify Proxy** and external providers (Bright Data, Oxylabs, SmartProxy, or any raw proxy URL). If you run your own scrapers — inside or outside Apify — and need reliable residential IPs for TikTok, social, or e-commerce sites, we use and recommend DataImpulse (pay-as-you-go, per-country targeting, no monthly minimum):

👉 **[Get DataImpulse residential proxies](https://dataimpulse.com/?aff=404588\&utm_source=apify)** (referral link)

```json
// Apify managed proxy (easiest)
{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}

// Bright Data
{"provider": "brightdata", "username": "YOUR_USER", "password": "YOUR_PASS", "zone": "residential", "country": "US"}

// Oxylabs
{"provider": "oxylabs", "username": "YOUR_USER", "password": "YOUR_PASS", "proxy_type": "residential", "country": "US"}

// Any proxy URL
{"provider": "raw_urls", "urls": ["http://user:pass@proxy.example.com:8080"]}
```

### Why this TikTok video scraper

- **No login, no cookies** — anonymous extraction of publicly visible video data; nothing from your TikTok account is used.
- **Browser-signed reliability** — drives a real anti-detect browser (Camoufox) to produce TikTok's signed `item_list` request, without reverse-engineering the signer.
- **Flat, join-ready rows** — one row per video, each stamped with the parent creator's `unique_id`/`sec_uid` for clean cross-handle joins in CSV.
- **Honest billing** — pay only for delivered videos; not-found, blocked, and errored handles never produce rows and are never charged. A handle with genuinely zero public videos is a successful, zero-cost result — the run only fails when every handle in it hit a real error (blocked/not-found/fetch failure), never for a creator who simply has no public videos.
- **Open source** — the underlying `tiktok-scraper` Python package ships a Typer CLI and a FastAPI server; the Apify wrapper is a thin layer.

### FAQ

**Do I need a TikTok account or login?**
No. The actor extracts only publicly visible video data anonymously — no account, password, or session cookie. It reads the same recent-video feed a logged-out visitor sees on a creator's profile page.

**Do I need a proxy?**
Yes — a US residential proxy is required. TikTok blocks requests from datacenter IPs (like Apify's servers) and from non-US exits. The proxy input prefills the easiest option: Apify RESIDENTIAL pinned to `US`, so it works out of the box.

**Which proxies work best for TikTok?**
Residential IPs with per-country targeting, pinned to the US. Apify's RESIDENTIAL group works by default; for your own scrapers we recommend [DataImpulse](https://dataimpulse.com/?aff=404588\&utm_source=apify) residential proxies (referral link) — pay-as-you-go with per-country targeting.

**Why does this actor need a browser? The profile actor doesn't.**
TikTok's video feed (`item_list`) requires a signed request that only a real browser session produces reliably. This actor drives an anti-detect browser (Camoufox) to capture that signed response, which is why it needs more memory and runs slower per handle than the HTTP-only profile actor. The optional `msToken` input can warm-start the feed on flaky IPs.

**How deep does it go — full history or just recent?**
Recent videos only, up to `max_videos` per handle (default 30, ~one feed page). It is not a full video-history crawler.

**Is scraping TikTok legal?**
This actor collects only publicly available video data. You are responsible for complying with TikTok's terms and applicable laws. Do not collect personal data without a lawful basis.

**Why doesn't `video_url` play in my browser or media player?**
`video_url` is TikTok's raw CDN link, signed against the specific proxy IP that fetched it — it returns 403 Forbidden from any other IP, regardless of headers, and isn't meant to be opened directly. Set `download_videos: true` to get a `download_url` that actually plays anywhere (see pricing above for the added cost).

### Rate this actor ⭐

If the TikTok Video Scraper saved you time, please **leave a review on its Apify Store page** — ratings help other people find it and tell us what to build next. Hit a bug or missing field? Open an issue or contact us through the actor's **Issues** tab and we'll fix it fast — recency and reliability are what keep this actor ranking.

### Related actors

Building a broader social or lead pipeline? Pair this actor with our other scrapers — same proxy config format, same Pydantic-validated output, all open source.

- **[TikTok Profile Scraper](https://apify.com/herus13/tiktok-profile-scraper)** — public TikTok profile identity and stats (nickname, bio, avatar, follower/following/heart/video counts). No login, HTTP-only, cheaper per unit.
- **[TikTok Shop Product Scraper](https://apify.com/herus13/tiktok-shop-scraper)** — scrape TikTok Shop products across 10 regions (US, GB, VN, TH, PH, MY, SG, JP, MX, BR): variants, prices, seller info, ratings, sold counts.
- **[Instagram Profile Scraper](https://apify.com/herus13/instagram-profile-scraper)** — public Instagram profiles: bio, followers, recent posts. No login.
- **[Google Maps Business & Contact Scraper](https://apify.com/herus13/google-maps-scraper)** — extract business leads with emails, phone numbers, reviews, images, and social links.

# Actor input Schema

## `targets` (type: `array`):

@handles, bare handles, or full profile URLs (https://www.tiktok.com/@lielie229). Returns each creator's recent videos.

## `max_videos` (type: `integer`):

How many recent videos to fetch per handle. Default 30 (~one feed page).

## `max_profiles` (type: `integer`):

Optional cap on how many handles to process.

## `proxy` (type: `object`):

<p><strong>Required.</strong> TikTok blocks datacenter IPs and non-US exits — the managed pool exits from the US.</p><p><strong>You do not need to supply a proxy.</strong> Leaving this as-is (or picking Apify Proxy) routes the run through this actor's own managed residential pool — the Apify selection is a fallback, used only if the managed pool is unavailable, so an Apify Proxy selection here usually does <em>not</em> bill Apify residential traffic. Choosing your own BrightData / Oxylabs / SmartProxy / custom URLs overrides that entirely and is used exactly as given.</p>
## `download_videos` (type: `boolean`):

<p>When on, also downloads each video's file and gives you a <code>download_url</code> playable from anywhere. Off by default, <code>video_url</code> is TikTok's raw signed CDN link — it only works from our proxy's IP at scrape time and returns <strong>403</strong> if opened elsewhere.</p><p>Adds a per-10MB charge on top of the per-video price. <code>download_url</code> is hosted in this run's Apify key-value store; its lifetime follows your Apify plan's data-retention setting (7 days on Free, 31 on paid plans by default).</p>

## Actor input object example

```json
{
  "targets": [
    "lielie229"
  ],
  "max_videos": 30,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "download_videos": false
}
```

# Actor output Schema

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

TikTok videos with stats (one row per video). With download\_videos=true, rows also include download\_url (playable file link) and download\_note.

# 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 = {
    "targets": [
        "lielie229"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("herus13/tiktok-video-scraper").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 = {
    "targets": ["lielie229"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("herus13/tiktok-video-scraper").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 '{
  "targets": [
    "lielie229"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call herus13/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/LMUpTpsMgYaOKtmq0/builds/Q1w8J5nI8qSyG5B0d/openapi.json
