# TikTok Profile Videos Scraper - Views, Likes & Captions (`benthepythondev/tiktok-profile-videos-scraper`) Actor

Export every video of any public TikTok profile without login: caption, date, views, likes, comments, shares, saves, hashtags, music, duration and links. Full history, new to old.

- **URL**: https://apify.com/benthepythondev/tiktok-profile-videos-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (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 $1.28 / 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 Videos Scraper - Views, Likes & Captions

Export the videos of any public TikTok profile, from the newest back to the first one: caption, posting time, views, likes, comments, shares, saves, hashtags, mentions, sound, duration and links. Photo posts are included. No login, no cookies, no proxy to configure. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the TikTok Profile Videos Scraper?

It is an Apify Actor that reads a profile's video list the way TikTok's own site loads it, 15 videos per request, without opening a browser. The default run (the 30 newest videos of one profile) takes about five seconds. A profile with 1,325 public videos going back to March 2020 was exported in 45 seconds in our test on Apify.

Give it usernames, @handles or profile links. Each video becomes one row, and each row also carries the profile's exact follower count, so views can be compared with audience size straight away.

Two inputs control how much is read:

- **Maximum videos per profile** counts from the newest video back. Set it high to export a whole history.
- **Posted on or after** stops the run as soon as older videos are reached. A daily scheduled run with a date then only reads, and only charges for, what is new.

#### What data does it extract?

- **Video:** `id`, `url`, `type` (`video` or `photo`), `description`, `created_at`, `duration_seconds`, `language`, `width`, `height`
- **Engagement:** `plays`, `likes`, `comments`, `shares`, `saves`, `reposts`, `engagement_rate`
- **Text signals:** `hashtags`, `mentions`
- **Profile:** `author_username`, `author_nickname`, `author_id`, `author_verified`, `author_followers`
- **Sound:** `music_id`, `music_title`, `music_author`, `music_is_original`
- **Media:** `cover_url`, `video_url`, `image_urls` (photo posts)
- **Flags:** `has_transcript`, `transcript_language`, `is_ad`

### ⬇️ Input

| Field | Type | What it does |
|---|---|---|
| `profiles` | array | Usernames, @handles or profile links |
| `maxResults` | integer | Videos per profile, newest first. 30 by default, up to 100,000 |
| `postedAfter` | date | Only videos from this UTC date on; reading stops at older videos |

#### Example input

Everything two brands posted since September 1:

```json
{
  "profiles": ["nasa", "https://www.tiktok.com/@duolingo"],
  "maxResults": 1000,
  "postedAfter": "2026-09-01"
}
```

### ⬆️ Output

A real row (the two media links are shortened here):

```json
{
  "id": "7691727731800673549",
  "url": "https://www.tiktok.com/@nasa/video/7691727731800673549",
  "type": "video",
  "description": "Off Earth, working for Earth.🚀🧑‍🚀 Crew-13 is headed to the ISS to conduct research and test new technologies in microgravity!",
  "created_at": "2026-10-01T15:52:32",
  "plays": 283900,
  "likes": 35400,
  "comments": 651,
  "shares": 1660,
  "saves": 2197,
  "reposts": 0,
  "engagement_rate": 0.1328,
  "duration_seconds": 16,
  "hashtags": [],
  "mentions": [],
  "language": "en",
  "author_username": "nasa",
  "author_nickname": "NASA",
  "author_id": "7664638705177150477",
  "author_verified": true,
  "author_followers": 1941535,
  "music_id": "7691727809881901838",
  "music_title": "original sound",
  "music_author": "NASA",
  "music_is_original": true,
  "cover_url": "https://p19-common-sign.tiktokcdn-us.com/…",
  "video_url": "https://v16-webapp-prime.us.tiktok.com/video/…",
  "width": 720,
  "height": 1280,
  "image_urls": [],
  "has_transcript": false,
  "transcript_language": null,
  "is_ad": false,
  "scraped_at": "2026-10-03T10:23:01.465715"
}
```

All times are UTC. `engagement_rate` is likes plus comments plus shares, divided by views. TikTok rounds large view and like counts for visitors (283,900 here); smaller numbers are exact, and `author_followers` is always exact.

### 💰 How much does it cost?

You pay per saved video, plus a tiny start fee per run.

| Apify plan | Price per 1,000 videos |
|---|---|
| Free | $1.50 |
| Starter | $1.425 |
| Scale | $1.35 |
| Business and above | $1.275 |

