# Clip View Tracker & Fake View Check - TikTok, Reels, Shorts, X (`benthepythondev/clip-campaign-tracker`) Actor

Track the clips of a clipping campaign (Whop Content Rewards and others) without login: views, likes, comments and shares of TikTok, Instagram Reels, YouTube Shorts and X clips, growth between scheduled runs, fake-view flags with a risk score, and the payout each clip earned at your CPM and cap.

- **URL**: https://apify.com/benthepythondev/clip-campaign-tracker.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Social media, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 clip snapshots

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

## 🎬 Clip View Tracker & Fake View Check (TikTok, Reels, Shorts, X)

Paste the clip links of a clipping campaign and get one row per clip: views, likes, comments and shares from TikTok, Instagram Reels, YouTube Shorts and X, how much each clip grew since the last run, fraud flags with a 0-100 risk score, and the payout the clip has earned at your CPM, minimum and cap. No login, no cookies, no API keys. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**What a run costs:** $0.004 per clip snapshot on the Free plan, $0.0038 on Bronze, $0.0036 on Silver and $0.0034 from Gold up, plus $0.00005 per run start. 100 clips checked four times a day for a month cost about $48 on Free. Clips that are deleted, private or could not be read, and links that are no clip link, are not charged.

### 🔎 What is the Clip View Tracker?

Clipping campaigns (Whop Content Rewards, Vyro and others) pay clippers per 1,000 views, typically $0.05 to $3.00 with $1.00 at the median, and only for "legitimate" views. Brands have to decide which clips to pay; clippers want to know what a clip will earn. Both have to open every clip on four platforms by hand.

This Actor reads every clip the way a logged-out visitor does, keeps its snapshots under a campaign name, and checks each clip for the patterns bought views leave:

| Flag | What it means | Weight |
|---|---|---|
| `LOW_LIKES_PER_VIEW` | Fewer likes per view than real audiences give (TikTok under 0.5%, Reels 0.4%, Shorts 0.3%, X 0.1%), on clips with 5,000+ views | 40 |
| `VIEW_SPIKE_WITHOUT_LIKES` | Since the previous run the clip gained 5,000+ views but almost no likes | 40 |
| `VIEWS_WENT_DOWN` | The view count fell since the previous run; platforms remove views they judge fake | 30 |
| `FAR_ABOVE_ACCOUNT_NORM` | The clip has 10x the median views of the creator's recent clips | 25 |

The weights add up to `riskScore` (capped at 100): `low` below 25, `medium` from 25, `high` from 50. A flag is a reason to look, not a verdict: a real viral clip can sit far above its account's norm.

#### What data does it extract?

- **Clip:** `platform`, `clipId`, `url`, `author`, `postedAt`, `caption`
- **Counts:** `views`, `likes`, `comments`, `shares` (TikTok shares; X reposts plus quotes), `authorFollowers`
- **Rates:** `likesPerView`, `engagementRate`
- **Growth since the previous run:** `viewsGained`, `likesGained`, `viewsPerHour`, `previousSnapshotAt`, `snapshotCount`, `firstSnapshotAt`
- **Account norm:** `accountMedianViews`, `accountSampleSize`
- **Fraud check:** `flags[]` (`code`, `detail`), `riskScore`, `riskLevel`
- **Payout:** `payableViews`, `estimatedPayoutUsd`, `payoutCapped`, `cpmUsd`
- **Campaign summary:** key-value record `CAMPAIGN_SUMMARY` with total views, total estimated payout, the clips to review, and the links that were not found or not read

### ⬇️ Input

| Field | Type | Description |
|---|---|---|
| `clipUrls` | array | TikTok video links (also `vm.tiktok.com` short links), Instagram Reel or post links, YouTube Shorts or video links, X post links |
| `campaignName` | string | Keeps every clip's snapshots in a named key-value store `clip-tracker-<name>` in your account. Needed for growth and spike flags. Empty = one-off check |
| `cpmUsd` | number | Payout per 1,000 views (default 1.00) |
| `maxPayoutPerClipUsd` | number | Cap per clip; empty = no cap |
| `minViewsForPayout` | integer | Clips below this many views earn 0 |
| `countViewsFrom` | string | `total` (all views) or `firstSnapshot` (only views gained since the campaign first saw the clip) |
| `compareWithAccount` | boolean | Read the creator's recent clips for the norm check (default true; not for X) |

`urls`, `startUrls`, `postUrls` and `videoUrls` are accepted too.

#### Example input

