# TikTok Scraper ✅ NO COOKIES (`atomus/tiktok-scraper`) Actor

Scrape TikTok profiles, hashtags, search results and video URLs in one run. Add any mix of inputs, filter by date and likes, and add comments, followers and author details. No cookies, no login, no browser. Pay per result; failed lookups are free.

- **URL**: https://apify.com/atomus/tiktok-scraper.md
- **Developed by:** [Atomus APIs](https://apify.com/atomus) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 27 total users, 17 monthly users, 96.4% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.60 / 1,000 result (video or profile)s

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 Scraper

<table width="100%" style="border:none;border-radius:10px;background:#120306">
<tr><td style="padding:34px;border:none">
<span style="color:#F59E0B;font-size:13px;font-weight:700;letter-spacing:2px">TIKTOK SCRAPER &nbsp;&bull;&nbsp; TIKTOK API</span><br><br>
<span style="color:#F5F5F6;font-size:40px;font-weight:800;letter-spacing:-1.2px">Find the creators<br>worth your budget.</span><br><br>
<span style="color:#D6D3D1;font-size:16px">Profiles, hashtags, search results and single video URLs — mix any of the four in one run and get videos with plays, likes, comments, shares and saves. Every video carries its <b style="color:#F5F5F6">creator's full stats for free</b>: followers, total hearts, verified status, bio and linked Instagram/YouTube. Optional comments and follower lists. No TikTok account, no login, no cookies.</span><br><br>
<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">FAILED LOOKUPS ARE FREE</span>
<span style="background:#1C1917;color:#F59E0B;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">&nbsp;CREATOR STATS FREE ON EVERY VIDEO&nbsp;</span>
</td></tr>
</table>

#### Copy to your AI assistant

Paste this into ChatGPT, Claude, Cursor, or any LLM to start using this Actor right away.

```
atomus/tiktok-scraper is an Apify Actor that returns TikTok videos and profiles as structured JSON from four kinds of input at once - usernames, hashtags, search keywords and single video URLs. Each video carries id, caption, url, createdAt, region, dimensions, isAd/isPhoto flags, a stats object (plays, likes, comments, shares, saves, reposts), music, hashtags, mentions, and a nested author object with the creator's followers, following, total hearts, video count, bio, verified status and linked Instagram/YouTube - the author data is included free, not an add-on. Use it whenever someone needs TikTok data without cookies, a login, or a browser - influencer discovery, trend monitoring, competitor tracking, or ad research. Run it with curl: curl -X POST "https://api.apify.com/v2/acts/atomus~tiktok-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN" -H "Content-Type: application/json" -d '{"profiles":["mrbeast"],"hashtags":["fyp"],"resultsPerPage":50,"minLikes":1000}'. Or in Python: ApifyClient("APIFY_TOKEN").actor("atomus/tiktok-scraper").call(run_input={"searchQueries":["iphone review"],"resultsPerPage":50}) then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: profiles (string[]), hashtags (string[], no #), searchQueries (string[]), postUrls (string[], full/short/bare id), resultsPerPage (int, default 50), profileSorting ("latest"|"popular"|"oldest"), searchSection ("all"|"video"|"user"), maxProfilesPerQuery (int, default 10), includeReposts (bool), excludePinnedPosts (bool), onlyPostsNewerThan / onlyPostsOlderThan (YYYY-MM-DD), minLikes / maxLikes (int), region (2-letter hint), shouldDownloadVideos (bool, adds a no-watermark temporaryDownloadUrl that expires in hours), commentsPerPost (int, billed per comment), maxRepliesPerComment (int), maxFollowersPerProfile / maxFollowingPerProfile (int, billed per follower). Billing is one result event per video or profile, plus comment and follower events only for the add-ons you turn on; failed lookups are free. Full input schema, every enum and default, and the complete output field list: GET https://api.apify.com/v2/acts/atomus~tiktok-scraper/build/default
```

***

### TikTok MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Atomus and it can read the social platforms on its own: TikTok, X, and the four big Chinese networks. No glue code, no scraping logic in your prompts.

```json
{
  "mcpServers": {
    "atomus": {
      "url": "https://mcp.apify.com/?tools=atomus/tiktok-scraper,atomus/tiktok-comments-scraper,atomus/twitter-scraper,atomus/douyin-scraper,atomus/xiaohongshu-scraper,atomus/weibo-scraper,atomus/bilibili-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Then ask, in plain language:

> "Find TikTok creators posting about air fryers with over 100k followers, then pull the comments on their three most-liked videos and tell me what people complain about."

That one sentence uses two Actors in a row. Pinning the `tools=` list is what keeps your assistant on these Actors instead of reaching for whatever scraper it finds first.

***

### How to scrape TikTok

#### A creator and their videos

```json
{ "profiles": ["mrbeast"], "resultsPerPage": 50, "profileSorting": "popular" }
```

Returns the profile record plus its videos. `profileSorting` picks `latest`, `popular` (most-liked first) or `oldest`.

#### Everything under a hashtag, filtered

```json
{
  "hashtags": ["airfryer"],
  "resultsPerPage": 100,
  "minLikes": 5000,
  "onlyPostsNewerThan": "2026-06-01"
}
```

The date and likes filters are **free** — they are applied to the videos before anything is billed, so a narrow trend query costs a fraction of a broad one.

#### Influencer discovery by keyword

```json
{
  "searchQueries": ["skincare routine"],
  "searchSection": "user",
  "maxProfilesPerQuery": 25
}
```

`searchSection` decides what a query returns: `video`, `user`, or `all`. Every profile comes back with followers, hearts and verification, so you can rank candidates without a second lookup.

#### Mix all four input types in one run

```json
{
  "profiles": ["mrbeast"],
  "hashtags": ["fyp"],
  "searchQueries": ["iphone review"],
  "postUrls": ["https://www.tiktok.com/@user/video/7664432017722952980"],
  "resultsPerPage": 50
}
```

All four are optional and independent. Provide whichever you have and the run collects them together.

#### Add comments and followers

```json
{
  "hashtags": ["airfryer"],
  "resultsPerPage": 25,
  "commentsPerPost": 20,
  "maxRepliesPerComment": 3,
  "maxFollowersPerProfile": 500
}
```

These are the only paid add-ons, and each is capped by the number you set — so the ceiling of a run is arithmetic you can do before you start it.

***

### Input

All four source inputs are optional; provide at least one.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `profiles` | string\[] | (none) | Usernames, `@handles` or profile URLs. Returns the profile and its videos. |
| `hashtags` | string\[] | (none) | Hashtag names without the `#`, or `/tag/` URLs. |
| `searchQueries` | string\[] | (none) | Keywords. Returns matching videos and/or profiles. |
| `postUrls` | string\[] | (none) | Video URLs, `vm.tiktok.com` short links, or bare numeric IDs. |
| `resultsPerPage` | integer | `50` | Videos per profile, hashtag or query. |
| `profileSorting` | string | `latest` | `latest`, `popular`, `oldest`. |
| `searchSection` | string | `all` | `all`, `video`, `user`. |
| `maxProfilesPerQuery` | integer | `10` | Profiles per search query, when the section includes profiles. |
| `includeReposts` | boolean | `false` | Also include videos the profile reposted. |
| `excludePinnedPosts` | boolean | `false` | Drop pinned videos from profile results. |
| `onlyPostsNewerThan` | string | (none) | `YYYY-MM-DD`. Free filter. |
| `onlyPostsOlderThan` | string | (none) | `YYYY-MM-DD`. Free filter. |
| `minLikes` / `maxLikes` | integer | (none) | Free popularity filters. |
| `region` | string | (none) | 2-letter hint (`US`, `GB`, `BR`) for region-aware results. |
| `shouldDownloadVideos` | boolean | `false` | Adds a no-watermark `temporaryDownloadUrl`. Free — it is read from data already in the response. |
| `commentsPerPost` | integer | `0` | 💲 Comments per video. Billed per comment. |
| `maxRepliesPerComment` | integer | `0` | 💲 Replies per comment. Billed per reply. |
| `maxFollowersPerProfile` | integer | `0` | 💲 Followers per profile. Billed per follower. |
| `maxFollowingPerProfile` | integer | `0` | 💲 Accounts each profile follows. Billed per account. |

> ⚠️ **`temporaryDownloadUrl` expires within hours.** It is a TikTok CDN link signed with a short expiry and returns `403` after that. Download the file when you get it; do not store the URL for later.

***

### What data does the TikTok Scraper return?

One row per video or profile. The creator's details ride **free** inside every video's `author` object — they are not an add-on and cost nothing extra, because they are already embedded in the video payload.

| Group | Fields |
|---|---|
| **Video** | `id` · `desc` (caption) · `url` · `createdAt` · `region` · `width` · `height` · `ratio` · `definition` · `bitrate` · `descLanguage` |
| **Flags** | `isAd` · `isPhoto` · `isPaidContent` · `duetControl` · `stitchControl` |
| **Stats** | `stats.plays` · `likes` · `comments` · `shares` · `saves` · `reposts` |
| **Author (free)** | `author.id` · `secUid` · `uniqueId` · `nickname` · `verified` · `verifyReason` · `verificationType` · `signature` (bio) · `stats{followers,following,hearts,videos,favoriting}` · `links{instagram,youtube}` |
| **Context** | `music{id,title,author,isOriginal,duration}` · `hashtags[]` · `mentions[]` |
| **Profile rows add** | `bioLink` · `bioLanguage` · `accountType` · `commerce` · `liveRoomId` · `stats.likesGiven` · `links.twitter` · `links.youtubeTitle` |

`duetControl` and `stitchControl` are TikTok's raw permission integers (`0` = allowed), **not** booleans — a `!== 0` coercion mislabels duet-enabled videos. Videos fetched from a single video URL expose the same author stats but return `null` for `verificationType` and the linked-social handles; that path does not carry them.

#### Example row

```json
{
  "id": "7664432017722952980",
  "desc": "caption text",
  "url": "https://www.tiktok.com/@user/video/7664432017722952980",
  "createdAt": "2026-03-15T14:30:00.000Z",
  "region": "US",
  "width": 576, "height": 1024, "definition": "540p",
  "isAd": false, "isPhoto": false, "descLanguage": "en",
  "duetControl": 0, "stitchControl": 0,
  "stats": { "plays": 120000, "likes": 5400, "comments": 210, "shares": 88, "saves": 45, "reposts": 12 },
  "author": {
    "id": "6614...", "uniqueId": "user", "nickname": "User",
    "verified": true, "verifyReason": "Verified account",
    "signature": "creator bio text",
    "stats": { "followers": 135167363, "following": 354, "hearts": 1397082764, "videos": 457 },
    "links": { "instagram": "user_ig", "youtube": "UCxxxx" }
  },
  "music": { "title": "original sound", "author": "User", "isOriginal": true, "duration": 73 },
  "hashtags": ["fyp", "viral"],
  "mentions": ["MS4wLjAB..."]
}
```

***

### How much does it cost to scrape TikTok?

**$0.003 per result** ($3.00 per 1,000), or **$0.0016** on Apify Gold and above. A result is one video or one profile.

| Results | Free–Silver | Gold+ |
|---|---|---|
| 1,000 | $3.00 | $1.60 |
| 10,000 | $30.00 | $16.00 |

**Add-ons, only when you turn them on:**

| Add-on | Free–Silver | Gold+ |
|---|---|---|
| Comment (and each reply) | $0.0012 | $0.0005 |
| Follower / following | $0.003 | $0.0015 |

**Free:** every filter (date, likes, sorting, region, pinned), the whole `author` block on each video, the `temporaryDownloadUrl`, and **failed lookups**. The filters run before billing, so narrowing a query genuinely costs less.

**Free plan:** 10 results per calendar month, plus 1 comment and 1 follower so you can see the shape of the add-on rows before paying. The counters reset on the 1st.

***

### What do people use the TikTok Scraper for?

- **Influencer discovery**: search a niche, rank the creators by followers and hearts, and shortlist without opening the app.
- **Influencer vetting**: check whether the engagement on a creator's videos matches their follower count before you pay them.
- **Trend monitoring**: watch a hashtag on a schedule with a likes floor, and see what is breaking out.
- **Competitor tracking**: follow a brand's account and measure what actually lands.
- **Ad and creative research**: pull the top-performing videos in a category and study the hooks.
- **Music and sound tracking**: find which videos a sound is spreading through via the `music` object.
- **Comment mining**: layer `commentsPerPost` on a hashtag run to read what an audience actually says.
- **AI agent context**: hand an agent a creator's catalogue with real numbers attached.

***

### TikTok Scraper vs cookie-based tools vs the official TikTok API

| | This TikTok Scraper | Cookie-based scrapers | Official TikTok API |
|---|---|---|---|
| **TikTok account / cookies** | Not needed | Your session cookie required | Developer app + approval |
| **Account / ban risk** | None (no account used) | High (your account can be restricted) | None |
| **Profiles, hashtags, search and single videos** | All four, in one run | Usually one at a time | Research API is academic-gated; Display API covers your own content |
| **Creator stats on every video** | Yes, free | Usually a second lookup | Limited |
| **Comments and followers** | Optional add-ons, priced per row | Varies | Restricted |
| **Pricing** | Pay per result ($0.003, $0.0016 Gold+) | Subscription + your account | Gated / approval-based |

***

### 🏆 Top TikTok Scrapers

### FAQ

#### What is a TikTok scraper?

A TikTok scraper turns a username, hashtag, search keyword or video URL into structured data: the videos, their play/like/comment/share counts, the captions and hashtags, and the creator behind each one. This Actor returns that as JSON rows, without opening the app or logging in.

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

No. There is no login, no session and no cookie, so there is no account-ban risk.

#### Can I use this from ChatGPT or Claude?

Yes, two ways. Paste the "Copy to your AI assistant" block above into any LLM and it will write the call for you. Or connect the **TikTok MCP server** config above, and every Atomus Actor becomes a native tool your assistant can call on its own, including chaining several in one request.

#### Do I pay extra for the creator's follower count?

No. The whole `author` block — followers, following, total hearts, video count, bio, verification and linked socials — is embedded in each video's data and included free. The paid follower add-on is a different thing: it lists the individual accounts that follow a profile.

#### How much does it cost?

$0.003 per video or profile ($0.0016 on Gold and above). Comments are $0.0012 each and followers $0.003 each, and only when you ask for them. Failed lookups are free. Free Apify plans include 10 results, 1 comment and 1 follower per month.

#### Can I download the videos?

`shouldDownloadVideos` adds a no-watermark `temporaryDownloadUrl` to each video, at no charge. It is a signed TikTok CDN link that expires within hours and then returns `403`, so fetch the file immediately rather than storing the URL.

#### Can I filter by date or popularity without paying more?

Yes — `onlyPostsNewerThan`, `onlyPostsOlderThan`, `minLikes`, `maxLikes`, `excludePinnedPosts` and `profileSorting` are all free and are applied before billing.

#### Is there an official TikTok API for this?

TikTok's Research API is restricted to approved academic and non-profit researchers, and the Display API only reaches content you own. Neither covers arbitrary public profile, hashtag or search data.

#### Is it legal to scrape TikTok?

This Actor reads publicly visible content. You are responsible for using the output in line with applicable laws (GDPR/CCPA), TikTok's terms, and your own compliance requirements. It is an independent tool, not affiliated with TikTok.

#### Can I run this on a schedule?

Yes. Apify [Schedules](https://docs.apify.com/platform/schedules) run the Actor on a cron interval and [webhooks](https://docs.apify.com/platform/integrations/webhooks) push each finished run into your systems — which is how a hashtag becomes a trend monitor.

***

### All Atomus scrapers

<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">2.4M+ RESULTS DELIVERED</span>

### Support

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance. TikTok® is a registered trademark of its respective owner. All trademarks are property of their respective owners.

Use the data extracted by this Actor in compliance with applicable data protection laws (GDPR, CCPA) and TikTok's terms of service. Do not use it for spam, harassment, or unlawful purposes.

# Actor input Schema

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

TikTok usernames, @handles, or profile URLs. Returns the profile and (below) its videos.

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

Hashtag names without the #, e.g. "fyp", or /tag/ URLs. Returns videos posted under each hashtag.

## `searchQueries` (type: `array`):

Keywords to search. Returns matching videos and (optionally) profiles.

## `postUrls` (type: `array`):

TikTok video URLs, short share links (vm.tiktok.com/...), or bare numeric IDs. Returns full video detail.

## `resultsPerPage` (type: `integer`):

How many videos to return for each profile, hashtag, or search query.

## `profileSorting` (type: `string`):

Order a profile's videos: newest first, most-liked first, or oldest first.

## `includeReposts` (type: `boolean`):

Also include videos the profile reposted, not just its own posts.

## `excludePinnedPosts` (type: `boolean`):

Drop pinned videos from profile results.

## `searchSection` (type: `string`):

What a search query returns: videos, profiles, or both.

## `maxProfilesPerQuery` (type: `integer`):

How many profiles to return per search query (when the search section includes profiles).

## `onlyPostsNewerThan` (type: `string`):

Keep only videos published on or after this date (YYYY-MM-DD).

## `onlyPostsOlderThan` (type: `string`):

Keep only videos published on or before this date (YYYY-MM-DD).

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

Keep only videos with at least this many likes.

## `maxLikes` (type: `integer`):

Keep only videos with at most this many likes.

## `region` (type: `string`):

Optional 2-letter region hint (e.g. US, GB, BR) passed to TikTok for region-aware results.

## `shouldDownloadVideos` (type: `boolean`):

Adds a no-watermark `temporaryDownloadUrl` to each video. ⚠️ IMPORTANT: it is a TikTok CDN link signed with a short expiry: it stops working (403) after a few HOURS. Download the actual file right away; do NOT store the URL for later. Free: reads a link already in the response, no extra request.

## `commentsPerPost` (type: `integer`):

Also scrape this many comments from every video returned. Billed as comment per comment.

## `maxRepliesPerComment` (type: `integer`):

When scraping comments, also fetch this many replies per comment. Billed as comment per reply.

## `maxFollowersPerProfile` (type: `integer`):

Also scrape this many followers of each profile. Billed as follower per follower returned.

## `maxFollowingPerProfile` (type: `integer`):

Also scrape this many accounts each profile follows. Billed as follower per account returned.

## Actor input object example

```json
{
  "profiles": [
    "mrbeast"
  ],
  "resultsPerPage": 50,
  "profileSorting": "latest",
  "includeReposts": false,
  "excludePinnedPosts": false,
  "searchSection": "all",
  "maxProfilesPerQuery": 10,
  "shouldDownloadVideos": false,
  "commentsPerPost": 0,
  "maxRepliesPerComment": 0,
  "maxFollowersPerProfile": 0,
  "maxFollowingPerProfile": 0
}
```

# Actor output Schema

## `results` (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": [
        "mrbeast"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atomus/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 = { "profiles": ["mrbeast"] }

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

```

## MCP server setup

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