# TikTok Profile Scraper: All Videos, Stats & MP4 (`s_actors/tiktok-profile-scraper`) Actor

Scrape all videos of TikTok profiles: plays, likes, comments, shares, saves, hashtags, sound, date. Date range, only new videos since the last run, MP4 download without watermark, and a table of profiles: exact followers, contacts (Telegram, Instagram, website, email), average plays.

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

## Pricing

from $0.23 / 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 Profile Scraper: All Videos, Stats & MP4

Scrape **all videos of TikTok profiles** to CSV, Excel or JSON: **plays, likes, comments, shares, saves**, engagement rate, posting date, duration, **hashtags**, mentions, **sound**, and the creator's **exact followers**. Filter by **date range** and **minimum plays**, get **only new videos** since the last run, **download MP4s without watermark**, and get a **profiles table**, one row per account, free: exact followers and likes, **contacts** (email, website, Telegram, Instagram, YouTube, X, Twitch), average and median plays, engagement, posts per week, top video.

```json
{ "profiles": ["@nasa", "https://www.tiktok.com/@khaby.lame"], "maxVideosPerProfile": 0 }
```

No TikTok login, no cookies, no browser extension. Use it as a **TikTok profile API**: one call returns clean JSON. `0` = every public video of the profile, newest first (about 25 videos a second: 1,324 videos of @khaby.lame in under a minute).

#### What you get

One row per video or photo post. Real example, October 2026 (the newest video of each profile):

| profile | positionInProfile | videoPlayCount | videoLikeCount | videoCommentCount | videoShareCount | videoSaveCount | engagementRate | videoCreatedAt |
|---|---|---|---|---|---|---|---|---|
| zachking | 1 | 6,400,000 | 992,600 | 3,658 | 16,600 | 36,369 | 16.39 | 2026-09-29 |
| khaby.lame | 1 | 2,900,000 | 315,100 | 5,531 | 20,900 | 14,534 | 12.28 | 2026-10-01 |
| nasa | 1 | 100,000 | 6,270 | 192 | 134 | 504 | 7.1 | 2026-10-02 |

| Field | Description |
|---|---|
| `videoId`, `videoUrl`, `videoDescription`, `videoCreatedAt` | Video ID, link, caption and exact posting time (UTC) |
| `videoPlayCount`, `videoLikeCount`, `videoCommentCount`, `videoShareCount`, `videoSaveCount` | Plays, likes, comments, shares and saves as TikTok shows them |
| `engagementRate` | (likes + comments + shares + saves) / plays, in % |
| `durationSeconds`, `width`, `height`, `definition`, `coverUrl` | Video length, size, quality (`720p`, `1080p`) and cover image |
| `isPhotoPost`, `photoTitle`, `imageUrls` | Photo posts (slideshows) with links to every image |
| `hashtags`, `mentions` | Hashtags and mentioned @usernames from the caption |
| `musicTitle`, `musicAuthor`, `musicId`, `musicIsOriginal`, `musicDurationSeconds`, `musicUrl`, `musicAudioUrl`, `musicCoverUrl` | The sound: title, artist, original or not, sound page and audio file |
| `language`, `subtitleLanguages`, `placeName`, `placeAddress`, `placeCity`, `placeCategory` | Caption language, available subtitles, tagged place |
| `isAd`, `duetEnabled`, `stitchEnabled` | Ad, duet and stitch settings |
| `videoAuthorUsername`, `videoAuthorName`, `videoAuthorId`, `videoAuthorSecUid`, `videoAuthorVerified`, `videoAuthorAvatarUrl` | The creator (bio and contacts are in the profiles table, not repeated on every video) |
| `videoAuthorFollowerCount`, `videoAuthorFollowingCount`, `videoAuthorLikeCount`, `videoAuthorVideoCount` | **Exact** followers, following, total likes and number of videos (from the profile page, not rounded) |
| `videoFileUrl`, `imageFileUrls` | Permanent download links with **Download videos** |
| `input`, `profile`, `positionInProfile`, `scrapedAt` | Which profile the row came from; 1 = its newest video |

