TikTok Creator & Video Scraper avatar

TikTok Creator & Video Scraper

Pricing

from $0.01 / 1,000 results

Go to Apify Store
TikTok Creator & Video Scraper

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

The Howlers

Maintained by Community

Actor stats

0

Bookmarked

66

Total users

4

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

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

ParameterTypeDefaultRequiredDescription
scrapeTypestring"profiles"Noprofiles, hashtags, sounds or search
usernamesarray-NoTikTok usernames (without @) or profile links
hashtagsarray-NoHashtags to scrape videos from (without #)
soundsarray-NoTikTok sound IDs or sound links
searchQueriesarray-NoSearch terms (needs your own TikTok cookies)
searchReturnsCreatorsbooleantrueNoWith search, return the creators behind the matching videos instead of video rows
includeVideosbooleantrueNoRead each creator's recent videos and add averages and engagement rate
videosPerProfileinteger12NoRecent videos to read per profile
maxResultsinteger50NoMaximum profiles, hashtags, sounds or queries, and maximum videos per hashtag, sound or query
minFollowersinteger0NoOnly return profiles with at least this many followers
minViewsinteger0NoOnly return videos with at least this many views
sortBystring"followers"NoOrder of video rows: followers, likes, views, engagement or recent
proxyConfigurationobjectResidential (US)NoLeave empty to use Apify Residential proxies
demoModebooleantrueNoLabeled sample data (no task events). Set to false for real scraping
webhookUrlstring-NoURL to POST results to when the run finishes
sessionCookiesstring-NoYour own TikTok cookies as a JSON array (only needed for search)
cookieStorageKeystring-NoLoad your own cookies from the Cookie Manager's key-value store
cookieKvStoreNamestring"cookie-sessions"NoKey-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:

EventWhen it is chargedPrice
Actor startOnce 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 ScrapedCharged for each TikTok creator profile scraped with full metrics$0.05
Video ScrapedCharged for each TikTok video extracted with engagement data$0.002
ResultEach 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