TikTok Creator & Video Scraper
Pricing
from $0.01 / 1,000 results
TikTok Creator & Video Scraper
Scrape public TikTok profiles, profile videos, hashtag videos and sound videos. Real view, like, comment, share and save counts, plus the creator and follower count behind every video. For influencer research, trend research and competitive analysis.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
The Howlers
Maintained by CommunityActor stats
0
Bookmarked
66
Total users
4
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Scrape public TikTok profiles, profile videos, hashtag videos and sound videos. Every video row carries its real view, like, comment, share and save counts, caption, hashtags, sound, and the creator behind it with follower count. Built for influencer research, trend research and competitive analysis. Built by John Rippy (https://johnrippy.link/).
Quick Start
Test with Demo Mode (no task events)
{"demoMode": true,"usernames": ["charlidamelio"]}
Creator profiles with their recent videos
{"demoMode": false,"scrapeType": "profiles","usernames": ["charlidamelio", "khaby.lame"],"includeVideos": true,"videosPerProfile": 12}
Videos on a hashtag
{"demoMode": false,"scrapeType": "hashtags","hashtags": ["fitness", "workout"],"maxResults": 50,"sortBy": "views"}
Videos that use a sound
{"demoMode": false,"scrapeType": "sounds","sounds": ["6715195986316101634"],"maxResults": 30}
No cookies or API keys are needed for profiles, hashtags or sounds.
How it works
The actor opens TikTok's public pages the way a visitor's browser does:
- Camoufox stealth browser. A hardened Firefox with its own realistic fingerprint for each browser session.
- Apify Residential proxies. Each browser session gets its own US residential exit IP, and the fingerprint's time zone and locale match it.
- TikTok's own data. TikTok's web app loads the video lists on these pages itself. The actor reads those responses, so the counts are TikTok's numbers, not estimates.
- Session reuse and pacing. One session serves many pages with short human-like pauses. If TikTok shows a check or loads nothing, the actor retries on a fresh session (new fingerprint, new IP).
- Lean traffic. Video streams, images and fonts are never downloaded, which keeps runs fast and cheap.
- Short lists. TikTok sometimes gives one session a short list for a hashtag (around 10 videos) while other sessions get the full feed. When that happens the actor takes one more look on a fresh session and merges the results. A signed-out visitor sees roughly the top 100 videos of a hashtag, so that is the practical ceiling per hashtag.
Search needs your own TikTok session
TikTok shows search results only to signed-in visitors. To use scrapeType: "search", add cookies from your own TikTok account with sessionCookies (a JSON array exported with the Cookie-Editor extension) or cookieStorageKey. Without cookies, each query returns a status row and charges no task events. For topic research without cookies, use scrapeType: "hashtags".
Input Parameters
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
scrapeType | string | "profiles" | No | profiles, hashtags, sounds or search |
usernames | array | - | No | TikTok usernames (without @) or profile links |
hashtags | array | - | No | Hashtags to scrape videos from (without #) |
sounds | array | - | No | TikTok sound IDs or sound links |
searchQueries | array | - | No | Search terms (needs your own TikTok cookies) |
searchReturnsCreators | boolean | true | No | With search, return the creators behind the matching videos instead of video rows |
includeVideos | boolean | true | No | Read each creator's recent videos and add averages and engagement rate |
videosPerProfile | integer | 12 | No | Recent videos to read per profile |
maxResults | integer | 50 | No | Maximum profiles, hashtags, sounds or queries, and maximum videos per hashtag, sound or query |
minFollowers | integer | 0 | No | Only return profiles with at least this many followers |
minViews | integer | 0 | No | Only return videos with at least this many views |
sortBy | string | "followers" | No | Order of video rows: followers, likes, views, engagement or recent |
proxyConfiguration | object | Residential (US) | No | Leave empty to use Apify Residential proxies |
demoMode | boolean | true | No | Labeled sample data (no task events). Set to false for real scraping |
webhookUrl | string | - | No | URL to POST results to when the run finishes |
sessionCookies | string | - | No | Your own TikTok cookies as a JSON array (only needed for search) |
cookieStorageKey | string | - | No | Load your own cookies from the Cookie Manager's key-value store |
cookieKvStoreName | string | "cookie-sessions" | No | Key-value store that holds the Cookie Manager session |
Output
Video rows (resultType: "video", from hashtags, sounds and search):
id, url, description, createTime, duration, views, likes, comments, shares, saves, engagementRate, hashtags, mentions, soundId, soundName, soundAuthor, thumbnailUrl, isAd, isPhotoPost, isPinned (pinned to the top of the creator's profile), hook analysis (hook, hookWordCount, hasQuestion, hasCTA), the creator (author, authorNickname, authorAvatar, authorSignature, authorVerified, authorFans, authorFollowing, authorHearts, authorVideoCount) and where it was found (sourceType, sourceHashtag with hashtagViews and hashtagVideoCount, or sourceSoundId with soundTitle and soundVideoCount). A video that shows up under more than one of your hashtags or sounds is saved and charged once, under the first one.
Profile rows (resultType: "profile"):
username, nickname, bio, profileUrl, avatarUrl, followers, following, likes, videoCount, verified, privateAccount, avgViews, avgLikes, avgComments, avgShares, engagementRate and recentVideos (same fields as video rows). Averages are null when no videos were read, never a made-up number. Pinned videos stay in recentVideos (marked isPinned: true) but are left out of the averages, because a pinned video is often an old viral hit that would inflate them. A metric TikTok does not show is null, never 0.
Status rows (resultType: "status"): one row for a username, hashtag or sound TikTok does not have (not_found), a hashtag with no videos (no_videos), search without a TikTok session (login_required), or a page TikTok would not load after three fresh sessions (blocked). Status rows carry requestedUsername, hashtag, soundId or query, never a creator username, and are never charged.
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once when the run starts, one event per GB of memory (minimum one). At the default 2 GB of memory a run starts at $0.20 | $0.10 per GB |
| Profile Scraped | Charged for each TikTok creator profile scraped with full metrics | $0.05 |
| Video Scraped | Charged for each TikTok video extracted with engagement data | $0.002 |
| Result | Each item written to the default dataset | $0.00001 |
Profile and video events are charged only for real rows saved to your dataset, once each. Videos inside a profile's recentVideos count as videos, and only videos posted by that creator are kept and charged. If TikTok shows another creator's page in place of the one asked for, the actor retries on a fresh session and, if that keeps happening, saves an unbilled status row instead of the wrong profile. When you ask for videos and TikTok will not load a creator's video list after 3 fresh browser sessions, the profile row is still saved with its stats and a videosStatus note, but it is not charged. Demo mode charges no task events: sample rows are never billed, but every run, a demo run included, still pays the Actor start fee. Status rows and rows removed by your filters are never charged.
Troubleshooting
A hashtag or sound came back as a status row
not_found means TikTok has no such hashtag or sound (sounds can also be removed or limited by region). blocked means TikTok would not load the page after three fresh browser sessions; run it again later. No task events were charged for the row (the Actor start fee still applies).
A profile came back as not_found
Check the spelling of the username. Banned and deleted accounts also return not_found.
recentVideos is empty
Private accounts and accounts with no public videos have none to read. Sometimes TikTok also refuses to load a creator's video list in a run; then the profile is not charged at all, and a second run usually gets the list. The videosStatus field says which case it was. No video events are charged for an empty list.
How do I test without paying for results?
Enable Demo Mode. It returns labeled sample data (demo: true and a _notice field) so you can check the output format, and charges no task events.
Built by John Rippy | Actor Arsenal