TikTok Data Scraper β€” Video, Hashtag & Sound Performance avatar

TikTok Data Scraper β€” Video, Hashtag & Sound Performance

Pricing

from $2.99 / 1,000 results

Go to Apify Store
TikTok Data Scraper β€” Video, Hashtag & Sound Performance

TikTok Data Scraper β€” Video, Hashtag & Sound Performance

🎬 TikTok Data Scraper extracts high-value insights from TikTokβ€”captions, hashtags, engagement stats, creators & trends. πŸš€ Perfect for market research, influencer discovery, and content strategy. ⚑ Fast, reliable, and automation-friendly.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

TikTok Data Scraper β€” Video, Hashtag & Sound Performance

TikTok Data Scraper β€” Video, Hashtag & Sound Performance pulls public TikTok videos, hashtag feeds, sound/music feeds, playlists, profiles, comments and replies, then diffs each run against your last one to compute real playCountDelta, diggCountDelta, commentCountDelta, viewVelocity and an honestly-derived trendingNow flag. Every record ships as structured JSON with play_count, digg_count, comment_count, an HD no-watermark link and a canonical deep-link URL. Social media managers, marketing agencies and trend researchers use it to watch one specific video, hashtag or sound gain β€” or lose β€” traction over multiple runs instead of capturing a single static snapshot. Point it at any public username, hashtag, sound or playlist and start tracking.


πŸ“± What is TikTok Data Scraper β€” Video, Hashtag & Sound Performance?

It's a TikTok data scraper that collects public content across six starting points β€” profiles, videos, hashtags, sounds, playlists and single video IDs β€” and layers cross-run growth analytics on top of the same content. No TikTok account, login, cookies or app review is required: every category reads data TikTok already serves to a logged-out visitor.

