TikTok Data Scraper β Video, Hashtag & Sound Performance
Pricing
from $2.99 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
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) andtrendingNowper video, plus real aggregate deltas for hashtags and sounds - π Geographic and temporal fields β
region,hashtagRegionlocalization, ISOpublishedAt(from TikTok's owncreate_time) andscrapedAtstamps - ποΈ 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.
| Field | Example value | Use 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_count | 13686605 | current view count |
data.digg_count | 2579867 | current like count |
data.comment_count | 34525 | current comment count |
data.share_count | 88210 | current share count |
data.download_count | 4210 | current download count |
data.duration | 27 | video 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.playCountDelta | 128400 | view growth since your last tracked run |
data.viewVelocity | 1780.5 | plays gained per hour since the last run |
data.trendingNow | true | honest 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).
| Feature | TikTok Official APIs | This 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 apply | Research API: accredited academic/non-profit researchers, eligible regions only | β anyone with an Apify account |
| Setup | OAuth app registration + redirect URI, or a multi-week research-access application | Fill in the input form and click Start |
| Cross-run growth tracking | Not offered | playCountDelta/viewVelocity/trendingNow built in |
| Output shape | Provider-specific per API | One consistent JSON schema across every category |
| Commercial/marketing use | Research API's terms restrict use to approved research | No 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
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
userUrls | No | array | Profile URLs, @handles, usernames or numeric user IDs | ["https://www.tiktok.com/@taylorswift"] |
categories | No | array | Content to collect per profile: videos, favourite_videos, followers, following, search, user_info (default ["videos"]) | ["videos", "user_info"] |
maxUserResults | No | integer | Max items per profile/category, minimum 1, default 10 | 50 |
scrapeAllUserResults | No | boolean | Ignore the cap and collect everything available (default false) | false |
videoUrlsComments | No | array | Video URLs or IDs to scrape comments from | ["https://www.tiktok.com/@user/video/7300000000000000000"] |
commentsPerUrl | No | integer | Max comments per video, minimum 1, default 10 | 100 |
scrapeAllComments | No | boolean | Collect every available comment per video (default false) | false |
repliesPerComment | No | integer | Max replies per comment, minimum 0 (0 skips replies), default 0 | 5 |
scrapeAllReplies | No | boolean | Collect every available reply per comment (default false) | false |
hashtags | No | array | Hashtag names or URLs | ["dance"] |
videosPerHashtag | No | integer | Max videos per hashtag, minimum 1, default 10 | 50 |
scrapeAllHashtagVideos | No | boolean | Collect every available hashtag video (default false) | false |
hashtagRegion | No | string | Two-letter country code, default "US" (pattern ^[A-Za-z]{2}$) | "GB" |
musicUrls | No | array | Music/sound URLs or IDs | ["7123456789012345678"] |
videosPerMusic | No | integer | Max videos per music track, minimum 1, default 10 | 50 |
scrapeAllMusicVideos | No | boolean | Collect every available video for the sound (default false) | false |
playlistIDs | No | array | Numeric playlist (mix) IDs | ["7100000000000000000"] |
videosPerPlaylist | No | integer | Max videos per playlist, minimum 1, default 10 | 50 |
scrapeAllPlaylistVideos | No | boolean | Collect every available playlist video (default false) | false |
videoDetailsList | No | array | Video IDs or URLs to fetch full detail records for | ["7647758735229635871"] |
trackGrowth | No | boolean | Compute cross-run deltas/velocity, default true | true |
watchlistName | No | string | Groups this run's growth snapshots, default "default" | "campaign-launch-2026" |
resetBaseline | No | boolean | Clear stored snapshots for this watchlist and start fresh, default false | false |
minRequestInterval | No | number | Seconds between requests, min 0, max 10, default 1.2 | 1.2 |
maxRetries | No | integer | Retries per request before giving up, min 0, max 10, default 3 | 3 |
apiKey | No | string | Optional premium key from the data source that lifts its rate limit, default "" | "" |
proxyConfiguration | No | object | Proxy 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?
| Scraper | What it extracts |
|---|---|
| TikTok Shop Data Scraper β Reviews & Sentiment Analysis | TikTok Shop product listings, reviews and sentiment scoring |
| TikTok Trending Creator Insights Scraper | Trending creator profiles with per-video stats |
| Comparable social-platform scrapers | What it extracts |
|---|---|
| X (Twitter) User Profile & Tweets Scraper | Tweets and profile data by user or place |
| Twitter (X) Tweets Scraper by Keyword & Hashtag | Tweets by keyword or hashtag search |
| Threads Search Post Scraper | Threads posts by search term |
| Pinterest Profile Scraper | Pinterest 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 ApifyClientclient = 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.
βοΈ Is it legal to scrape TikTok?
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.