# TikTok Video Scraper API - Stats, Hashtags, Sound (`vonsensey/tiktok-video-scraper-api`) Actor

Paste TikTok video URLs and get 30+ fields each: exact play, like, comment, share and save counts, hashtags, sound, duration and the creator. No login. Deleted videos cost nothing.

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

## Pricing

from $2.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.
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?

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 API - Stats, Hashtags, Sound

#### The TikTok suite

- [TikTok Scraper API](https://apify.com/vonsensey/tiktok-scraper-api) — videos and creator profiles in one dataset
- [TikTok Creator Profile Scraper API](https://apify.com/vonsensey/tiktok-creator-profile-scraper-api) — handles in, exact follower counts and bio links out
- [TikTok Follower Count Tracker API](https://apify.com/vonsensey/tiktok-follower-count-tracker-api) — put creators on a schedule and bill only what moved

Paste TikTok video URLs and get 30+ fields for each one. No login, no cookies, no proxy to configure. **Failures are free** — a deleted video, a
private account or a handle that does not exist costs nothing and returns a row saying which.

**Exact numbers, not rounded ones.** TikTok's page says 1.5M followers; this returns 1,466,634.

### Quick start

1. Press **Start** — the defaults are a working run.
2. Replace them with your own video URLs (share links, tracking parameters and bare IDs all work).
3. Take the dataset as JSON, CSV or Excel, or via the API.

### What people use it for

- **Creator vetting before a paid collaboration.** Exact follower and like counts, account age,
  verification and the bio link for a shortlist of handles — the numbers a rate card is argued
  over, not the rounded ones on the page.
- **Campaign reporting.** Feed in the video URLs from a campaign and get plays, likes, comments,
  shares and saves per clip, re-run on a schedule to watch them move.
- **Competitor and sound tracking.** Which sound a clip used, whether it was original, the
  hashtags, and TikTok's own content labels for the clip.
- **Follower-growth monitoring.** Put a list of creators on a daily cron and pay only for the
  ones whose counts changed.
- **Feeding an AI agent or workflow.** One flat schema for both videos and creators, so an
  agent does not need two endpoints and two output shapes.

### What a video row looks like

```json
{
  "type": "video",
  "id": "7106594312292453675",
  "url": "https://www.tiktok.com/@tiktok/video/7106594312292453675",
  "description": "how many frogs did you find? 🐸 check out tiktok's #Minecraft community today! @Gorillo",
  "createdAt": "2026-06-07T20:15:29.000Z",
  "duration": 24,
  "contentLabels": ["Video Games", "Games", "Entertainment"],
  "hashtags": ["minecraft"],
  "language": "en",
  "locationCreated": "US",
  "playCount": 578000,
  "diggCount": 98800,
  "commentCount": 1343,
  "shareCount": 358,
  "collectCount": 58486,
  "music": { "title": "original sound", "authorName": "TikTok", "original": true },
  "author": {
    "uniqueId": "tiktok",
    "nickname": "TikTok",
    "verified": true,
    "followerCount": 95534839,
    "videoCount": 1495
  }
}
```

`contentLabels` is TikTok's own classification of the clip, not ours — it is what the platform
files the video under, which is why it is worth having.

### What it costs

| You pay for | Price |
|---|---|
| Each video delivered | **$2.00 per 1,000 videos** |
| Each creator profile delivered | **$2.00 per 1,000 profiles** |
| Add-on: full creator profile resolved for a video's author | **$8.00 per 1,000 creators** |

**Free, always:** a deleted, private or region-locked video, a handle that does not exist, a
malformed URL, every error row, the coverage row and the run summary — and on a monitoring
schedule, every row whose numbers did not move. A run that reads nothing costs nothing.

The add-on is charged **once per creator per run**, never per video, and only after that
creator's profile has actually been read. It never consumes your row budget, so asking for
creator detail can't cost you videos.

Set **Cost ceiling (USD)** to stop any run before it passes a number you choose; the free
summary row reports what the run actually spent.

### FAQ

#### Do I need a TikTok login, cookies or a proxy?

No. Everything is handled for you and there is nothing to buy on top. Measured 2026-09-01: this
Actor reads TikTok from an ordinary IP and used no proxy traffic at all on a 30-creator run.

#### Are the follower and view counts the real numbers?

Yes, and this is the difference worth knowing about. TikTok's page shows a rounded number —
1.5M followers, 7.2M likes. The exact values sit in a different object on the same page:
**1,466,634** followers and **7,208,537** likes for that same account. This Actor reads the exact
ones. A scraper that reads the rounded numbers cannot tell you a creator gained 238 followers.

#### What happens to a deleted or private video?

It costs nothing. You get a free error row that says which of the two it was, and the run keeps
going — a list of fifty URLs where three were deleted still delivers forty-seven.

#### Does a run fail if everything I asked for is gone?

No. "All of these were deleted" is a correct answer, not a failure, so the run succeeds and
returns free error rows explaining each one. Only TikTok actually refusing us fails a run.

#### Can I put this on a schedule without paying twice for the same data?

Yes. Turn **Monitor: only bill what changed** on and a re-run bills only the videos and
creators whose numbers actually moved. Unchanged rows are still delivered, marked
`unchanged`, and are free.

#### Can I get a creator's whole back catalogue of videos?

Not from this Actor, and it says so rather than pretending. TikTok's post-list, search and
comment endpoints are signature-gated and return nothing without a signed token, so this fleet
sells only what it can deliver reliably: videos you name by URL, and creator profiles by handle.

#### How do I get the creator's email or contact link?

Turn on **Add full creator profiles**. Each distinct creator in the run is resolved in full,
including the link in their bio — which is where TikTok creators put their Linktree, agency or
business address.

#### Will I be charged twice if the same video appears twice in my list?

No. A video reached through a share link and through its canonical URL is one row and one
charge.

### Limits, stated plainly

TikTok's post-list, search and comment endpoints require a signed token this Actor does not
mint, so it does not sell them. What it does sell — videos by URL and creators by handle — it
reads directly from TikTok's own page data, which is why it needs no proxy and why the failure
modes are honest ones.

### Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is `vonsensey/tiktok-video-scraper-api`; every snippet below sends `{}`, which runs the defaults shown on the form — replace it with your own input.

#### n8n

Install the **Apify** community node (`@apify/n8n-nodes-apify` under *Settings → Community Nodes*, or search "Apify" on n8n Cloud). Add **Apify → Run Actor** with Actor `vonsensey/tiktok-video-scraper-api` and your input JSON, then **Apify → Get Dataset Items** on the run's `defaultDatasetId` and pipe the rows anywhere. For scheduled runs, the **On new Apify Event** trigger fires when a run of this Actor finishes.

#### MCP (Claude, Cursor, VS Code, any MCP client)

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=vonsensey/tiktok-video-scraper-api",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

Your agent then calls `vonsensey/tiktok-video-scraper-api` as a tool with the same input the form takes and reads the dataset back.

#### REST API (one call, rows in the response)

```bash
curl -X POST "https://api.apify.com/v2/acts/vonsensey~tiktok-video-scraper-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{}'
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/tiktok-video-scraper-api").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

#### JavaScript

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/tiktok-video-scraper-api').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Make, Zapier, LangChain, CrewAI

The Apify app in **Make** and **Zapier** has a *Run an Actor* module: pick `vonsensey/tiktok-video-scraper-api`. In **LangChain** and **CrewAI** the Apify tool wrappers take the same Actor id. A daily **schedule** needs nothing but the Console: *Schedules → Create → this Actor → cron*, and the dataset fills on its own.

# Actor input Schema

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

Video links, share links or bare video IDs. Paste them however you have them — the /@user/video/... form, a link with tracking parameters, or just the numeric ID. Deleted, private and region-locked videos return a free error row saying which, and never a charge. Leave empty and give creator handles instead to run profiles only.

## `profiles` (type: `array`):

Creator handles or profile URLs — 'nasa', '@nasa' and 'https://www.tiktok.com/@nasa' all work. Each one returns a profile row with exact follower, like and video counts, the bio and the link in the bio.

## `maxItems` (type: `integer`):

Hard cap on billable rows for this run. Videos and creator profiles share this budget, so 100 means 100 rows in total, never 100 of each.

## `maxCostUsd` (type: `integer`):

Stop the run before it spends more than this. Leave empty for no ceiling. The free summary row always reports what the run actually spent.

## `includeCreatorProfiles` (type: `boolean`):

Every video already includes its creator's handle, verification and follower count at no extra cost. Turn this on to also resolve each distinct creator in full — bio, link in bio, region, account age and lifetime totals. Charged once per creator per run, never per video, and only after the profile has actually been read.

## `includeMediaUrls` (type: `boolean`):

Adds the direct play and download URLs to each video row. They are signed by TikTok and expire quickly, so they are left out by default rather than filling a stored dataset with links that stop working.

## `monitorChangesOnly` (type: `boolean`):

For scheduled runs. The Actor remembers the counts it saw last time and bills only the videos and profiles whose numbers actually moved. Unchanged rows are still delivered, marked 'unchanged', and are free.

## `useProxy` (type: `boolean`):

Not normally needed — everything is handled for you and the Actor escalates automatically if TikTok refuses a request. Turn it on only if you have been asked to.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "maxItems": 100,
  "includeCreatorProfiles": false,
  "includeMediaUrls": false,
  "monitorChangesOnly": false,
  "useProxy": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "videoUrls": [
        "https://www.tiktok.com/@tiktok/video/7106594312292453675"
    ]
};

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

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

```

## MCP server setup

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

```

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/M91b2axUCdztGKoO0/builds/wVCrsFYbsdu9g9RyI/openapi.json