Key features:

  • πŸ”Ž Discovery by profile, hashtag, sound, playlist or direct video ID β€” accepts full URLs, @handles, plain usernames, numeric user IDs, hashtag names or numeric music/playlist IDs
  • πŸ“Ή Core identifying fields β€” video_id, title/content_desc, author.unique_id/author.nickname, duration, and an HD no-watermark download link (hdplay)
  • πŸ“ˆ Cross-run performance data β€” playCountDelta, diggCountDelta, commentCountDelta, viewVelocity (plays/hour since your last run) and trendingNow per video, plus real aggregate deltas for hashtags and sounds
  • 🌍 Geographic and temporal fields β€” region, hashtagRegion localization, ISO publishedAt (from TikTok's own create_time) and scrapedAt stamps
  • 🎚️ Real filters β€” per-category content-type selection, per-source result caps or unlimited "scrape all", replies on/off, named watchlists, and a baseline-reset toggle
  • πŸ“€ Export formats β€” standard Apify dataset exports (JSON, CSV, Excel, HTML table, RSS) from the Output tab, no extra conversion step

πŸ“Š What data can I extract with TikTok Data Scraper?

The Actor returns one JSON row per video, comment, reply, follower/following entry, profile lookup or growth summary β€” every row shares a common envelope plus a category-specific data object.

FieldExample valueUse case
section"hashtags"which collector produced the row (users / hashtags / music / playlists / videos / search)
category"videos"the record type within that section
data.video_id"7647758735229635871"unique video ID for joins and de-duplication
data.title / data.content_desc"POV: when the beat drops"caption text for content analysis
data.author.unique_id"creator"link a video back to the posting account
data.author.nickname"Creator"display name for reporting
data.play_count13686605current view count
data.digg_count2579867current like count
data.comment_count34525current comment count
data.share_count88210current share count
data.download_count4210current download count
data.duration27video length in seconds
data.hdplay"https://.../hd-nowm.mp4"direct HD, no-watermark download link
data.music_info.title"original sound"the sound used on the video
data.playCountDelta128400view growth since your last tracked run
data.viewVelocity1780.5plays gained per hour since the last run
data.trendingNowtruehonest flag β€” only true when plays genuinely grew
publishedAt"2026-07-15T09:12:44Z"when the video was posted, from TikTok's own timestamp
scrapedAt"2026-08-01T14:05:11Z"when this row was collected
videoUrl"https://www.tiktok.com/@creator/video/7647758735229635871"canonical deep link back to the video

πŸ“ˆ Performance & growth data

Every video record carries playCountDelta, diggCountDelta, commentCountDelta, growthDeltaAvailable, viewVelocity and trendingNow, diffed against a snapshot from your previous run under the same watchlistName. Tracked hashtags additionally emit one hashtag_growth summary row per hashtag with the hashtag's own real aggregate counters β€” view_count/user_count and their deltas hashtagViewCountDelta/hashtagUserCountDelta β€” never borrowed from a video's metric names. Tracked sounds emit one music_growth row with video_count and musicVideoCountDelta. On the first run for any entity these delta and velocity fields are null/false, not a faked zero, because there is nothing to compare against yet; run again later with the same watchlist name to get real numbers.

🎯 Targeting & scope data

categories picks which content types to pull per profile (videos, favourite_videos, followers, following, search, user_info); hashtagRegion (a two-letter code) localizes hashtag feeds; watchlistName scopes a tracking group so unrelated trackers sharing the Actor don't collide; resetBaseline clears a watchlist's stored snapshots and starts fresh. Each content source has its own result cap (maxUserResults, commentsPerUrl, videosPerHashtag, videosPerMusic, videosPerPlaylist) or a matching "scrape all" boolean, and repliesPerComment controls whether β€” and how many β€” nested replies come back per comment.


πŸ” How does this differ from TikTok's official API?

TikTok does publish official APIs, but neither is built for pulling public data about accounts, hashtags or sounds you don't control. The Display API only returns data for the single user who has logged in through Login Kit's OAuth flow β€” it cannot fetch another account's videos, a hashtag feed or a sound's usage β€” and the Research API is free but gated to accredited non-profit academic researchers in eligible regions (initially the US, Europe and Brazil) who pass a manual application with roughly a four-week review, per TikTok's own developer documentation (checked 2026-08-04).

FeatureTikTok Official APIsThis Actor
Access to arbitrary public accounts/hashtags/sounds❌ Display API is scoped to the logged-in user onlyβœ… any public profile, hashtag, sound or playlist
Who can even applyResearch API: accredited academic/non-profit researchers, eligible regions onlyβœ… anyone with an Apify account
SetupOAuth app registration + redirect URI, or a multi-week research-access applicationFill in the input form and click Start
Cross-run growth trackingNot offeredplayCountDelta/viewVelocity/trendingNow built in
Output shapeProvider-specific per APIOne consistent JSON schema across every category
Commercial/marketing useResearch API's terms restrict use to approved researchNo such restriction on the data returned

🚧 Why can't I just use TikTok's own API for arbitrary accounts?

Because neither official surface is designed for it. The Display API's whole model is OAuth consent β€” it hands back data for the person who just logged into your app, never a third party's profile, hashtag or sound. The Research API does reach public content, but access is restricted to vetted academic institutions in a limited set of regions and requires a documented research proposal and ethics review before TikTok grants a token β€” not a fit for a marketer who just needs this week's hashtag numbers. This Actor covers that gap by reading the same public pages a logged-out visitor sees, for any username, hashtag, sound or playlist, with no application process.

Use TikTok's official APIs when you're building a consumer app your own users log into, or when you qualify as an approved academic researcher needing TikTok's research-grade data license. Use this Actor when you need structured data about public videos, hashtags, sounds or profiles you don't control, on your own schedule.


πŸ’Ό How to use data extracted from TikTok

πŸ“± Social media & marketing teams

Track a campaign hashtag or a branded sound across every run: set hashtags: ["yourcampaign"] or musicUrls: ["<sound id>"], keep trackGrowth on and reuse the same watchlistName on every run. Each pass returns fresh hashtagViewCountDelta/musicVideoCountDelta on the summary row and per-video playCountDelta/viewVelocity on every clip using the tag or sound, so a weekly schedule turns into a real growth chart instead of a single count.

🏒 Agencies monitoring client accounts

Agencies running the same watchlist across several client profiles or competitor accounts get one dataset per run with userUrls set to each handle and categories: ["videos"]. Because data.author.unique_id, play_count, digg_count and playCountDelta all come back on every row, a single export lets you rank multiple clients or competitors by growth in one sheet, without opening TikTok manually for each one.

πŸ”¬ Market research and trend intelligence

Researchers spotting emerging sounds or hashtags before they peak use trendingNow and viewVelocity on hashtag_growth/music_growth rows and on individual videos: query a shortlist of candidate hashtags or sounds on a recurring schedule and filter for trendingNow: true plus a rising viewVelocity to flag genuinely accelerating content rather than content that is simply large.

πŸ€– AI agents and automated pipelines

Because every field is typed JSON with a stable envelope (section, category, data), agent frameworks can call this Actor as a tool to answer questions like "is this hashtag still trending" or "how did this video perform since Monday" by diffing playCountDelta/trendingNow across two dataset runs, without writing a TikTok parser of their own.


⬇️ Input sample

ParameterRequiredTypeDescriptionExample value
userUrlsNoarrayProfile URLs, @handles, usernames or numeric user IDs["https://www.tiktok.com/@taylorswift"]
categoriesNoarrayContent to collect per profile: videos, favourite_videos, followers, following, search, user_info (default ["videos"])["videos", "user_info"]
maxUserResultsNointegerMax items per profile/category, minimum 1, default 1050
scrapeAllUserResultsNobooleanIgnore the cap and collect everything available (default false)false
videoUrlsCommentsNoarrayVideo URLs or IDs to scrape comments from["https://www.tiktok.com/@user/video/7300000000000000000"]
commentsPerUrlNointegerMax comments per video, minimum 1, default 10100
scrapeAllCommentsNobooleanCollect every available comment per video (default false)false
repliesPerCommentNointegerMax replies per comment, minimum 0 (0 skips replies), default 05
scrapeAllRepliesNobooleanCollect every available reply per comment (default false)false
hashtagsNoarrayHashtag names or URLs["dance"]
videosPerHashtagNointegerMax videos per hashtag, minimum 1, default 1050
scrapeAllHashtagVideosNobooleanCollect every available hashtag video (default false)false
hashtagRegionNostringTwo-letter country code, default "US" (pattern ^[A-Za-z]{2}$)"GB"
musicUrlsNoarrayMusic/sound URLs or IDs["7123456789012345678"]
videosPerMusicNointegerMax videos per music track, minimum 1, default 1050
scrapeAllMusicVideosNobooleanCollect every available video for the sound (default false)false
playlistIDsNoarrayNumeric playlist (mix) IDs["7100000000000000000"]
videosPerPlaylistNointegerMax videos per playlist, minimum 1, default 1050
scrapeAllPlaylistVideosNobooleanCollect every available playlist video (default false)false
videoDetailsListNoarrayVideo IDs or URLs to fetch full detail records for["7647758735229635871"]
trackGrowthNobooleanCompute cross-run deltas/velocity, default truetrue
watchlistNameNostringGroups this run's growth snapshots, default "default""campaign-launch-2026"
resetBaselineNobooleanClear stored snapshots for this watchlist and start fresh, default falsefalse
minRequestIntervalNonumberSeconds between requests, min 0, max 10, default 1.21.2
maxRetriesNointegerRetries per request before giving up, min 0, max 10, default 33
apiKeyNostringOptional premium key from the data source that lifts its rate limit, default """"
proxyConfigurationNoobjectProxy settings, default {"useApifyProxy": false} (direct connection, auto-escalates on block){"useApifyProxy": false}
{
"hashtags": ["dance"],
"videosPerHashtag": 50,
"hashtagRegion": "US",
"trackGrowth": true,
"watchlistName": "dance-campaign-2026",
"minRequestInterval": 1.2,
"maxRetries": 3,
"proxyConfiguration": { "useApifyProxy": false }
}

Common pitfall: the schema enforces minimum: 1 on the per-source caps (maxUserResults, commentsPerUrl, videosPerHashtag, videosPerMusic, videosPerPlaylist), but each field's own description text says "Minimum 40" β€” that text is not enforced in the current build. Passing 10 genuinely returns up to 10 items; passing 0 or a negative number falls back to 10 rather than erroring. Also note hashtagRegion must match a strict two-letter pattern (US, not USA) or the run fails validation before it starts.


⬆️ Output sample

Results are typed, normalized JSON pushed live to the dataset as soon as each item is collected β€” a run that stops partway through still keeps everything already saved. Export from the Output tab as JSON, CSV, Excel, HTML table or RSS.

{
"section": "hashtags",
"category": "videos",
"input": "dance",
"user": "dance",
"userType": "hashtag",
"publishedAt": "2026-07-15T09:12:44Z",
"scrapedAt": "2026-08-01T14:05:11Z",
"hashtagUrl": "https://www.tiktok.com/hashtag/dance",
"videoUrl": "https://www.tiktok.com/@creator/video/7647758735229635871",
"profileUrl": "https://www.tiktok.com/@creator",
"data": {
"video_id": "7647758735229635871",
"title": "POV: when the beat drops",
"region": "US",
"duration": 27,
"play_count": 13686605,
"digg_count": 2579867,
"comment_count": 34525,
"share_count": 88210,
"download_count": 4210,
"collect_count": 51200,
"create_time": 1752570764,
"hdplay": "https://tiktokcdn.example/hd-nowm.mp4",
"music_info": { "title": "original sound", "author": "creator" },
"author": { "unique_id": "creator", "nickname": "Creator" },
"playCountDelta": 128400,
"diggCountDelta": 5100,
"commentCountDelta": 220,
"growthDeltaAvailable": true,
"previousRunAt": "2026-07-25T09:00:02Z",
"viewVelocity": 1780.5,
"trendingNow": true
}
}

A tracked hashtag also emits one hashtag_growth summary row (hashtag_id, hashtag_name, view_count, user_count, hashtagViewCountDelta, hashtagUserCountDelta), and a tracked sound emits one music_growth row (music_id, title, author, video_count, musicVideoCountDelta) β€” both null/false on their first run, honestly, until a second run gives them something to diff against.


🎯 How do you filter and target specific videos, hashtags and sounds?

Category vs. exact reference. For profiles, categories is a fixed select β€” videos, favourite_videos, followers, following, search, user_info β€” while search inside that list takes a free-text query. Hashtags, sounds and playlists are looked up by exact name or numeric ID, not fuzzy search, so hashtags: ["dance"] matches the hashtag page exactly rather than anything containing "dance".

Scope precision. hashtagRegion narrows a hashtag feed to a specific two-letter market. watchlistName scopes an entire tracking group so you can run several independent trackers β€” one per campaign, client or sound β€” from the same Actor without their growth snapshots colliding. resetBaseline intentionally throws away a watchlist's stored counts and restarts it from this run.

The closest thing to a quality threshold is repliesPerComment: leave it at 0 to pull comments without their reply noise, or raise it (or set scrapeAllReplies) once you actually need the thread.

Volume controls. Every content source has its own numeric cap (maxUserResults, commentsPerUrl, videosPerHashtag, videosPerMusic, videosPerPlaylist) or a matching scrapeAll* boolean for unlimited collection; pagination against TikTok's own cursors is handled internally, so you never pass a page number yourself.

{ "hashtags": ["dance"], "videosPerHashtag": 50, "hashtagRegion": "GB", "trackGrowth": true, "watchlistName": "uk-dance-tracker" }
{ "musicUrls": ["7123456789012345678"], "scrapeAllMusicVideos": true, "trackGrowth": true, "watchlistName": "sound-audit" }
{ "videoUrlsComments": ["https://www.tiktok.com/@creator/video/7647758735229635871"], "commentsPerUrl": 200, "repliesPerComment": 5 }

▢️ Want to try other TikTok scrapers?

ScraperWhat it extracts
TikTok Shop Data Scraper β€” Reviews & Sentiment AnalysisTikTok Shop product listings, reviews and sentiment scoring
TikTok Trending Creator Insights ScraperTrending creator profiles with per-video stats
Comparable social-platform scrapersWhat it extracts
X (Twitter) User Profile & Tweets ScraperTweets and profile data by user or place
Twitter (X) Tweets Scraper by Keyword & HashtagTweets by keyword or hashtag search
Threads Search Post ScraperThreads posts by search term
Pinterest Profile ScraperPinterest profile data with email/website contacts

πŸ”Œ How to extract TikTok data programmatically

Every run is a standard Apify Actor call β€” start it with your API token, poll the run, then read the dataset back as JSON. No separate signup or API key for TikTok itself is required.

🐍 Python example

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("<ACTOR_ID>").call(run_input={
"hashtags": ["dance"],
"videosPerHashtag": 50,
"hashtagRegion": "US",
"trackGrowth": True,
"watchlistName": "dance-campaign-2026",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
data = item.get("data", {})
print(data.get("video_id"), data.get("play_count"), data.get("playCountDelta"))

πŸ“€ Export to spreadsheets or CRM

From the Output tab, export directly to CSV or Excel and map data.author.unique_id, data.play_count, data.playCountDelta and videoUrl to your usual creator/performance columns β€” no reshaping needed since every video row already shares the same flat data structure.


Scraping publicly accessible TikTok pages β€” videos, hashtag feeds, sound feeds, profiles and public comments β€” that require no login is generally lawful in most jurisdictions, and courts have repeatedly held that public web data is not protected merely by being online. That said, the records this Actor returns include personal data β€” usernames, nicknames, bios, follower counts and commenters' regions and verification status β€” so GDPR (if you or the data subjects are in the EU/UK) and CCPA (for California residents) can apply to how you store and use it, separately from whether the initial collection itself was lawful. You are responsible for having a lawful basis for any storage or downstream use of personal data, and for complying with TikTok's own Terms of Service for your use case. Consult legal counsel for commercial applications involving bulk storage of personal data.


❓ FAQ

Does this Actor tell me when a video's data is out of date?

Yes β€” every row carries a scrapedAt timestamp showing exactly when it was collected, and growthDeltaAvailable/previousRunAt tell you whether a comparison baseline exists yet for that video, hashtag or sound.

Can I get hashtag and sound performance data along with video records?

Yes. A tracked hashtag emits its own hashtag_growth summary row (view_count, user_count and their deltas) alongside every individual video row from that hashtag, and a tracked sound emits a matching music_growth row (video_count and its delta).

How accurate are the play/like/comment counts?

The Actor returns counts exactly as TikTok reports them at request time. Accuracy after that depends on how quickly the underlying video's stats change; re-run periodically with the same watchlistName if you need a validated trend rather than a single point-in-time count.

How many records can I get per run?

There is no Actor-side hard cap when a scrapeAll* toggle is on β€” collection continues until TikTok's own feed for that source is exhausted. Without it, the relevant numeric field (maxUserResults, commentsPerUrl, videosPerHashtag, videosPerMusic, videosPerPlaylist) sets the limit, defaulting to 10. Every queued profile/hashtag/sound/playlist/video is currently processed one at a time rather than in parallel, so a run with many inputs takes proportionally longer.

How does watchlist targeting work?

watchlistName groups this run's growth snapshots under one label. Reuse the exact same name across runs of the same video, hashtag or sound to get real deltas from the second run onward; give a different watchlist to a separate tracking effort so the two never mix their baselines.

Why did my run return zero followers?

The upstream data source currently disables the followers endpoint entirely and returns an explicit "unavailable" response for it. The Actor detects that signal, logs the honest reason, and returns 0 rows for followers rather than pretending it worked β€” this is a known upstream limitation, not an error in your input.

Does this Actor work with Claude, ChatGPT and AI agent frameworks?

There is no dedicated MCP server for this Actor. It is callable as a standard Apify Actor run from any agent framework capable of making an HTTP request or using the apify-client SDK, so an agent can trigger a run and read the resulting dataset like any other tool call.

Can I use this without a TikTok API key or developer account?

Yes. No TikTok login, cookies, developer account or OAuth app is required. The optional apiKey input is a premium key from the underlying data provider that lifts its own rate limit for faster collection β€” leave it empty and the Actor runs on the free tier.


βœ… Conclusion

TikTok Data Scraper β€” Video, Hashtag & Sound Performance turns TikTok's public videos, hashtags, sounds, playlists, profiles and comments into structured JSON, then adds what a single scrape can't give you: real cross-run deltas, view velocity and a trending flag for anything you choose to track. It's built for social teams, agencies and researchers who need to watch specific content move over time rather than capture one snapshot. Add a username, hashtag, sound or playlist to the input, give your tracking scope a watchlistName, and run it again next week to see what actually changed.