# TikTok Video Stats & Campaign Report (`getdataforu/tiktok-video-stats`) Actor

Views, likes, comments, shares, saves and engagement rate for any list of TikTok videos, plus a campaign report with cost per view.

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

## Pricing

from $0.60 / 1,000 video checkeds

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

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

## TikTok Video Stats & Campaign Report

Paste a list of TikTok video links. Get back **views, likes, comments, shares, saves and engagement rate** for every one of them — and a campaign report you can hand straight to a client.

No login, no TikTok account, no API keys. Works for creators in any country, including Vietnam, Indonesia, Thailand and the rest of Southeast Asia.

### What it's for

- **KOL / influencer campaign reporting** — you booked 30 creators; paste their 30 video links, get total reach, engagement and cost per view in one run.
- **Paid-post verification** — check that the views a creator reports are the views TikTok shows.
- **Competitor content tracking** — re-run on a competitor's videos weekly and watch which ones keep growing.
- **Content research** — compare engagement across a set of videos before you brief your own.

### What you get for each video

| | |
|---|---|
| **Performance** | Views, likes, comments, shares, saves, engagement rate |
| **Creator** | Username, display name, verified badge, follower count, profile link |
| **Content** | Caption, hashtags, mentions, music title and author, duration, language |
| **Timing** | Posting date and time |
| **Media** | Cover image, playable video link |

Engagement rate = (likes + comments + shares + saves) ÷ views — the definition most agencies report.

### The campaign report

Every run also writes a **`CAMPAIGN_REPORT`** record to the key-value store:

```json
{
  "videosRequested": 6,
  "videosFound": 3,
  "videosFailed": 2,
  "totals": { "views": 21500000, "likes": 1780900, "comments": 16802, "shares": 632400, "saves": 70301, "interactions": 2500403 },
  "engagementRate": 0.1163,
  "medianViews": 4300000,
  "creators": [
    { "username": "haf_barbie", "followers": 66700, "views": 13400000, "engagementRate": 0.1143, "viewsPerFollower": 200.9 },
    { "username": "tuanhamez", "followers": 338500, "views": 4300000, "engagementRate": 0.1135, "viewsPerFollower": 12.7 }
  ],
  "budget": { "total": 500, "currency": "USD", "costPerThousandViews": 0.02326, "costPerView": 0.00002326, "costPerInteraction": 0.0002 },
  "failed": [
    { "input": "not a link", "error": "Not a TikTok video URL or ID" },
    { "input": "https://www.tiktok.com/@tiktok/video/7000000000000000001", "error": "This video does not exist or was deleted" }
  ]
}
```

*(Real output from a test run: 6 links in, one duplicate merged, one typo and one deleted video reported, three videos measured in 12 seconds.)*

`viewsPerFollower` above 1 means a creator's video travelled beyond their own audience — the clearest sign a booking was worth it.

### Input

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@haf_barbie/video/7693113599358864647",
    "7693226011021987092"
  ],
  "campaignBudget": 1000,
  "currency": "USD"
}
```

| Field | Default | Notes |
|---|---|---|
| `videoUrls` | — | **Required.** Full video links or bare video IDs. Tracking parameters are stripped and duplicates removed. |
| `campaignBudget` | — | Optional total spend. Adds cost per 1,000 views, per view and per interaction to the report. |
| `currency` | `USD` | Label for the budget. |
| `maxConcurrency` | `10` | Videos fetched in parallel, each through its own IP. |
| `proxyConfiguration` | Residential | Leave as is unless you have your own proxies. |

### You only pay for videos that load

Deleted, private and mistyped links are **not** written to the dataset, so they are never charged. They are listed with a plain-language reason in `CAMPAIGN_REPORT.failed` instead.

### Tips

- **Re-run the same list** a week later to see how much each video grew.
- **Short share links** (`vm.tiktok.com/...`) are followed to the full video. If one fails, open it in a browser and paste the full URL instead.
- **The `videoPlayUrl` link expires** after a few hours — it is signed by TikTok. Download the video soon after the run if you need it.

### Limitations

- Numbers are what TikTok shows publicly. TikTok rounds large counts on its own pages for some videos.
- Private accounts and age-restricted videos cannot be read without logging in, so they show up in `failed`.
- One video page is roughly 400 KB, so very large runs use a noticeable amount of residential proxy traffic.

### Legal

Reads only data that TikTok shows to any visitor without logging in. You are responsible for how you use it.

# Actor input Schema

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

TikTok video URLs, one per line. Full links (https://www.tiktok.com/@user/video/123...) and bare video IDs both work. Duplicates are removed automatically.

## `campaignBudget` (type: `integer`):

What you paid for these videos in total. When set, the campaign report adds cost per 1,000 views, cost per view and cost per interaction.

## `currency` (type: `string`):

Currency of the budget above. Only used as a label in the report.

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

Each video is fetched through its own proxy IP, so higher is faster. 10 is a good balance; lower it if you see many failures.

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

Residential proxies are used by default. TikTok returns empty video pages to some regions, so the actor routes requests through the US unless you pick a country here.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@haf_barbie/video/7693113599358864647"
  ],
  "currency": "USD",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `videos` (type: `string`):

Every video that loaded: views, likes, comments, shares, saves, engagement rate, creator and follower count, caption, hashtags, music and posting date.

## `campaignReport` (type: `string`):

Totals across all videos, overall engagement rate, top videos, a per-creator breakdown, cost per view when a budget is given, and the list of links that failed.

# 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/@haf_barbie/video/7693113599358864647"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("getdataforu/tiktok-video-stats").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/@haf_barbie/video/7693113599358864647"] }

# Run the Actor and wait for it to finish
run = client.actor("getdataforu/tiktok-video-stats").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/@haf_barbie/video/7693113599358864647"
  ]
}' |
apify call getdataforu/tiktok-video-stats --silent --output-dataset

```

## MCP server setup

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

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/F2sHrmMtBuMo8h87J/builds/z2E7P41rCnqdKu0W4/openapi.json
