# TikTok Profile Posts Scraper | No Login, No Cookies, Bulk (`scraping_solutions/tiktok-profile-scraper-posts`) Actor

Scrape public TikTok profile posts in bulk without login or cookies. Extract captions, hashtags, music, video URLs, dates, views, likes, comments, shares, saves, creator profiles, and audience statistics. Filter by pinned status, profile section, sorting, and date; export to JSON, CSV, or Excel.

- **URL**: https://apify.com/scraping_solutions/tiktok-profile-scraper-posts.md
- **Developed by:** [Scraping Solutions](https://apify.com/scraping_solutions) (community)
- **Categories:** Lead generation, Social media, Marketing
- **Stats:** 644 total users, 100 monthly users, 100.0% runs succeeded, 5 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 results

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 Posts Scraper | No Login | No Cookies | Bulk

Extract public TikTok profile videos, reposts, liked-video feeds, engagement metrics, music metadata, creator statistics, and playable media URLs from one or multiple accounts. This TikTok profile scraper requires no login and no cookies, supports bulk profile processing, and produces structured data for content research, influencer analysis, competitor monitoring, lead generation, and automated reporting.

This Actor is part of the **Scraping Solutions multi-platform toolkit** for TikTok, Instagram, X, and LinkedIn audience and content research.

### What this Actor does

- Scrapes public TikTok videos from one or multiple usernames or profile URLs.
- Supports the standard profile feed and publicly available liked-video feeds.
- Extracts reposts when they are publicly available.
- Filters results by publication date.
- Optionally excludes pinned videos.
- Returns captions, hashtags, music, video dimensions, engagement metrics, and creator statistics.
- Removes duplicate video IDs within each requested profile.
- Exports results through Apify as JSON, JSONL, CSV, Excel, XML, HTML, RSS, or API responses.

### Sorting and filtering options

| Input | Value | Actual behavior |
|---|---|---|
| `TypeVideo` | `Videos` | Reads a public profile video feed using the selected `videoFeed` mode. |
| `TypeVideo` | `Reposts` | Reads the public repost feed. Repost availability depends on the profile and TikTok. |
| `videoFeed` | `Simple` | Uses the standard profile-post feed, which normally returns recent videos first. |
| `videoFeed` | `Liked` | Reads videos the profile has liked when that feed is public. It does not sort the profile's own videos by like count. |
| `FilterVideoPinned` | `No` | Keeps pinned and non-pinned videos. |
| `FilterVideoPinned` | `Yes` | Excludes pinned videos from the output. |
| `minDate` | `YYYY-MM-DD` | Keeps videos published on or after this date. |
| `maxDate` | `YYYY-MM-DD` | Keeps videos published on or before this date. |

`videoFeed` applies primarily when `TypeVideo` is `Videos`. TikTok may not expose reposts or liked-video feeds for every public profile.

### Quick start

1. Add one or more TikTok usernames or profile URLs to `Input_Search`.
2. Choose `Videos` or `Reposts`.
3. Select the feed order and optional filters.
4. Set `resultsLimit`, which is applied independently to every profile.
5. Click **Start** and open the default dataset when the run finishes.

#### Single profile

```json
{
  "Input_Search": ["google"],
  "TypeVideo": "Videos",
  "FilterVideoPinned": "No",
  "videoFeed": "Simple",
  "resultsLimit": 50
}
```

#### Bulk profiles with date and pinned-video filters

```json
{
  "Input_Search": [
    "nike",
    "adidas",
    "https://www.tiktok.com/@puma"
  ],
  "TypeVideo": "Videos",
  "FilterVideoPinned": "Yes",
  "videoFeed": "Simple",
  "minDate": "2026-08-01",
  "maxDate": "2026-08-31",
  "resultsLimit": 200
}
```

### Input

| Field | Type | Required | Default | Description |
|---|---:|:---:|---:|---|
| `Input_Search` | array | Yes | `google` example | TikTok usernames or public profile URLs, one per line. Values are normalized and duplicates are removed. |
| `TypeVideo` | string | Yes | `Videos` | Select `Videos` or `Reposts`. |
| `FilterVideoPinned` | string | No | `No` | Select `Yes` to exclude pinned videos. Select `No` to keep them. |
| `videoFeed` | string | No | `Simple` | Select `Simple` or `Liked`. See the behavior table above. Saved tasks using the legacy `TypeSorter` field remain supported; retired `Popular` and `Oldest` values fall back to `Simple`. |
| `minDate` | string | No | Empty | Earliest publication date to include, in `YYYY-MM-DD` format. |
| `maxDate` | string | No | Empty | Latest publication date to include, in `YYYY-MM-DD` format. |
| `resultsLimit` | integer | No | `50` | Maximum unique results per profile. Minimum `1`, maximum `10000`. |

The result limit is **per profile**, not per run. Three profiles with `resultsLimit: 200` can produce up to 600 billable dataset rows, subject to public availability, filtering, deduplication, pagination, and the run's maximum total charge.

### Output fields

The dataset uses flat field names. Keys such as `stats.play_count` and `author.unique_id` contain literal periods; they are not nested JSON objects.

#### Video and post metadata

| Field | Description |
|---|---|
| `type` | Requested profile section, such as `Videos` or `Reposts`. |
| `search` | Normalized source username supplied for this result. |
| `isPinnedItem` | Whether TikTok reports the video as pinned. |
| `video_id` | TikTok video identifier. |
| `link_post` | Canonical public TikTok post URL when the username and video ID are available. |
| `desc` | Public video caption or description. |
| `post_date` | Normalized publication date and time. |
| `create_time` | Publication time as a Unix timestamp. |
| `text_language` | Language code reported for the post text. |
| `is_ad` | Whether TikTok reports the content as an advertisement. |
| `hashtags` | Array of hashtags extracted from TikTok's text metadata. |

#### Music and media

| Field | Description |
|---|---|
| `music.title` | Music or sound title. |
| `music.author_name` | Music or sound author. |
| `music.id` | TikTok music identifier. |
| `music.cover` | Music cover image URL. |
| `video.play_url` | Temporary playable media URL when exposed by TikTok. |
| `video.duration` | Video duration in seconds. |
| `video.height` | Reported video height in pixels. |
| `video.width` | Reported video width in pixels. |

#### Engagement statistics

| Field | Description |
|---|---|
| `stats.play_count` | Reported video view count. |
| `stats.comment_count` | Reported comment count. |
| `stats.share_count` | Reported share count. |
| `stats.digg_count` | Reported like count. |
| `stats.collect_count` | Reported save or favorite count. |

#### Author information

| Field | Description |
|---|---|
| `author.unique_id` | Creator's TikTok username. |
| `author.nickname` | Creator's public display name. |
| `author.id` | TikTok creator identifier. |
| `author.verified` | Reported verification status. |
| `author.signature` | Public creator biography. |
| `author.avatar` | Public avatar URL. |
| `author.follower_count` | Reported profile follower count. |
| `author.following_count` | Reported number of accounts followed by the creator. |
| `author.heart_count` | Reported total likes received by the profile. |
| `author.video_count` | Reported number of videos on the profile. |
| `link_user` | Canonical public TikTok profile URL. |

Fields can be `null` when TikTok does not expose the corresponding value. Media, avatar, and cover URLs can expire; use `link_post` and `link_user` as the durable references.

### Example output

```json
{
  "type": "Videos",
  "search": "example_creator",
  "isPinnedItem": false,
  "video_id": "7559313483398008095",
  "link_post": "https://www.tiktok.com/@example_creator/video/7559313483398008095",
  "desc": "A public TikTok video caption #marketing",
  "post_date": "2026-08-18 14:32:10",
  "create_time": 1787063530,
  "text_language": "en",
  "is_ad": false,
  "hashtags": ["marketing"],
  "music.title": "Original sound",
  "music.author_name": "Example Creator",
  "music.id": "7556815852168759313",
  "music.cover": "https://example.tiktokcdn.com/music-cover.jpeg",
  "video.play_url": "https://example.tiktokcdn.com/video-playback.mp4",
  "video.duration": 34,
  "video.height": 1024,
  "video.width": 576,
  "stats.play_count": 184500,
  "stats.comment_count": 428,
  "stats.share_count": 871,
  "stats.digg_count": 19400,
  "stats.collect_count": 2500,
  "author.unique_id": "example_creator",
  "author.nickname": "Example Creator",
  "author.id": "6881290705605477381",
  "author.verified": false,
  "author.signature": "Public profile biography",
  "author.avatar": "https://example.tiktokcdn.com/avatar.jpeg",
  "author.follower_count": 245000,
  "author.following_count": 413,
  "author.heart_count": 3200000,
  "author.video_count": 286,
  "link_user": "https://www.tiktok.com/@example_creator"
}
```

The values above are illustrative; the field names match the Actor's current dataset contract.

### Pricing

This Actor uses pay-per-event pricing. The primary `apify-default-dataset-item` event is charged once for each result successfully written to the default dataset.

| Apify plan | Per result | 500 results | 1,000 results | 5,000 results |
|---|---:|---:|---:|---:|
| Free | $0.00200 | $1.00 | $2.00 | $10.00 |
| Starter / Bronze | $0.00150 | $0.75 | $1.50 | $7.50 |
| Scale / Silver | $0.00125 | $0.625 | $1.25 | $6.25 |
| Business / Gold | $0.00100 | $0.50 | $1.00 | $5.00 |
| Platinum / Diamond | $0.00100 | $0.50 | $1.00 | $5.00 |

These examples assume that every requested row is delivered. Before a large run, confirm the current prices shown in the Actor's **Pricing** tab and set an appropriate maximum total charge.

### Free plan limits

The Actor does not currently impose a separate source-code quota on Free users. Free users can run it within their available Apify credits and the run's selected maximum total charge. The same public input range of 1 to 10,000 results per profile is available, but billing and public data availability still apply.

For a first test, use one public username with 20 results before scaling to larger profile lists.

### Use cases

#### Content research

Compare captions, hashtags, formats, posting dates, video durations, and media strategies across public TikTok profiles.

#### Influencer analysis

Evaluate creator size, posting volume, verification status, and public engagement metrics before outreach or partnerships.

#### Competitor monitoring

Track public competitor videos and compare their posting activity, themes, music choices, and performance.

#### Trend detection

Identify recurring hashtags, sounds, topics, and high-performing content across selected creators.

#### Lead generation

Build structured lists of active public creators for responsible qualification, partnership research, and personalized outreach.

#### Campaign tracking

Monitor videos published by brand partners, ambassadors, or campaign participants within a defined date range.

#### Media workflows

Send public post URLs, thumbnails, and temporary playback URLs into approved archiving, moderation, or analytics workflows.

#### Reporting and automation

Load structured TikTok data into spreadsheets, databases, BI tools, dashboards, CRMs, and scheduled reporting pipelines.

### Reliability and availability

- Transient upstream responses, rate limits, and server errors are retried automatically.
- Multiple requested profiles are processed concurrently.
- A failure on one profile does not automatically discard successful results from other profiles.
- Duplicate video IDs are removed within each requested profile.
- Pagination stops when TikTok reports no more content, repeats a cursor, or returns consecutive pages without new videos.
- Private, restricted, deleted, region-limited, or unavailable profiles can return fewer results or none.
- Repost and liked-video visibility depends on each profile's public settings and current TikTok behavior.
- Sorting feeds can change over time because TikTok controls their contents and order.
- The requested result limit is a maximum, not a guarantee.

### Export and integrations

Export the default dataset as JSON, JSONL, CSV, Excel, XML, HTML, or RSS. You can also run the Actor through the Apify API, save reusable Tasks, schedule recurring profile monitoring, trigger webhooks, connect supported automation tools, or include the Actor in compatible MCP workflows.

### FAQ

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

No. The Actor works with publicly accessible profile data and does not require customer-provided TikTok credentials or cookies.

#### Can I process multiple usernames in one run?

Yes. Add each username or profile URL as a separate entry in `Input_Search`.

#### Is `resultsLimit` applied to the entire run?

No. It is applied independently to every requested profile. Multiply the limit by the number of unique profiles to estimate the maximum possible output and charge.

#### What does `Simple` sorting mean?

It uses the standard public profile-post feed, which normally provides recent videos first. TikTok ultimately controls the ordering.

#### Does `Liked` sort the creator's own videos by likes?

No. It requests videos the profile has liked, when that feed is public and available.

#### Can the Actor extract reposts?

Yes. Choose `Reposts`. TikTok does not expose reposts for every profile, so some profiles can return fewer results or none.

#### How do I remove pinned videos?

Set `FilterVideoPinned` to `Yes`. Despite the field's historical name, `Yes` means that pinned videos are excluded.

#### Are the date filters inclusive?

Yes. `minDate` keeps videos published on or after the selected date, and `maxDate` keeps videos published on or before it.

#### Why did I receive fewer results than requested?

The public feed may contain fewer available videos. Date filters, pinned-video exclusion, duplicate removal, privacy settings, unavailable feeds, exhausted pagination, and run charge limits can also reduce the result count.

#### Are duplicates removed?

Yes, within each requested profile using the combination of source username and video ID. The same public video can legitimately appear under different requested profiles, particularly in repost or liked-video research.

#### Are playback URLs permanent?

No. TikTok media URLs can expire. Store `link_post` as the durable post reference and refresh media URLs when necessary.

#### How am I billed?

One result event is charged for every row successfully delivered to the default dataset at the price applicable to your Apify plan.

#### Can I use the Actor through API or MCP?

Yes. Use the Actor ID `cVXhGt23mAe8FX2ae` through the Apify API or include it in compatible MCP workflows.

#### Can I export the data to CSV or Excel?

Yes. Open the default dataset and use the **Export** menu, or retrieve the records programmatically through the Apify API.

#### What compliance requirements apply?

You are responsible for using public TikTok data lawfully and for following applicable privacy, data-protection, intellectual-property, marketing, and platform requirements.

### Responsible use

Use public TikTok data lawfully and proportionately. Do not use the output for spam, harassment, unlawful profiling, discriminatory decisions, unauthorized surveillance, or attempts to bypass privacy controls. Respect intellectual-property rights and applicable platform and data-protection requirements.

### Related Actors by Scraping Solutions

- [TikTok Followers & Following Scraper](https://apify.com/scraping_solutions/tiktok-followers-following-scraper)
- [Instagram Hashtag Scraper | Posts & Reels](https://apify.com/scraping_solutions/instagram-hashtag-scraper-pro-no-cookies)
- [Instagram Engagers | Likes & Comments](https://apify.com/scraping_solutions/instagram-engagers-likes-and-comments-no-cookies)
- [Instagram Followers & Following Scraper](https://apify.com/scraping_solutions/instagram-scraper-followers-following-no-cookies)
- [X (Twitter) Followers & Following Scraper](https://apify.com/scraping_solutions/twitter-x-scraper-followers-followings-no-cookies)
- [LinkedIn Engagers | Likers, Commenters, Reshares](https://apify.com/scraping_solutions/linkedin-posts-engagers-likers-and-commenters-no-cookies)

### Categories

Lead Generation, Social Media, Marketing

### Support

Open an issue on the [Actor support page](https://apify.com/scraping_solutions/tiktok-profile-scraper-posts/issues). Include the run ID, public username or profile URL, selected section, sorting option, filters, requested limit, expected behavior, and actual behavior. Never include passwords, cookies, or API keys.

# Changelog

This Actor's version history is a separate document: https://apify.com/scraping_solutions/tiktok-profile-scraper-posts/changelog.md

# Actor input Schema

## `Input_Search` (type: `array`):

Add a list of usernames to want to scrape. You can add them one per line.

## `FilterVideoPinned` (type: `string`):

Filter to pinned video

## `TypeVideo` (type: `string`):

If a profile has reposted videos, you can scrape them by selecting 'Reposts'

## `videoFeed` (type: `string`):

Select Simple for the standard profile feed (normally recent videos first), or Liked for the profile's publicly available liked-video feed.

## `minDate` (type: `string`):

Select the earliest post date to include.

## `maxDate` (type: `string`):

Select the latest post date to include.

## `resultsLimit` (type: `integer`):

number of videos for scraping, 1-10000 are the allowed values

## Actor input object example

```json
{
  "Input_Search": [
    "google"
  ],
  "FilterVideoPinned": "No",
  "TypeVideo": "Videos",
  "videoFeed": "Simple",
  "resultsLimit": 50
}
```

# Actor output Schema

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

Scrape TikTok posts data in records stored in the default dataset.

# 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 = {
    "Input_Search": [
        "google"
    ],
    "resultsLimit": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraping_solutions/tiktok-profile-scraper-posts").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 = {
    "Input_Search": ["google"],
    "resultsLimit": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scraping_solutions/tiktok-profile-scraper-posts").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 '{
  "Input_Search": [
    "google"
  ],
  "resultsLimit": 50
}' |
apify call scraping_solutions/tiktok-profile-scraper-posts --silent --output-dataset

```

## MCP server setup

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

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/cVXhGt23mAe8FX2ae/builds/GcpdpiHJkn8NQLfn4/openapi.json
