# TikTok Scraper API – Stats, Transcripts & Profiles, No Login (`k-data-lab/tiktok-scraper`) Actor

Get TikTok video stats, view count, engagement rate, transcripts (captions) and exact follower count from links or usernames, no login. Likes, comments, shares, saves, creator average views. $0.25 per 1,000 videos, 300 free monthly. Up to 10 videos per profile. No keyword search.

- **URL**: https://apify.com/k-data-lab/tiktok-scraper.md
- **Developed by:** [K-Data Lab](https://apify.com/k-data-lab) (community)
- **Categories:** Social media, Videos, AI
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 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?

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 Scraper API: Engagement Rate, Transcripts & View Counts, No Login

**Get TikTok view counts, engagement rate, transcripts and exact follower counts from links or usernames, with no login, no cookies and no API key.** Paste video links or usernames. You get one tidy row per video with views, likes, comments, shares, saves and engagement rate, and one row per creator with exact followers, average views and average engagement rate.

**Try it for half a cent.** Click Start and the prefilled run finishes in about 12 seconds. Its rows are free, and the $0.005 start fee comes out of the $5 credit Apify's free plan gives you every month.

**$0.25 per 1,000 videos on the Bronze plan, about 90% below the $3 of the most-used TikTok scraper.** Every month your first **300 videos, 100 profiles and 100 transcripts are free**. Each run has the $0.005 start fee, so put many links in one run.

Built for tracking known videos and creators. It doesn't do keyword search, and it returns **at most 10 videos per profile**. If you need a creator's full history, this isn't the right tool, see [what it doesn't do](#-what-it-doesnt-do).

Real rows from a run on 7 November 2026:

| Video | Creator | Views | Likes | Comments | Shares | Saves | Engagement | Published |
|---|---|---:|---:|---:|---:|---:|---:|---|
| [A LOT of Artemis II data just dropped!…](https://www.tiktok.com/@nasa/video/7694283957839400206) | @nasa | 807,100 | 101,300 | 730 | 3,206 | 7,800 | 13.04% | 2026-10-08 |
| [Going back to the Moon means figuring out ho…](https://www.tiktok.com/@nasa/video/7698805564884733198) | @nasa | 302,200 | 11,800 | 335 | 390 | 988 | 4.14% | 2026-10-20 |
| [Elephants can recognize the remains of eleph…](https://www.tiktok.com/@natgeo/video/7702895834819480845) | @natgeo | 587,500 | 108,500 | 745 | 6,223 | 6,189 | 19.65% | 2026-10-31 |
| [Bro really juan that challenge](https://www.tiktok.com/@mrbeast/video/7703595535009156383) | @mrbeast | 30,000,000 | 3,800,000 | 70,000 | 245,800 | 227,647 | 13.72% | 2026-11-02 |

Creator rows from the same run. Followers and total likes are exact to the last digit, and the averages cover the 10 videos read:

| Creator | Followers | Total likes | Videos | Avg views | Median views | Avg engagement | Verified |
|---|---:|---:|---:|---:|---:|---:|---|
| @nasa | 2,162,100 | 11,550,049 | 62 | 518,920 | 323,450 | 7.68% | Yes |
| @natgeo | 9,700,056 | 55,965,891 | 1,575 | 92,863 | 17,850 | 7.84% | Yes |
| @espn | 61,811,791 | 6,728,275,917 | 14,283 | 22,004 | 20,500 | 5.51% | Yes |
| @mrbeast | 145,805,420 | 1,566,004,386 | 488 | 19,760,000 | 20,350,000 | 12.65% | Yes |

#### 🚀 Pick your starting point

| You want | Paste this input |
|---|---|
| Stats for a list of videos | `{ "videoUrls": ["https://www.tiktok.com/@scout2015/video/6718335390845095173"] }` |
| Compare creators by engagement rate | `{ "profiles": ["nasa", "@natgeo", "espn"] }` |
| Exact followers for many creators | `{ "profiles": ["nasa", "@natgeo", "espn"], "maxVideosPerSource": 0 }` |
| A creator's recent videos | `{ "profiles": ["nasa"] }` |
| What creators say in their videos | `{ "profiles": ["nasa"], "includeTranscript": true }` |
| Only new videos, on a schedule | `{ "profiles": ["competitor"], "monitorName": "competitors" }` |
| Recent hits only | `{ "profiles": ["nba"], "publishedAfter": "2026-11-01", "minViews": 100000 }` |
| Top videos for a sound | `{ "sounds": ["6689804660171082501"] }` |
| Top videos for a hashtag (beta) | `{ "hashtags": ["cooking"] }` |

#### 🔍 What does it do?

- **Video stats by link or ID.** Views, likes, comments, shares, saves, reposts, caption, hashtags, mentions, language, publish time, length, music, country, ad and AI-generated flags, plus the author's followers. Photo posts work too, with their image links.
- **Engagement rate, worked out for you.** Every video row has `engagementRate`: (likes + comments + shares) / views, in percent. Every creator row has `avgViews`, `medianViews`, `avgLikes` and `avgEngagementRate` over the videos we read, up to 10, so you can vet an influencer in one row at no extra cost.
- **Transcripts from TikTok's own captions.** About half of the videos in our tests had captions (97 of 187). The text comes back in the same row, in any language TikTok has it. No speech-to-text, so a video without captions stays empty and isn't charged.
- **Exact profile numbers.** Followers and total likes to the last digit, video count, bio, link in bio, business category and account age.
- **Sounds and hashtags (beta).** Total videos and views, plus up to 10 top videos.
- **Monitoring.** Give a monitor name and a schedule: each run returns only videos it hasn't returned before, and repeats cost nothing.

#### 💡 Why choose this actor?

Prices are public Store prices on the Bronze plan, checked on 6 November 2026.

| | **This actor** | clockworks/tiktok-scraper | apidojo/tiktok-scraper |
|---|---|---|---|
| Price per 1,000 videos | **$0.25** | $3.00 | $0.30 |
| Filters | **Free** | $1 per 1,000 rows, per filter | Included |
| Free every month | **300 videos, 100 profiles, 100 transcripts** | Apify's free credit only | Free plan: 5 runs of 10 items |
| One video at a time | **Works** | Works | At least 10 posts per query |
| Start fee per run | $0.005 | $0.001 | None |
| Engagement rate and creator averages | **In every row** | Work it out yourself | Work it out yourself |
| Captions | **Plain text in the row, $1 per 1,000** | Subtitle files; AI transcription $0.041 per minute | Subtitle file links |
| Videos per profile | 10 | Not limited to 10 | Not limited to 10 |
| Keyword search, comments, video downloads | No | Yes | Search yes |

Pick this actor to look up known videos and creators cheaply and often. Pick one of the others for keyword search, comments or a creator's full history.

#### 💰 Pricing

You pay per result, so there is no subscription. Rows for missing, private or filtered videos aren't charged.

| Event | Free plan | Bronze | Silver | Gold and up |
|---|---:|---:|---:|---:|
| Video or photo post | $0.0003 | $0.00025 | $0.00022 | $0.0002 |
| Profile, hashtag or sound row | $0.0005 | $0.0004 | $0.00035 | $0.0003 |
| Transcript (only if you turn it on and the video has one) | $0.0012 | $0.001 | $0.0009 | $0.0008 |
| Run start | $0.005 | $0.005 | $0.005 | $0.005 |

The first 300 videos, 100 profile, hashtag or sound rows and 100 transcripts each month are free. **Example:** 1,000 video links in one run on Bronze cost $0.25 + $0.005 start, or less while the free quota lasts.

Set a maximum spend for a run in the run options. The run stops cleanly at that limit and keeps its results.

#### 📥 Input

| Field | What it does | Example |
|---|---|---|
| `videoUrls` | Video or photo links, short links, or numeric IDs | `https://www.tiktok.com/@nasa/video/7698805564884733198` |
| `profiles` | Usernames or profile links. Adds average views and engagement rate | `nasa`, `@natgeo` |
| `hashtags` | Hashtags, with or without # (beta) | `cooking` |
| `sounds` | Sound links or IDs (`musicId` in any video row) | `6689804660171082501` |
| `maxVideosPerSource` | 1 to 10 videos per profile, hashtag or sound. 0 = summary rows only, with no averages | `10` |
| `includeSummaryRows` | One totals row per profile, hashtag and sound | `true` |
| `includeTranscript` | Add caption text | `false` |
| `transcriptLanguage` | Preferred language code start | `eng` |
| `publishedAfter` | Drop older videos, free | `2026-11-01` |
| `minViews`, `minLikes` | Drop smaller videos, free | `10000` |
| `monitorName` | Skip videos returned before under this name | `competitors` |

#### 📤 Output

One row per video, profile, hashtag or sound. The `type` field says which. A video row, shortened:

```json
{
  "type": "video",
  "id": "7698805564884733198",
  "url": "https://www.tiktok.com/@nasa/video/7698805564884733198",
  "description": "Going back to the Moon means figuring out how to get around. 🌕 Here’s a look at the vehicles that will help us explore the lunar South Pole and build our Moon Base!",
  "hashtags": [],
  "language": "en",
  "createdAt": "2026-10-20T17:38:09Z",
  "durationSeconds": 45,
  "views": 302200,
  "likes": 11800,
  "comments": 335,
  "shares": 390,
  "saves": 988,
  "reposts": 0,
  "engagementRate": 4.14,
  "authorUsername": "nasa",
  "authorName": "NASA",
  "authorVerified": true,
  "authorFollowers": 2200000,
  "musicId": "7663350013599107099",
  "musicTitle": "Strings",
  "isAd": false,
  "isAiGenerated": false,
  "countryCreated": "US",
  "hasCaptions": true,
  "sourceType": "profile",
  "sourceValue": "nasa",
  "scrapedAt": "2026-11-07T02:58:12Z"
}
```

A profile row, shortened:

```json
{
  "type": "profile",
  "username": "nasa",
  "followers": 2162100,
  "totalLikes": 11550049,
  "videoCount": 62,
  "sampleVideos": 10,
  "avgViews": 518920,
  "medianViews": 323450,
  "avgLikes": 38854,
  "avgEngagementRate": 7.68
}
```

`RUN_SUMMARY` in the run's key-value store shows what happened per input: `OK`, `NOT_FOUND`, `VIDEOS_NOT_SHOWN`, `NO_VIDEOS` or `UNAVAILABLE`.

#### 🚫 What it doesn't do

- **More than 10 videos per profile, hashtag or sound.** That's what TikTok's public embed pages show. TikTok's list API refuses plain clients, and we don't get around that with signed requests or disguised browsers.
- **Keyword search, comments, followers lists, video downloads.** Not available this way.
- **Private accounts, or anything that needs a login.**
- **Every hashtag, every time.** Hashtags are beta: in our tests TikTok answered for roughly 3 in 10 to 2 in 3 of hashtags per run, and which ones changes. The rest report `UNAVAILABLE` and aren't charged. Try again later, or use profiles and sounds.
- **Exact video counts.** TikTok rounds views and likes on public pages (1,700,000). Saves and small numbers are exact, and so are profile followers and total likes.

#### ❓ FAQ

**Do I need a TikTok account, cookies or an API key?**
No. Only an Apify account.

**How do I get a TikTok creator's engagement rate?**
Put the username in `profiles` and read `avgEngagementRate`. It's the average of (likes + comments + shares) / views across the videos we read, up to 10, and `sampleVideos` says how many that was. Averages use every video read, even ones your filters drop. TikTok rounds large counts, so treat the rate as close, not exact.

**Why are the averages empty?**
The creator row needs videos to average. They stay empty with `maxVideosPerSource: 0`, or when the creator turned embeds off.

**How much does a run cost?**
Half a cent to start, plus the rows above the free quota. The prefilled run returns 5 rows, inside the free quota, and Apify's free plan gives you $5 of credit every month for the start fee.

**Which videos does a profile return?**
The ones on the creator's public embed page: up to 10, mostly recent but not strictly newest first. Some creators turn embeds off. You still get the profile row, and `RUN_SUMMARY` says `VIDEOS_NOT_SHOWN`.

**Why are some cover links dead after a while?**
TikTok's image links expire. Save the image if you need it later.

**Why is `isAd` true on some normal videos?**
It's TikTok's own flag, passed on as is.

**How do I track numbers over time?**
Schedule the same video links or profiles daily and store each dataset, or send them to a sheet with an Apify integration.

**Is this legal?**
It reads public data that any logged-out visitor sees, and it is not affiliated with TikTok. Creators' content stays theirs, and TikTok's terms and robots rules, including its limits on AI crawlers, may apply to how you use the data. Check them for your use, and don't use profile data to contact or profile individuals without a lawful basis.

#### 🤖 Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/k-data-lab~tiktok-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrls":["https://www.tiktok.com/@nasa/video/7698805564884733198"]}'
```

Works the same from Python, n8n, Make and Zapier through their Apify integrations.

#### 🧠 Use it from AI agents (MCP)

Add it as a tool in Claude, ChatGPT, Cursor or any MCP client: `https://mcp.apify.com?tools=actors,k-data-lab/tiktok-scraper`. It returns plain JSON and needs no TikTok login, so an agent can call it straight away.

| The agent is asked to | Input to send |
|---|---|
| Get views and likes of a TikTok | `{ "videoUrls": ["<video link>"] }` |
| Read what is said in a TikTok | `{ "videoUrls": ["<video link>"], "includeTranscript": true }` |
| Get a creator's follower count | `{ "profiles": ["<username>"], "maxVideosPerSource": 0 }` |
| Get a creator's engagement rate or average views | `{ "profiles": ["<username>"] }` |
| Get a TikTok's captions or subtitles as text | `{ "videoUrls": ["<video link>"], "includeTranscript": true }` |
| List a creator's recent videos | `{ "profiles": ["<username>"] }` |

Every field is optional, but you need at least one video, profile, hashtag or sound. Read `views`, `likes`, `comments`, `shares`, `saves`, `engagementRate` and `transcript` on video rows, `followers`, `totalLikes`, `avgViews` and `avgEngagementRate` on profile rows. Lists stop at 10 videos, and keyword search isn't available.

#### 🧰 More from K-Data Lab

**Social and apps**

- [YouTube Scraper API](https://apify.com/k-data-lab/youtube-scraper): video stats, channels and search, no login
- [Telegram Scraper API](https://apify.com/k-data-lab/telegram-channel-scraper): channels and keyword search, no login
- [Google Play Scraper API](https://apify.com/k-data-lab/google-play-scraper): app details and reviews, any country
- [Google Maps Scraper](https://apify.com/k-data-lab/google-maps-scraper): places, ratings and contact details
- [Google Ads Transparency & Ad Library Scraper](https://apify.com/k-data-lab/google-ad-library-scraper): every Google ad a competitor runs

**Amazon**

- [Amazon Seller Central Review Scraper](https://apify.com/k-data-lab/amazon-seller-central-review-scraper): brand reviews and monitoring
- [Amazon ASIN Rating & Review Count Lookup](https://apify.com/k-data-lab/amazon-asin-rating-scraper): ratings, review counts and BSR, no login

**Travel**

- [Agoda Scraper API](https://apify.com/k-data-lab/agoda-scraper): hotel prices, rooms and reviews
- [Airline Award Seat Scraper](https://apify.com/k-data-lab/airline-award-seat-scraper): live miles, taxes and seats left
- [Uber Eats & Deliveroo Scraper](https://apify.com/k-data-lab/uber-eats-deliveroo-scraper): restaurants and menus

**Korean data**

- [Korean Music Chart API](https://apify.com/k-data-lab/korean-music-chart-scraper): Melon, Genie, Bugs, FLO and VIBE in one chart
- Single charts: [Melon](https://apify.com/k-data-lab/melon-scraper), [Genie](https://apify.com/k-data-lab/genie-scraper), [Bugs](https://apify.com/k-data-lab/bugs-scraper), [FLO](https://apify.com/k-data-lab/flo-scraper), [VIBE](https://apify.com/k-data-lab/vibe-scraper)
- Korea apartment prices: [KB Land](https://apify.com/k-data-lab/kbland-scraper), [R114](https://apify.com/k-data-lab/r114-scraper)

#### 💬 Feedback

Need a field that's missing, or found a video that doesn't work? Open an issue on the **Issues** tab. We answer the same day.

Tags: tiktok scraper, tiktok api, tiktok video stats, tiktok view count, tiktok engagement rate, tiktok transcript, tiktok captions, tiktok subtitles, tiktok profile scraper, tiktok follower count, tiktok influencer analytics, tiktok no login

# Changelog

This Actor's version history is a separate document: https://apify.com/k-data-lab/tiktok-scraper/changelog.md

# Actor input Schema

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

Public TikTok video or photo post links, short vm.tiktok.com links, or numeric video IDs, one per line. Each returns one row with view count, likes, comments, shares, saves, engagement rate, music and author stats. No limit on how many. Example: https://www.tiktok.com/@scout2015/video/6718335390845095173

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

Usernames or profile links, one per line. Each returns one profile row (exact follower count, total likes, video count, bio, plus average views and engagement rate of the videos read) and the videos on the creator's public embed page, up to 10. Examples: tiktok, @nasa, https://www.tiktok.com/@natgeo

## `hashtags` (type: `array`):

Hashtags with or without #, one per line. Each returns one hashtag row (total views, video count) plus top videos, up to 10. TikTok's public hashtag page does not answer for every hashtag at all times: those report UNAVAILABLE in RUN_SUMMARY and are not charged. Example: cooking

## `sounds` (type: `array`):

Sound links or numeric sound IDs (the musicId field of any video row), one per line. Each returns one sound row (videos using it) plus top videos using it, up to 10. Example: https://www.tiktok.com/music/original-sound-6689804660171082501

## `maxVideosPerSource` (type: `integer`):

1 to 10. TikTok's public pages show at most 10 videos here. Higher gives steadier creator averages. Use 0 for summary rows only, the cheapest way to track follower counts of many creators (average views and engagement rate stay empty).

## `includeSummaryRows` (type: `boolean`):

One row with the totals for each profile, hashtag and sound. Turn off to get video rows only.

## `includeTranscript` (type: `boolean`):

Adds the transcript text from TikTok's own captions when the video has them (hasCaptions in the row). Charged only for rows that get a transcript. No speech-to-text: videos without captions stay empty.

## `transcriptLanguage` (type: `string`):

Start of a language code. If the video has no such track, the first available one is used. Example: eng

## `publishedAfter` (type: `string`):

A date like 2026-11-01. Older videos are dropped and not charged. Free filter.

## `minViews` (type: `integer`):

Drops videos with fewer views, not charged. Free filter.

## `minLikes` (type: `integer`):

Drops videos with fewer likes, not charged. Free filter.

## `monitorName` (type: `string`):

Any name. Runs with the same name skip videos returned before, so a scheduled run gives only new ones and repeats cost nothing. Example: competitors-daily

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ],
  "profiles": [
    "tiktok",
    "@nasa"
  ],
  "hashtags": [
    "cooking",
    "booktok"
  ],
  "sounds": [
    "6689804660171082501"
  ],
  "maxVideosPerSource": 3,
  "includeSummaryRows": true,
  "includeTranscript": false,
  "transcriptLanguage": "eng",
  "publishedAfter": "2026-11-01",
  "minViews": 10000,
  "minLikes": 1000,
  "monitorName": "competitors-daily"
}
```

# Actor output Schema

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

No description

## `all` (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 = {
    "videoUrls": [
        "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    ],
    "profiles": [
        "tiktok"
    ],
    "maxVideosPerSource": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("k-data-lab/tiktok-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/@scout2015/video/6718335390845095173"],
    "profiles": ["tiktok"],
    "maxVideosPerSource": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("k-data-lab/tiktok-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/@scout2015/video/6718335390845095173"
  ],
  "profiles": [
    "tiktok"
  ],
  "maxVideosPerSource": 3
}' |
apify call k-data-lab/tiktok-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,k-data-lab/tiktok-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/jeG0feR9ZffUOty8a/builds/VhNJ3FEyHKKNsxbgD/openapi.json
