# TikTok Scraper $2/1000: Profiles, Videos, Search, Comments (`scrapeunblocker/tiktok-scraper`) Actor

Scrape public TikTok creators, videos, hashtags, keyword search results and comments as JSON: exact follower, like and video counts, videos with plays, likes, comments, shares and saves, music, subtitles, transcripts and download URLs. No login. Powered by ScrapeUnblocker.

- **URL**: https://apify.com/scrapeunblocker/tiktok-scraper.md
- **Developed by:** [Scrapeunblocker](https://apify.com/scrapeunblocker) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.

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

Scrape public **TikTok creators, videos, hashtags, search results and comments** as clean, structured JSON - exact follower, like and video counts, every video's plays, likes, comments, shares, saves and reposts, hashtags, mentions, music, subtitles and download URLs, and hashtag totals with the top videos under them. No TikTok account, login or cookies.

Powered by [ScrapeUnblocker](https://scrapeunblocker.com)'s anti-bot bypass - no proxies or CAPTCHA setup.

### What you get

**Creator profile** (one `type: "profile"` item per handle) with:

- **Exact counts**: followers, following, total likes, videos, friends - TikTok publishes each number twice (rounded for display, exact underneath) and you get the exact one
- **Handle, display name, bio and bio link**, avatar (three sizes), user id and secUid
- **Verified**, private, organization, seller / commerce flags, account creation date, language
- Privacy settings (who can comment, duet, stitch, download)

**Video / photo post** (one `type: "video"` or `"photo"` item each - from a direct URL, a creator's newest videos, or a hashtag's top videos) with:

- **Exact engagement**: plays, likes, comments, shares, saves, reposts
- **Caption**, hashtags, @mentions, language, publish date (ISO + timestamp)
- **Author snapshot** with follower / like / video counts
- **Media**: duration, resolution, size, codec, cover images, play URL, watermark-free download URL, every quality variant, subtitle tracks (language, format, URL)
- **Photo posts**: title and every image URL
- **Music**: title, artist, original-sound flag, play URL, duration
- Content **labels** (TikTok's topic categories), effects, sticker texts, location
- **Flags**: ad, AI-generated, duet / stitch / share enabled, comments enabled

**Keyword search** (one video item per result, `source: "search"`, `sourceQuery`) - the videos TikTok ranks for your keywords, region selectable, each in the full video shape.

**Comments** (one `type: "comment"` item each, `source: "comments"`) with text, date, likes, reply count, language, author (username, nickname, id, avatar), `isCreator`, `likedByCreator`, the replies TikTok preloads, and the post's `totalComments`.

**Hashtag** (one `type: "hashtag"` item per tag) with:

- **Total views** and **total videos** under the hashtag, the hashtag id and URL
- Its **videos** (up to 200), each with the full video shape above

Every item carries `source` (`profile` / `url` / `hashtag`) and `sourceInput` (what you typed), and videos from a creator or hashtag carry `sourceProfile` / `sourceHashtag`, so one dataset can mix all three inputs and still filter cleanly.

### Features

- **Five inputs in one run** - creator handles, post URLs, hashtags, search keywords and posts-for-comments, in any combination, deduplicated by video id.
- **Deep lists** - up to 200 videos per creator or hashtag, 200 results per search and 500 comments per post, read from the real page in a browser session (TikTok's list XHRs are signed, so no plain fetch can get them).
- **Exact numbers** - not the rounded "1.6M" TikTok shows, the real 1,593,675.
- **Full video shape everywhere** - videos listed under a creator or hashtag are read from their own page too, so they carry the same engagement, music and media fields as a direct URL (`video_details`).
- **Photo posts and short links** - `/photo/` posts, bare ids and `vm.tiktok.com` links all resolve.
- **Clear errors** - deleted, private or region-locked posts and missing / banned / private accounts come back as an `error` item with TikTok's reason instead of a silent skip.
- **No login** - only public data, no cookies, no account risk.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `profiles` | string\[] | - | Handles or profile URLs (`nasa`, `@nasa`, `https://www.tiktok.com/@nasa`). |
| `max_videos_per_profile` | integer | 10 | Newest videos per creator (0-200; 0 = profile record only; >10 scrolls the real grid in a browser session). |
| `video_urls` | string\[] | - | Post URLs, `/photo/` URLs, bare video ids or `vm.tiktok.com` short links. |
| `hashtags` | string\[] | - | Hashtag names or URLs (`nasa`, `#nasa`, `https://www.tiktok.com/tag/nasa`). |
| `max_videos_per_hashtag` | integer | 10 | Videos per hashtag (0-200; 0 = totals only; >10 scrolls the real grid). |
| `search_queries` | string\[] | - | Keywords to search videos for; results in TikTok's ranking (region via `proxy_country`). |
| `max_results_per_query` | integer | 20 | Videos per search query (1-200). |
| `comment_urls` | string\[] | - | Posts (URLs, ids, short links) to collect comments from. |
| `max_comments_per_post` | integer | 50 | Top-level comments per post (1-500). |
| `video_details` | boolean | true | Read each listed video's own page for exact engagement, music and media URLs. Off = id, caption, cover, author and play count only. |
| `include_summary_records` | boolean | true | Push one `profile` / `hashtag` summary item alongside the video items. |
| `proxy_country` | string | - | Exit-IP country (ISO-2). Only needed for region-restricted posts. |

At least one of `profiles`, `video_urls`, `hashtags`, `search_queries` or `comment_urls` is required.

### Example output (one video item)

```json
{
  "type": "video",
  "id": "7665075736742530317",
  "url": "https://www.tiktok.com/@nasa/video/7665075736742530317",
  "description": "Something big just landed on TikTok.",
  "hashtags": [],
  "mentions": [],
  "language": "en",
  "createdAt": "2026-07-21T20:09:02+00:00",
  "createdTimestamp": 1784664542,
  "stats": { "plays": 1200000, "likes": 84400, "comments": 2528, "shares": 2944, "saves": 6302, "reposts": 0 },
  "author": {
    "username": "nasa", "nickname": "NASA", "userId": "7664638705177150477", "verified": true,
    "profileUrl": "https://www.tiktok.com/@nasa",
    "stats": { "followers": 1593675, "following": 23, "likes": 8063306, "videos": 41 }
  },
  "video": {
    "duration": 25, "width": 720, "height": 1280, "format": "mp4", "codec": "h264", "bitrate": 1066942, "size": 3356735,
    "cover": "https://p16-common-sign.tiktokcdn-eu.com/...jpeg",
    "playUrl": "https://v16-webapp-prime.tiktok.com/video/tos/...",
    "downloadUrl": "https://v16-webapp-prime.tiktok.com/video/tos/...",
    "qualities": [ { "name": "normal_720_0", "bitrate": 1066942, "width": 720, "height": 1280, "url": "https://..." } ],
    "subtitles": [ { "language": "eng-US", "format": "webvtt", "source": "ASR", "url": "https://..." } ]
  },
  "music": { "id": "7665075815390645006", "title": "original sound", "author": "NASA", "original": true, "duration": 25, "playUrl": "https://..." },
  "flags": { "isAd": false, "isAigc": false, "duetEnabled": true, "stitchEnabled": true, "shareEnabled": true, "commentsEnabled": true },
  "labels": ["Space", "Science & Education", "Aerospace & Astronomy"],
  "locationCreated": "US",
  "source": "profile",
  "sourceInput": "nasa",
  "sourceProfile": "nasa"
}
```

Media URLs are signed by TikTok and expire after a few hours - download what you need in the same run.

### Use cases

- **Influencer discovery and vetting** - exact follower counts, engagement per video and posting cadence across a list of handles, in one run.
- **Campaign and hashtag tracking** - total views and videos under a tag over time, and which creators and sounds are winning it right now.
- **Engagement monitoring** - plays, likes, comments, shares and saves for your own or a competitor's posts, on a schedule.
- **Content and trend analysis** - captions, hashtags, sounds, topic labels and subtitle tracks for research, dashboards or LLM pipelines.
- **Video archiving** - watermark-free download URLs and every quality variant for the posts you have the rights to keep.

### Pricing

$2 per 1,000 results (profiles, videos, hashtags and comments each count as one result) - cheaper than comparable TikTok scrapers, with no proxy or CAPTCHA costs on top.

***

Built on [ScrapeUnblocker](https://scrapeunblocker.com) - the same five endpoints are available directly as `/social/tiktok-profile`, `/social/tiktok-video`, `/social/tiktok-hashtag`, `/social/tiktok-search` and `/social/tiktok-comments` at [developers.scrapeunblocker.com](https://developers.scrapeunblocker.com).

# Actor input Schema

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

TikTok handles or profile URLs to scrape - 'nasa', '@nasa' or 'https://www.tiktok.com/@nasa'. Each returns the creator's profile (exact follower, following, like and video counts, bio, link, verified and commerce flags) and its newest videos.

## `max_videos_per_profile` (type: `integer`):

How many of each creator's newest videos to collect (0-200). 0 = profile record only. Up to 10 come from TikTok's server-rendered widget in seconds; more opens the profile in a browser session and scrolls the real grid (about 35 a batch, 10-30 s per creator).

## `video_urls` (type: `array`):

Direct TikTok post URLs - 'https://www.tiktok.com/@nasa/video/7665075736742530317', photo posts ('/photo/'), bare video ids, or vm.tiktok.com short links. Each returns one full post: exact plays, likes, comments, shares, saves, reposts, hashtags, mentions, author with stats, music, play / download / per-quality URLs, subtitles, images for photo posts, labels and flags.

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

Hashtag names or URLs - 'nasa', '#nasa' or 'https://www.tiktok.com/tag/nasa'. Each returns the hashtag's total views and video count plus its top videos.

## `max_videos_per_hashtag` (type: `integer`):

How many of each hashtag's videos to collect (0-200). 0 = totals only. Up to 10 top videos come from TikTok's widget in seconds; more scrolls the real hashtag grid in a browser session (about 30 a batch, 10-30 s per hashtag).

## `search_queries` (type: `array`):

Keywords to search TikTok videos for - e.g. 'space telescope'. Each returns the videos TikTok ranks for the query (set Proxy country for a region's ranking), every one in the full video shape. Runs in a browser session, 10-30 s per query.

## `max_results_per_query` (type: `integer`):

How many videos to collect per search query (1-200).

## `comment_urls` (type: `array`):

Video / photo post URLs, ids or short links whose comments you want. Each returns the post's comments with text, date, likes, reply count, author (username, nickname, avatar), creator flags and the replies TikTok preloads. Runs in a browser session, 10-30 s per post.

## `max_comments_per_post` (type: `integer`):

How many top-level comments to collect per post (1-500).

## `video_details` (type: `boolean`):

For videos found under a profile or hashtag, read each video's own page so it carries exact plays, likes, comments, shares, saves, hashtags, music, media URLs, subtitles and timestamps (the same shape as a direct video URL). Off = only id, caption, cover, author and play count, one fetch fewer per video.

## `include_summary_records` (type: `boolean`):

Push one summary item per creator (type 'profile') and per hashtag (type 'hashtag') alongside the video items. Off = only video items.

## `proxy_country` (type: `string`):

Exit-IP country (ISO-2, e.g. 'US'). Leave blank to let ScrapeUnblocker choose - TikTok's public pages are the same worldwide; set it only for region-restricted posts.

## Actor input object example

```json
{
  "profiles": [
    "nasa"
  ],
  "max_videos_per_profile": 10,
  "max_videos_per_hashtag": 10,
  "max_results_per_query": 20,
  "max_comments_per_post": 50,
  "video_details": true,
  "include_summary_records": true
}
```

# Actor output Schema

## `items` (type: `string`):

Collected profiles, videos and hashtags

# 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("scrapeunblocker/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": ["nasa"] }

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

```

## MCP server setup

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