# TikTok Video Stats Scraper (`inovaflow/tiktok-video-stats-scraper`) Actor

Paste TikTok video URLs, get views, likes, comments, shares, saves, engagement rate, caption, hashtags, mentions, music and the creator's followers. Name a tracker and re-run to see each video's growth since the last run. For UGC and influencer campaign tracking. No login.

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

## Pricing

from $1.00 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

**Paste your TikTok video links, get every video's views, likes, comments, shares, saves and engagement rate — and, run after run, how much each one grew.**

If you run influencer or UGC campaigns, you know the reporting week. Twenty creators posted, the client wants a deck, and someone opens every TikTok one by one to copy numbers into a spreadsheet — then does it again next Friday to show the growth. Half the links arrive as share links from WhatsApp, a few videos got deleted, and nobody remembers what the numbers were last week.

We built this for our own campaign reports first, and now we're sharing it. Paste the links (full URLs, `vm.tiktok.com` share links or bare IDs), and you get one clean row per video. Give the list a **tracker name** and run it again tomorrow or every day on a schedule: each row then also shows the change since the last run — views gained, likes gained, views per hour — without you keeping any spreadsheet of old numbers.

### Who it's for

- Influencer and UGC agencies reporting on creator deliverables — *"how did the 24 videos from the spring campaign do this week?"*
- Brand and social media managers tracking paid or seeded posts — *"which creator brought the most views per dollar?"*
- Creators and managers proving results to sponsors — *"views, saves and engagement for my sponsored videos, as a table."*
- Analysts and AI agents that need TikTok numbers in a pipeline — flat JSON, one call, no login.

### What you get per video

Views, likes, comments, shares, saves (bookmarks), reposts, **engagement rate** (likes + comments + shares + saves ÷ views), post date, length, caption, hashtags, mentioned accounts, the sound (title, author, original or not), photo-post flag, region and language, cover image — plus the creator: username, display name, verified badge, **followers**, following, total likes and video count.

With a tracker name, every row also gets `viewsChange`, `likesChange`, `commentsChange`, `sharesChange`, `savesChange`, `viewsPerHour`, `hoursSincePrevious` and `viewsSinceFirstTracked`.

The run's **campaign summary** (Output tab → Campaign summary) adds it all up: total views, likes, comments, shares and saves, the campaign's weighted engagement rate, a per-creator breakdown, the top 10 videos and the total growth since the last tracker run.

### Options

- Video URLs — one per line. Full links, share links (`vm.tiktok.com`, `vt.tiktok.com`, `tiktok.com/t/…`), mobile links and bare video IDs. Duplicates are merged. Up to 5,000 per run.
- Tracker name — optional. Same name = same tracker; the growth is measured against the previous run with that name. Use a new name to start fresh.
- Parallel requests, residential fallback and proxy — advanced; the defaults are fine.

Deleted, private or unreadable videos and links that aren't TikTok videos still get a row with a `status` (`not-found`, `private`, `failed`, `invalid-url`) and an `error`, so you can see what happened to every link — those rows are free.

### How to set it up

1. Paste your video links into **Video URLs**.
2. Optional: type a **Tracker name** such as `spring-campaign`.
3. Click **Start**. A few hundred videos take a minute or two.
4. For daily growth: save the input as a task and add a **schedule** (for example every morning). Each run compares against the one before.

And that's it. Export the table as CSV or Excel, or pull it into Google Sheets, Looker Studio or your own tool through the API.

### Pricing

You pay per video delivered — **$0.001 per video** (that's $1 per 1,000 videos), plus Apify's small start fee per run. Failed, deleted, private and duplicate links cost nothing.

> Tip: a tracker run costs the same as a normal run — tracking 50 campaign videos every day for a month is under $2 in total.

### Notes

- Numbers are the ones TikTok shows publicly. TikTok rounds big counters the way the app displays them (for example 5,300,000 views or 660,600 likes), so small changes on very big videos may show up in steps.
- Only public videos. No login, no cookies of yours, nothing posted or liked.
- Use the data in line with TikTok's terms and your local privacy laws.

Found a bug or need another field? Open an issue on the **Issues** tab — we usually answer within a day. Need a custom TikTok report or integration? Ask there too.

# Actor input Schema

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

TikTok video links, one per line — `https://www.tiktok.com/@creator/video/7114641064446676267`, a share link like `https://vm.tiktok.com/ZMabc123/`, or just the video ID. Up to 5,000 per run.

## `trackerName` (type: `string`):

Optional. Name this list — `spring-campaign`, `creator-x-deliverables` — and every re-run under the same name adds the change in views, likes, comments, shares and saves since the previous run, plus views per hour. Leave empty for a one-off snapshot.

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

How many videos are read at the same time.

## `residentialFallback` (type: `boolean`):

Videos are read through fast datacenter proxies. If TikTok refuses one several times, it is retried through a residential proxy. Turn off to never use residential traffic.

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

Apify datacenter proxy by default — TikTok's public video pages load fine there.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@zachking/video/6768504823336815877",
    "https://vm.tiktok.com/ZMabc123/"
  ],
  "trackerName": "spring-ugc-campaign",
  "maxConcurrency": 5,
  "residentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `stats` (type: `string`):

One row per video: views, likes, comments, shares, saves, engagement rate, caption, hashtags, music and the creator.

## `growth` (type: `string`):

With a tracker name: the change of every counter since the previous run.

## `summary` (type: `string`):

Totals across all videos, weighted engagement rate, per-creator breakdown, top videos and the change since the previous tracker run.

# 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/@zachking/video/6768504823336815877",
        "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("inovaflow/tiktok-video-stats-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 = {
    "videoUrls": [
        "https://www.tiktok.com/@zachking/video/6768504823336815877",
        "https://www.tiktok.com/@scout2015/video/6718335390845095173",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("inovaflow/tiktok-video-stats-scraper").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/@zachking/video/6768504823336815877",
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call inovaflow/tiktok-video-stats-scraper --silent --output-dataset

```

## MCP server setup

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

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/VT4656uFruevzs9bY/builds/1zJ5JZw99AyjVvhav/openapi.json