```json
{
  "clipUrls": [
    "https://www.tiktok.com/@nasa/video/7668779420412284191",
    "https://www.instagram.com/reel/De4hpasgLLE/",
    "https://www.youtube.com/shorts/iWg8HIqC47I",
    "https://x.com/NASA/status/2109320622882873464"
  ],
  "campaignName": "brand-x-october",
  "cpmUsd": 1.5,
  "maxPayoutPerClipUsd": 500,
  "minViewsForPayout": 10000
}
```

#### How to track a campaign

1. Save the input above as a Task with your campaign name.
2. Add a schedule to the Task (every 6 hours is plenty).
3. Each run adds a snapshot per clip. From the second run on, rows show `viewsGained`, `viewsPerHour` and the spike and drop flags.
4. Add new clip links to the Task as clippers submit them. Removed links simply stop being checked; their history stays in the store.

### ⬆️ Output

One row per clip (from a real run on 2026-10-24, second snapshot, caption left out):

```json
{
  "clipKey": "instagram-De4hpasgLLE",
  "platform": "instagram",
  "clipId": "De4hpasgLLE",
  "author": "natgeo",
  "postedAt": "2026-10-24T16:08:50Z",
  "views": 617827,
  "likes": 22306,
  "comments": 80,
  "shares": null,
  "accountMedianViews": 1334301,
  "accountSampleSize": 23,
  "url": "https://www.instagram.com/reel/De4hpasgLLE/",
  "likesPerView": 0.0361,
  "engagementRate": 0.0362,
  "viewsGained": 862,
  "likesGained": 20,
  "viewsPerHour": 51720,
  "previousSnapshotAt": "2026-10-24T21:13:45Z",
  "flags": [],
  "riskScore": 0,
  "riskLevel": "low",
  "snapshotCount": 2,
  "firstSnapshotAt": "2026-10-24T21:13:45Z",
  "payableViews": 617827,
  "estimatedPayoutUsd": 500.0,
  "payoutCapped": true,
  "cpmUsd": 1.0,
  "campaign": "demo-campaign",
  "snapshotAt": "2026-10-24T21:14:34Z"
}
```

A flagged clip carries its reasons:

```json
"flags": [
  { "code": "LOW_LIKES_PER_VIEW", "detail": "300 likes on 200,000 views (0.15%); real tiktok audiences rarely go below 0.5%" },
  { "code": "VIEW_SPIKE_WITHOUT_LIKES", "detail": "+180,000 views but +50 likes since 2026-10-24T08:00:00Z" }
],
"riskScore": 80,
"riskLevel": "high"
```

### 🤖 For AI agents

```json
{ "clipUrls": ["https://www.tiktok.com/@nasa/video/7668779420412284191"], "cpmUsd": 1 }
```

No credentials. Every input is optional except the links; one row per clip comes back with `riskLevel` and `estimatedPayoutUsd`.

### 💡 Use cases

- 🛡️ **Brands running clipping campaigns:** screen every submitted clip before paying out, and see the whole campaign's views and cost in one record.
- 💸 **Clippers:** forecast what each clip will earn at the campaign's CPM and cap, and catch a drop in views before the brand does.
- 📈 **Agencies and clip managers:** one table across TikTok, Reels, Shorts and X instead of four apps, refreshed on a schedule.
- 🔔 **Alerts:** connect the dataset to Make, Zapier or n8n and send a message for every `high` risk clip.

### ⚠️ Limits

- **Instagram plays** come from the creator's reels tab, which lists the newest reels. A reel older than about 48 reels back gets `views: null` (likes and comments are still read). Photo posts have no views.
- **YouTube** likes are exact; comment counts are rounded by YouTube ("1.2K"). The account norm uses the rounded view counts of the channel's Shorts tab.
- **X** has no account norm: a visitor cannot list an account's posts with view counts.
- The ratios are measured on large public accounts; small niche accounts can sit lower without fraud. Treat flags as a review list.
- Platform numbers update with a delay of minutes to hours, so `viewsGained` between two close runs can be 0.

### ❓ FAQ

**Do I need accounts or API keys?** No. Every platform is read as a logged-out visitor.

**How is the payout calculated?** `payableViews / 1000 * cpmUsd`, 0 below `minViewsForPayout`, and at most `maxPayoutPerClipUsd`. With `countViewsFrom: firstSnapshot` only the views gained since the first run that saw the clip count.

**Does it prove a clip is botted?** No tool can from public numbers alone. It shows the patterns that bought views leave and says why, so you know which clips to look at or ask about.

**Where is the history kept?** In a named key-value store `clip-tracker-<campaign name>` in your own Apify account, one record per clip with up to 500 snapshots. Delete the store to start over.

**What happens to a deleted clip?** It is listed under `notFoundOrPrivate` in `CAMPAIGN_SUMMARY` and not charged. Its history stays.