The default run (30 videos) costs 4.5 cents. Set **Maximum cost per run** in the run options and the Actor stops at that amount and says so in the status message.

### 💡 Use cases

- 🤝 **Vet creators before a campaign:** compare a creator's typical views with the follower count, and see how often they post and what their sponsored videos reach.
- 📈 **Track competitors and your own brand:** schedule a daily run with **Posted on or after** and collect every new video with its numbers in a sheet.
- 🔥 **Find what works in a niche:** export the full history of the leading accounts and sort by `plays` or `engagement_rate` to see the formats, hashtags and sounds behind their best videos.
- 🧠 **Content datasets:** captions, hashtags and performance for trend research or model training, with `has_transcript` showing which videos also have spoken text.

### ❓ FAQ

**Do I need a TikTok account, cookies or a proxy?** No. The Actor reads what TikTok shows any visitor and manages its own connections.

**Does it really go back to a profile's first video?** Yes. The list is read from new to old until it ends or your limit is reached. In our test a profile showing 1,355 videos gave 1,327: TikTok's counter includes videos that visitors cannot open.

**Why are some view counts round numbers?** TikTok rounds large counts for visitors, for example 283,900 or 2.6 million. Comments, shares and saves are usually exact.

**Does `maxResults` count per profile or per run?** Per profile. Three profiles with `maxResults: 100` can save up to 300 rows. To cap the whole run, set **Maximum cost per run**.

**Are pinned videos marked?** No. The list comes in time order and TikTok does not say which videos are pinned in it. The [TikTok Profile Scraper](https://apify.com/benthepythondev/tiktok-profile-scraper) marks the pinned ones among a profile's latest videos.

**Can I download the videos?** Each row has `video_url` and `cover_url`. They are TikTok's own temporary links: they expire after a few hours, and TikTok may ask for the cookies of the session that received them. The Actor does not download or store video files.

**What about private, banned or missing accounts?** They are skipped and named in the status message and the `SUMMARY` record. The run still succeeds with the other profiles.

**Can I get what the creator says in the videos?** Rows with `has_transcript: true` have a subtitle track. The [TikTok Transcript Scraper](https://apify.com/benthepythondev/tiktok-transcript-scraper) returns it as text for a profile's latest videos or for single links.

**Is it legal to scrape TikTok videos?** The Actor reads only what TikTok shows publicly to any visitor and does not log in. Captions and account names can be personal data, so GDPR, CCPA and similar rules apply to how you store and use them, and TikTok's terms apply to you as well. If in doubt, ask a lawyer.

**Something is missing or broken?** Open an issue on the Actor's Issues tab with the run ID. Issues are answered within one business day.

### 🔗 You might also like

- [TikTok Transcript Scraper](https://apify.com/benthepythondev/tiktok-transcript-scraper)
- [TikTok Comments Scraper](https://apify.com/benthepythondev/tiktok-comments-scraper)
- [TikTok Profile Scraper](https://apify.com/benthepythondev/tiktok-profile-scraper)
- [Instagram Posts Scraper](https://apify.com/benthepythondev/instagram-posts-scraper)
- [Instagram Reels Scraper](https://apify.com/benthepythondev/instagram-reels-scraper)

**Keywords:** tiktok profile videos scraper, tiktok video scraper, tiktok user videos, scrape tiktok profile, tiktok videos export, tiktok videos to csv, tiktok views and likes, tiktok engagement rate, tiktok hashtag data, tiktok influencer analytics, tiktok competitor monitoring, tiktok creator research, tiktok api alternative, tiktok scraper without login, tiktok video data

# Actor input Schema

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

Usernames, @handles or profile links (https://www.tiktok.com/@nasa).

## `maxResults` (type: `integer`):

Videos to save for each profile, newest first. Set it high to export a profile's whole history.

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

Only videos from this UTC date on (YYYY-MM-DD). Reading stops once older videos are reached, so a scheduled run only pays for new ones.

## Actor input object example

```json
{
  "profiles": [
    "nasa"
  ],
  "maxResults": 30
}
```

# 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 = {
    "profiles": [
        "nasa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/tiktok-profile-videos-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": ["nasa"] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/tiktok-profile-videos-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": [
    "nasa"
  ]
}' |
apify call benthepythondev/tiktok-profile-videos-scraper --silent --output-dataset

```

## MCP server setup

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