**Profiles table** (run's **Output** tab → *Profiles (CSV)*, also as JSON: key-value store records `profiles.csv` and `PROFILES`), one row per account, free. Real example, October 2026:

| username | followerCount | email | emailSource | website | telegram | instagram | twitch | averagePlays | postsPerWeek |
|---|---|---|---|---|---|---|---|---|---|
| instasamka | 16,732,057 | maxim@namnecash.ru | bio | richwitch.com | t.me/instasamkacore | | | 242,377 | 14.41 |
| egorkreed | 14,390,307 | | | | t.me/egorkreed | instagram.com/egorkreed | twitch.tv/egorkreed | 1,903,330 | 1.06 |
| khaby.lame | 162,985,050 | | | | | | | 23,935,000 | 1.55 |
| nasa | 1,965,491 | | | | | | | 438,220 | 3.5 |

Averages over the 20 latest videos of each profile.

| Column | Description |
|---|---|
| `username`, `nickname`, `bio`, `verified`, `isSeller`, `businessCategory`, `avatarUrl`, `profileUrl`, `userId`, `secUid` | The account; `businessCategory` for business accounts (`Shopping & Retail`) |
| `followerCount`, `followingCount`, `likeCount`, `videoCount` | **Exact** numbers from the profile page (not the rounded 163M) |
| `email`, `emails`, `emailSource`, `website`, `linkInBio`, `bioLink`, `telegram`, `instagram`, `youtube`, `x`, `facebook`, `linkedin`, `whatsapp`, `twitch` | Contacts written in the profile: the bio link, links in the bio and handles like `TG: @name`, `Instagram - @name`, `inst: name`, emails in the bio |
| `videosScraped`, `newestVideoAt`, `oldestVideoAt`, `postsPerWeek`, `averagePlays`, `medianPlays`, `averageLikes`, `averageComments`, `averageEngagementRate`, `topVideoUrl`, `topVideoPlays` | Over the videos of the run (your limit and dates): 20 latest videos = the creator's current reach |
| `error` | Why a profile failed (not found, private) |

TikTok does not show linked Instagram or YouTube accounts to visitors, so contacts come from what the creator wrote in the profile.

TikTok rounds plays, likes, comments and shares from 10,000 on its own website (1.5M = 1,500,000); saves are exact. Every tool that reads TikTok without logging in gets the same numbers.

#### How it works

1. Add **profiles**: `@user`, `user` or `tiktok.com/@user`
2. Set **Max videos per profile** (`0` = all), optional dates and filters
3. Run, then download the dataset as CSV, Excel, JSON or HTML

| Input | What it does |
|---|---|
| **TikTok profiles** | Any number of public profiles |
| **Max videos per profile** | Newest first; default 100, `0` = all |
| **Posted after / Posted before** | A date (`2025-01-01`) or a period (`30 days`, `6 months`, `1 year`). The Actor jumps straight to the date range: a 2023 range of a 5,000-video profile is a few requests, not thousands |
| **Minimum plays** | Only videos with at least this many plays |
| **Skip photo posts** | Videos only |
| **Only new videos since the previous run** | For schedules: only what each profile posted since the last check |
| **Download videos (MP4)** | MP4 without watermark for videos, every image (JPG) for photo posts |

A private, banned or misspelled profile is reported in the run status and the profiles table and is not charged. Videos left out by a filter are not charged.

#### Why this Actor

| | |
|---|---|
| 🎬 **Every video, not just the latest** | The whole public video list of a profile, thousands of videos per run |
| 📅 **Real date ranges** | Jumps straight to the dates you ask for instead of scrolling through newer videos |
| 🔔 **New-video alerts** | Schedule it hourly or daily: each run returns only new videos of every profile, a run with nothing new costs only the start |
| 📊 **Profiles table, free** | One row per account: exact followers, average and median plays, engagement, posts per week, top video: ready for influencer vetting |
| 📇 **Creator contacts** | Email, website, Telegram, Instagram, YouTube, X and Twitch from the profile, even when written as "TG: @name", once per account |
| ⬇️ **MP4 without watermark** | Download all videos of a profile with permanent links |
| 💰 **$0.29 per 1,000 videos** | Ten times cheaper than the most popular TikTok profile scraper, no add-on fees for dates or filters |

#### Monitor creators: only new videos

1. Add the profiles you follow (competitors, creators of a campaign, your own)
2. Turn on **Only new videos since the previous run**, save as a task and add a schedule, e.g. every hour
3. **First run** returns the latest videos and remembers the newest one per profile. **Every later run** returns only videos posted since then

The newest video seen is kept in your account (key-value store `tiktok-profile-state`) and is shared by all your runs and tasks. Connect [Google Sheets](https://apify.com/s_actors/google-sheets-import-export), Slack or email with an integration to be notified.

#### Pricing

Pay per result, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Video in the results | $0.00029 | $0.000261 | $0.000232 |
| Video download (MP4 or photo post images) | $0.00099 | $0.000891 | $0.000792 |

Videos alone cost $0.29 per 1,000; with **Download videos** each video costs $0.29 + $0.99 = $1.28 per 1,000. The profiles table with contacts, the filters and new-video alerts are included.

| Task | Cost |
|---|---|
| All 1,355 videos of a big creator | ~$0.39 |
| Latest 30 videos of 100 creators (3,000 videos) | ~$0.87 |
| 100 videos with MP4 download | ~$0.13 |
| Profiles table of 1,000 creators (1 video each) | ~$0.29 |
| Hourly new-video alert for 10 creators for a month | ~$0.72 + $0.00029 per new video |

Profiles that are not found or private and videos left out by filters are not charged. Storing downloaded files uses your Apify storage.

#### Ready-made tasks

Open it, change the profiles, and run:

| Task | What you get |
|---|---|
| [Download All TikTok Videos by Username](https://apify.com/s_actors/tiktok-profile-scraper/examples/download-all-tiktok-videos-by-username) | MP4s without watermark and stats of a profile's videos |

#### FAQ

**Does it get all videos of a profile?** Yes, every public video TikTok lists on the profile, newest first. The profile's video count can be a little higher than what you get: it also counts videos that the creator made private or that TikTok removed (for @khaby.lame 1,324 of 1,355).

**Can it scrape private accounts?** No. TikTok shows a private account's videos only to approved followers. The summary still says the account is private.

**Are the view counts exact?** They are the numbers TikTok shows on its website. TikTok itself rounds plays, likes, comments and shares from 10,000 (for example 1.5M). Saves and smaller numbers are exact. Follower and like counts of the profile are exact.

**Does it scrape hashtags or search results?** No: TikTok closed hashtag and search lists to visitors who are not logged in. This Actor reads profiles.

**Does the MP4 have a watermark?** No, the Actor saves the clean version TikTok plays on its website. Photo posts give every image as a JPG.

**How long do the download links work?** `videoFileUrl` and `imageFileUrls` point to your Apify storage and work as long as the run's storage is kept. TikTok's own links (`coverUrl`, `imageUrls`, `musicAudioUrl`) expire after a few days.

**Where do the emails come from?** From what the creator wrote in the profile: the bio and the bio link. The Actor does not guess emails and does not unlock hidden ones.

**Do I need a TikTok account or cookies?** No. The Actor reads public profiles the way the TikTok website does for a visitor.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Which of these 20 creators posts most often, and whose videos get the most views?"

#### Other tools

| Tool | What it does |
|---|---|
| [TikTok Video Scraper](https://apify.com/s_actors/tiktok-video-scraper) | Views, likes, shares, hashtags and sound of TikTok videos, MP4 download, views tracker |
| [TikTok Comments Scraper](https://apify.com/s_actors/tiktok-comments-scraper) | Comments and replies of TikTok videos and profiles, only-new alerts |
| [TikTok Transcript Scraper](https://apify.com/s_actors/tiktok-transcript-scraper) | Transcripts and subtitles of TikTok videos and profiles: text, SRT, VTT, translations |
| [TikTok Followers Scraper](https://apify.com/s_actors/tiktok-followers-scraper) | Followers and following lists of TikTok profiles: bio emails, follow time, new followers and unfollows |
| [TikTok Trending Hashtags Scraper](https://apify.com/s_actors/tiktok-trending-hashtags-scraper) | Trending TikTok hashtags by country: ~45 per country (not just the top 3), views, trend curve, top creators, new-trend alerts |
| [TikTok Viral Videos & Explore Scraper](https://apify.com/s_actors/tiktok-explore-scraper) | Viral TikTok videos from the Explore page in any country and 21 categories: plays, likes, plays per hour, creators, new-video alerts |
| [YouTube Channel Scraper](https://apify.com/s_actors/youtube-channel-scraper) | Exact views, subscribers and all videos of YouTube channels |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the videos to a Google Sheet |

#### Is it legal?

The Actor collects only public profiles, videos and stats that TikTok shows to any visitor, without logging in. Videos and their captions are the creators' content: respect copyright when you reuse downloaded files, and use personal data such as usernames and emails in line with GDPR and other privacy laws.

# Actor input Schema

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

One per line: @username, a username, or a profile link (tiktok.com/@user). Public profiles only: private and banned accounts are reported in the run status and are free. Each account's stats and contacts (Telegram, Instagram, YouTube, website, email from the bio) go to the profiles table once, free.

## `maxVideosPerProfile` (type: `integer`):

How many videos to scrape from each profile, newest first. 0 = all public videos of the profile (thousands are fine: about 25 videos a second).

## `postedAfter` (type: `string`):

Only videos posted after this: a date like 2025-01-01 or a period like 7 days, 2 weeks, 6 months, 1 year (ago). Reading stops at the first older video.

## `postedBefore` (type: `string`):

Only videos posted before this: a date like 2025-03-01 or a period like 30 days (ago). The Actor jumps straight to this date, without paging through newer videos.

## `minPlays` (type: `integer`):

Only videos with at least this many plays (views). Leave empty for all.

## `skipPhotoPosts` (type: `boolean`):

Leave out photo carousels (slideshows) and keep only videos.

## `onlyNewVideos` (type: `boolean`):

Output only videos newer than the newest one any earlier run in your account saw for this profile (key-value store tiktok-profile-state). The first run outputs videos as usual (within Max videos per profile) and remembers the newest. A run with no new videos costs only the start.

## `downloadVideos` (type: `boolean`):

Save each video as an MP4 without the TikTok watermark (and all images of photo posts as JPG) to the run's key-value store. The row gets videoFileUrl (or imageFileUrls). Charged per downloaded video, on top of the video row. About 1 to 3 seconds per video.

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

How many profiles are scraped in parallel. Each profile's videos are read page by page (15 a page). Downloads run at most 3 at a time.

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

Requests go direct first and switch to Apify datacenter proxies (then residential) when TikTok refuses them. The default works for most runs.

## `debugLog` (type: `boolean`):

Log every retried request (for troubleshooting).

## Actor input object example

```json
{
  "profiles": [
    "@sephora",
    "@gordonramsayofficial",
    "@egorkreed"
  ],
  "maxVideosPerProfile": 20,
  "skipPhotoPosts": false,
  "onlyNewVideos": false,
  "downloadVideos": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Every video of the profiles: plays, likes, comments, shares, saves, engagement, date, hashtags, sound.

## `profiles` (type: `string`):

One row per account: exact followers and likes, bio, contacts (email, website, Telegram, Instagram, YouTube, X, Twitch), average and median plays, engagement, posts per week, top video.

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

Per profile: exact followers, likes, bio, email in bio; over the scraped videos: average and median plays, engagement, posts per week, top video.

## `files` (type: `string`):

MP4s and photo post images saved by the run (with Download videos).

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "profiles": [
        "@sephora",
        "@gordonramsayofficial",
        "@egorkreed"
    ],
    "maxVideosPerProfile": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/tiktok-profile-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 = {
    "profiles": [
        "@sephora",
        "@gordonramsayofficial",
        "@egorkreed",
    ],
    "maxVideosPerProfile": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/tiktok-profile-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 '{
  "profiles": [
    "@sephora",
    "@gordonramsayofficial",
    "@egorkreed"
  ],
  "maxVideosPerProfile": 20
}' |
apify call s_actors/tiktok-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/tiktok-profile-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/JJlSEe42jHwOToIgn/builds/fJ3mqbYh5ZcDre7vd/openapi.json