**Can I check hundreds of clips?** Yes. Clips are read side by side (four TikTok, two Instagram, four YouTube and three X at a time); a run stops cleanly before its timeout or spending limit and lists what was not started.

**Is Whop supported directly?** Paste the clip links your campaign received. Reading Whop's submission list needs your Whop login and is not done here.

**Is it legal?** It reads public counts that any visitor sees, without logging in. You are responsible for how you use the data; respect the platforms' terms and privacy law (GDPR, CCPA) and do not use it to harass creators.

### 🔗 You might also like

- [TikTok Scraper](https://apify.com/benthepythondev/tiktok-scraper) for whole profiles and their videos
- [Instagram Reels Scraper](https://apify.com/benthepythondev/instagram-reels-scraper) for an account's reels with plays
- [YouTube Shorts Scraper](https://apify.com/benthepythondev/youtube-shorts-scraper) for a channel's Shorts
- [X Post Scraper](https://apify.com/benthepythondev/x-post-scraper) for full X posts by link

**Keywords:** clipping campaign tracker, clip view tracker, Whop content rewards, fake views checker, view fraud detection, TikTok views tracker, Instagram Reels views, YouTube Shorts views, X views tracker, CPM payout calculator, clipper payout, UGC campaign analytics, bot views detection, engagement rate checker, cross-platform video analytics

# Actor input Schema

## `clipUrls` (type: `array`):

Links to the clips of your campaign: TikTok videos (also vm.tiktok.com short links), Instagram Reels, YouTube Shorts or videos, and X posts. One row per clip with views, likes, comments, fraud flags and the estimated payout. Duplicates are read once.

## `campaignName` (type: `string`):

Any name, for example 'brand-x-october'. Every clip's snapshots are kept in a named key-value store 'clip-tracker-<name>' in your account, so a scheduled run shows views and likes gained since the previous run and flags view spikes without likes or views that went down. Leave empty for a one-off check without history.

## `cpmUsd` (type: `number`):

The campaign's CPM. Whop Content Rewards campaigns paid $0.05 to $3.00 per 1,000 views in September 2026, $1.00 at the median.

## `maxPayoutPerClipUsd` (type: `number`):

The most one clip can earn. Leave empty when the campaign has no cap.

## `minViewsForPayout` (type: `integer`):

Clips below this view count earn nothing (many campaigns set a minimum).

## `countViewsFrom` (type: `string`):

'total' pays all views a clip has. 'firstSnapshot' pays only the views gained since this campaign first saw the clip (needs a campaign name; the first run then shows 0 payable views).

## `compareWithAccount` (type: `boolean`):

Reads the creator's recent clips (TikTok 15, Instagram up to 24 reels, YouTube Shorts tab) and flags a clip with ten times the account's median views. One extra request per clip; not available for X.

## Actor input object example

```json
{
  "clipUrls": [
    "https://www.tiktok.com/@nasa/video/7668779420412284191",
    "https://www.instagram.com/reel/De4hpasgLLE/",
    "https://www.youtube.com/shorts/iWg8HIqC47I",
    "https://x.com/NASA/status/2109320622882873464"
  ],
  "campaignName": "demo-campaign",
  "cpmUsd": 1,
  "minViewsForPayout": 0,
  "countViewsFrom": "total",
  "compareWithAccount": true
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "clipUrls": [
        "https://www.tiktok.com/@nasa/video/7668779420412284191",
        "https://www.instagram.com/reel/De4hpasgLLE/",
        "https://www.youtube.com/shorts/iWg8HIqC47I",
        "https://x.com/NASA/status/2109320622882873464"
    ],
    "campaignName": "demo-campaign"
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/clip-campaign-tracker").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 = {
    "clipUrls": [
        "https://www.tiktok.com/@nasa/video/7668779420412284191",
        "https://www.instagram.com/reel/De4hpasgLLE/",
        "https://www.youtube.com/shorts/iWg8HIqC47I",
        "https://x.com/NASA/status/2109320622882873464",
    ],
    "campaignName": "demo-campaign",
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/clip-campaign-tracker").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 '{
  "clipUrls": [
    "https://www.tiktok.com/@nasa/video/7668779420412284191",
    "https://www.instagram.com/reel/De4hpasgLLE/",
    "https://www.youtube.com/shorts/iWg8HIqC47I",
    "https://x.com/NASA/status/2109320622882873464"
  ],
  "campaignName": "demo-campaign"
}' |
apify call benthepythondev/clip-campaign-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/clip-campaign-tracker"
        }
    }
}
```

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/lohd8Ko7tDc2BvG78/builds/2dsatmrnkXRo9nqzD/openapi.json
