TikTok Profile, Hashtag, Search, Video & Trending Scraper
Pricing
from $1.80 / 1,000 results
TikTok Profile, Hashtag, Search, Video & Trending Scraper
Scrape TikTok without login. Extract profiles, bios, follower stats and videos; search by hashtag or keyword; scrape individual videos with full engagement stats and comments; or collect posts from the current trending feed.
Pricing
from $1.80 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
4
Monthly active users
4 days ago
Last modified
Categories
Share
Pull structured data from TikTok without logging in. Give it usernames to get profile info plus their videos, hashtags or keywords to get matching videos, direct video links to get full stats plus comments, or run it with no input at all to get the current trending feed. Clean JSON out, four independent modes, one actor.
Why this scraper
- Four modes in one actor: profile, hashtag/keyword search, video plus comments, and trending, so you do not need separate tools for each job.
- Profile mode returns the full public profile (bio, avatar, follower/following/heart/video counts, verified flag) plus a paginated list of that account's videos.
- Search mode accepts a plain keyword or a hashtag (start the term with #) and returns matching videos either way.
- Video mode returns full video stats (plays, likes, comments, shares, saves), music info, hashtags used, duration and cover images, plus paginated comments (text, author, likes, reply count, timestamp).
- Trending mode needs no input at all: run it as-is to pull the current trending feed.
- No video, thumbnail, avatar or music file downloads; this actor returns metadata and cover image URLs only, keeping runs fast and cheap.
- Simple output limit: one "Max results" number per mode (videos for profile/search/trending, comments for video mode); leave it at 0 to walk until the feed itself ends.
Data you get
Sample shape: values are illustrative placeholders, not from a live profile, video or comment.
Profile record
| Field | Example |
|---|---|
| recordType | "profile" |
| uniqueId | "samplecreator" |
| nickname | "Sample Creator" |
| signature | "Sample bio text goes here" |
| avatarUrl | "https://p16-sign-va.tiktokcdn.com/sample-avatar.jpeg" |
| followerCount | 125000 |
| followingCount | 340 |
| heartCount | 2400000 |
| videoCount | 210 |
| verified | false |
| privateAccount | false |
| region | "US" |
| bioLink | "https://example.com" |
| url | "https://www.tiktok.com/@samplecreator" |
| scrapedAt | "2026-01-01T00:00:00.000Z" |
Video record
| Field | Example |
|---|---|
| recordType | "video" |
| id | "7000000000000000000" |
| url | "https://www.tiktok.com/@samplecreator/video/7000000000000000000" |
| desc | "Sample video caption #sample" |
| authorUsername | "samplecreator" |
| authorNickname | "Sample Creator" |
| duration | 18 |
| width | 1080 |
| height | 1920 |
| playCount | 500000 |
| diggCount | 42000 |
| commentCount | 610 |
| shareCount | 1200 |
| collectCount | 3300 |
| musicTitle | "Sample Sound" |
| musicAuthor | "Sample Artist" |
| hashtags | ["sample", "fyp"] |
| coverUrl | "https://p16-sign-va.tiktokcdn.com/sample-cover.jpeg" |
| createTimeIso | "2026-01-01T00:00:00.000Z" |
| sourceMode | "search" |
Comment record
| Field | Example |
|---|---|
| recordType | "comment" |
| commentId | "7100000000000000000" |
| videoId | "7000000000000000000" |
| text | "Sample comment text" |
| authorUsername | "samplecommenter" |
| authorNickname | "Sample Commenter" |
| diggCount | 24 |
| replyCommentTotal | 2 |
| createTimeIso | "2026-01-01T00:00:00.000Z" |
How to use
Profile mode:
{"mode": "profile","usernames": ["samplecreator", "@anothercreator"],"maxItems": 20}
Hashtag or keyword search:
{"mode": "search","queries": ["#fyp", "cooking tutorial"],"maxItems": 20}
Video plus comments:
{"mode": "video","videoUrls": ["https://www.tiktok.com/@samplecreator/video/7000000000000000000"],"fetchComments": true,"maxItems": 20}
Trending feed, no input needed beyond the mode:
{"mode": "trending","maxItems": 20}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | "profile" | profile, search, video or trending |
| usernames | array of strings | [] | Usernames or profile URLs; profile mode only |
| queries | array of strings | [] | Hashtags (start with #) or keywords; search mode only |
| videoUrls | array of strings | [] | Direct video URLs; video mode only |
| fetchComments | boolean | true | Fetch comments for each video; video mode only |
| maxItems | integer | 20 | Videos per username/query/trending run, or comments per video. 0 = unlimited |
| proxy | object | Apify Residential | Proxy configuration |
| mcpConnectors | array | [] | Optional MCP connectors to also send results to (see below) |
| notionParentPageUrl | string | - | Notion parent page id/url, only used with the Notion connector |
| maxNotifyListings | integer | 50 | Cap on items sent to each connector per run |
Output example
{"recordType": "video","sourceMode": "profile","id": "7000000000000000000","url": "https://www.tiktok.com/@samplecreator/video/7000000000000000000","desc": "Sample video caption #sample","createTime": 1700000000,"createTimeIso": "2026-01-01T00:00:00.000Z","authorUsername": "samplecreator","authorNickname": "Sample Creator","authorSecUid": "MS4wSample0000000000000000000000000000000000000000000","duration": 18,"width": 1080,"height": 1920,"playCount": 500000,"diggCount": 42000,"commentCount": 610,"shareCount": 1200,"collectCount": 3300,"musicId": "7000000000000000001","musicTitle": "Sample Sound","musicAuthor": "Sample Artist","hashtags": ["sample", "fyp"],"coverUrl": "https://p16-sign-va.tiktokcdn.com/sample-cover.jpeg","dynamicCoverUrl": "https://p16-sign-va.tiktokcdn.com/sample-dyncover.jpeg","originCoverUrl": "https://p16-sign-va.tiktokcdn.com/sample-origcover.jpeg","region": "US","scrapedAt": "2026-01-01T00:00:00.000Z"}
Send results into your apps (MCP connectors)
Optionally pipe results into the apps you already use through Model Context Protocol connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the input. Notion gets a rich page per item; other connectors get a best-effort write or a digest message. The connector receives a condensed, human-readable summary per item (title plus key fields), not the full JSON; the complete record always stays in the dataset. Leave the field empty to skip this entirely, it never changes the dataset output.
How a run reports its result
An empty dataset is never reported as a plain success, so a scheduled run cannot fail quietly.
- Failed run (the run turns red). No records were collected and at least one target could not be read, or loaded without carrying any usable data. The status message says which of the two happened and how many targets it affected.
- Partial run (the run stays green, with a warning status message). Some records were collected but at least one target was missed, so the dataset is incomplete for that input.
- Empty result (the run stays green). Every target was reached and simply matched nothing, for example a keyword search with no results. The status message says so explicitly.
- Clean run (the run stays green). Every target was reached and returned data.
A target is retried several times before it counts as missed.
Known limitations
- Short share links (vm.tiktok.com, vt.tiktok.com) are not resolved in video mode; paste the full @username/video/id link.
- The trending feed endpoint may change its exact parameters over time; if a run returns 0 trending items, please report it so the mapping can be refreshed.
- Only public profiles, videos and comments are returned. Private accounts and disabled comment sections return no data for that field.