Tiktok Data Scraper
Pricing
$19.99/month + usage
Tiktok Data Scraper
Scrape TikTok data at scale, including videos, captions, hashtags, stats, sounds, and user profiles. Perfect for trend analysis, influencer research, marketing insights, and dataset creation. Fast, accurate, and ideal for automated TikTok intelligence.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Data Scraper β Videos, Profiles, Comments & Hashtags
TikTok Data Scraper collects public TikTok profiles, videos, comments and replies, hashtag video feeds, music-track video feeds, playlist videos and single-video details, and returns every item as structured JSON. Each record carries play counts, likes, comments, shares and follower counts exactly as TikTok shows them publicly β no HTML parsing on your end. Give it a username, a video link, a hashtag or a sound, and start pulling TikTok data in minutes.
What is TikTok Data Scraper?
TikTok Data Scraper is an Apify Actor that extracts public TikTok data β profile info, videos, favourites, following, comments and replies, hashtag videos, music videos, playlist videos and full single-video details β and returns it as typed, consistent JSON. It does not require a TikTok account, login, or cookies; you supply usernames, URLs, hashtags, music links or playlist IDs, and it returns whatever TikTok already shows a logged-out visitor. It's built for social-media marketers, competitor and trend researchers, and developers feeding TikTok data into dashboards, LLMs or RAG pipelines.
What TikTok data is publicly available to scrape?
Anyone can view a TikTok profile, its videos, and a video's comments without logging in or creating an account β TikTok's own web app serves this to logged-out visitors.
| Data Category | Publicly Available | Restricted (needs TikTok login) |
|---|---|---|
| Profile info (bio, avatar, verified badge, follower/following/heart/video counts) | Yes | |
| Public videos (title, stats, cover images, HD no-watermark link) | Yes | |
| Video comments and comment text | Yes | |
| Comment replies | Yes | |
| Hashtag video feed | Yes | |
| Music/sound video feed | Yes | |
| Playlist (mix) videos | Yes | |
| Full follower and following username lists | Yes β gated behind login on tiktok.com itself | |
| Private-account content and direct messages | Yes β gated behind login and a follow relationship |
TikTok Data Scraper only returns publicly visible data β what any visitor sees. Nothing behind a login wall.
What data can I extract with TikTok Data Scraper?
TikTok Data Scraper returns four record shapes β video, user profile, comment/reply, and follower/following β each wrapped in the same envelope: section, category, input, user, userType, data.
π¬ Video identity and descriptive fields
| Field Name | Description |
|---|---|
video_id / aweme_id | Numeric TikTok video ID (the canonical ID always lives in video_id) |
title | Video title, if TikTok returns one |
content_desc | Video caption/description text |
region | Region code the video was posted from |
cover / origin_cover / ai_dynamic_cover | Cover image URLs (static, original, animated) |
music / music_info | Sound metadata used on the video (title, author) |
author | Nested author object (unique_id, nickname, etc.) |
videoUrl | Canonical tiktok.com/@handle/video/<id> link, built locally |
profileUrl | Canonical tiktok.com/@handle link for the video's author |
hashtagUrl / musicUrl | Added only on hashtag- and music-sourced records |
π Engagement, metrics and timestamp fields
| Field Name | Description |
|---|---|
play_count | View count |
digg_count | Like count |
comment_count | Comment count |
share_count | Share count |
download_count | Download count |
collect_count | Save/bookmark count |
duration | Video length in seconds |
create_time | Raw TikTok publish epoch |
publishedAt | ISO-8601 UTC timestamp derived from create_time |
scrapedAt | ISO-8601 UTC timestamp of when this Actor collected the record |
is_ad / is_top | Boolean flags TikTok attaches to the item |
play / wmplay / hdplay | Direct MP4 links (watermarked, watermarked-alt, HD no-watermark) |
π€ Profile, comment and follower fields
| Field Name | Description |
|---|---|
data.id / data.unique_id / data.nickname | User ID, handle and display name |
data.avatar | Avatar image URL |
data.user.signature | Profile bio text |
data.user.bioLink.link | Bio link URL, if set |
data.user.ins_id / data.user.twitter_id / data.user.youtube_channel_id | Linked social handles, if the profile has them |
data.stats.followerCount / data.stats.followingCount / data.stats.heartCount / data.stats.videoCount | Profile-level counts |
data.text | Comment or reply text |
data.reply_total | Number of replies to a comment |
data.reply_to_comment_id | Parent comment ID, present only on reply records |
data.user.verified / data.user.follower_count | Commenter's verified flag and follower count |
π€ Add-on: Need additional TikTok data?
Looking for TikTok Shop product listings instead of organic content? Pair this Actor with TikTok Shop Data Scraper. Tracking creators rather than individual posts? TikTok Trending Creator Insights Scraper covers trending-creator performance. Both sit in the same Scraper-Engine catalogue and slot straight into the same dataset-export workflow.
How does TikTok Data Scraper differ from TikTok's official APIs?
TikTok's own Display API only returns content for the account that authorized your app via OAuth β it cannot fetch a third party's public profile or videos. TikTok's Research API can read public content more broadly, but access is restricted to approved academic and public-interest applicants, commercial use is not permitted, and β as documented by third-party API trackers checked 2026-08-04 β it is capped at roughly 1,000 requests per day, with the Display API separately capped around 600 requests per minute per endpoint (source, checked 2026-08-04).
| Feature | TikTok Official APIs | TikTok Data Scraper |
|---|---|---|
| Data scope | Display API: only your own authorized account; Research API: broader but access-gated | Any public profile, video, hashtag, sound or playlist by URL/ID |
| Approval process | OAuth app review, or a verified academic/institutional application | None β configure input and run |
| Commercial use | Research API commercial use is not permitted | Yes |
| Login required | Yes β OAuth from the content owner | No β public data only |
| Rate limit | ~600 req/min (Display), ~1,000 req/day (Research), as observed above | Configurable via minRequestInterval and maxRetries; not tied to a developer-app quota |
| Setup time | App review plus OAuth integration | Fill in the input form and start the run |
Use TikTok's official APIs when you manage the account and need to publish content or read your own authorized analytics. Use TikTok Data Scraper when you need public data from other creators, hashtags, sounds or playlists without an approval process.
How to use TikTok Data Scraper
Run it from the Apify Store β no separate signup or API key is required to start (the optional apiKey field only raises this Actor's own internal rate limit, it is not a TikTok credential).
- Open TikTok Data Scraper on its Apify Store page and click Try for free (or Run, if you already have it saved).
- Fill in at least one input array β
userUrls,videoUrlsComments,hashtags,musicUrls,playlistIDsorvideoDetailsListβ with the profiles, videos, hashtags, sounds or playlists you want. - For profiles, pick which
categoriesto collect (videos, favourite videos, following, search, user info) and setmaxUserResultsor enablescrapeAllUserResults. - Click Start and watch the run log for live progress per input.
- Download results as JSON, CSV, Excel or any other Apify-supported export format once the run finishes, or stream them via the API while the run is still going.
How to scale to bulk TikTok data extraction
Every input field β userUrls, videoUrlsComments, hashtags, musicUrls, playlistIDs, videoDetailsList β is an array, so one run can process many profiles, videos, hashtags, sounds or playlists at once instead of one run per item. There is no separate "bulk mode" toggle; you simply add more entries to the relevant array. Note that the Actor processes queued inputs one at a time within a run (concurrency is serialized in the current build), so a very large batch takes proportionally longer β plan run time accordingly rather than assuming parallel throughput.
What can you do with TikTok data?
- π Growth marketers tracking a competitor's account use
data.stats.followerCountanddata.stats.videoCountfromuser_inforuns to chart follower growth over time. - π― Social listening teams monitoring a hashtag use
play_countanddigg_countfromhashtagsrecords to spot which videos on a trending tag are actually gaining traction. - π¬ Researchers studying comment sentiment use
data.textanddata.reply_totalfromcommentsrecords to build a labeled dataset of real audience reactions. - π΅ Music and label teams tracking a sound's spread use
videosPerMusicoutput'sauthor.unique_idandplay_countto see which creators are driving a track's reach. - π€ AI engineers feed
content_desc,titleanddata.user.signaturetext fields into a RAG index or an LLM agent as grounded, up-to-date TikTok context instead of stale training data.
How does TikTok Data Scraper handle rate limits and blocking?
Every request is spaced by minRequestInterval (default 1.2s) through an internal rate limiter, and failed or blocked requests are retried up to maxRetries times (default 3) with backoff. By default the Actor runs on a direct connection with no proxy; if that connection gets blocked it automatically escalates to an Apify datacenter proxy, and if that is also blocked, to a residential proxy β once residential engages, the Actor sticks with it for the rest of the run and retries a few more times on individual failures with a fresh residential exit IP. You can also force proxyConfiguration yourself.
If the primary data source hits a persistent Cloudflare challenge on the user-videos route specifically, the Actor automatically falls back to a slower headless-browser route against tiktok.com itself before giving up on that input; records collected this way are marked with _source: "tiktok_direct" in data so you can filter them if needed. If a category is blocked on both routes, or an input can't be resolved, that specific input is skipped with a warning in the run log β 0 items are saved for it, other queued inputs are unaffected, and no partial or error row is written to the dataset.
One known, persistent limitation: the followers category currently returns 0 results, because the underlying public data source has that endpoint unavailable. This is disclosed live in the run log β it is not a silent failure on your input. following is not affected.
β¬οΈ Input
TikTok Data Scraper accepts every parameter below. Every field is optional β fill in only the section(s) you need, and leave the rest empty.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
userUrls | No | Array of String | One or more profiles. Examples: https://www.tiktok.com/@taylorswift, taylorswift, @taylorswift, 107955 | ["https://www.tiktok.com/@taylorswift"] |
categories | No | Array of String (enum: videos, favourite_videos, followers, following, search, user_info) | Pick which kinds of content to collect for each profile above. Multiple selections are supported. Note: 'Followers' currently returns 0 results due to a known limitation of the underlying public data source (the endpoint is unavailable) β this is disclosed live in the run log, never silently empty. 'Following' is unaffected. Default: ["videos"] | ["videos", "user_info"] |
maxUserResults | No | Integer (minimum 1) | Maximum items to fetch per profile / section. Ignored when 'Scrape all results' is enabled. Default: 10 | 25 |
scrapeAllUserResults | No | Boolean | Ignore the limit above and collect everything available for each profile. Default: false | false |
videoUrlsComments | No | Array of String | TikTok video URLs or IDs to scrape comments from. | ["https://www.tiktok.com/@taylorswift/video/7123456789012345678"] |
commentsPerUrl | No | Integer (minimum 1) | Maximum comments per video. Ignored when 'Scrape all comments' is on. Default: 10 | 50 |
scrapeAllComments | No | Boolean | Collect every available comment per video (slower, more usage). Default: false | false |
repliesPerComment | No | Integer (minimum 0) | Maximum replies per comment. Set to 0 to skip replies entirely. Ignored when 'Scrape all replies' is on. Default: 0 | 5 |
scrapeAllReplies | No | Boolean | Collect every available reply for each comment (slower, more usage). Default: false | false |
hashtags | No | Array of String | TikTok hashtag names or URLs to scrape videos from. | ["dance"] |
videosPerHashtag | No | Integer (minimum 1) | Maximum videos per hashtag. Ignored when 'Scrape all hashtag videos' is on. Default: 10 | 20 |
scrapeAllHashtagVideos | No | Boolean | Collect every available video for each hashtag (slower, more usage). Default: false | false |
hashtagRegion | No | String (pattern: two letters) | Two-letter country code used for localization (e.g. US, GB, IN). Default: "US" | "US" |
musicUrls | No | Array of String | TikTok music URLs or IDs to scrape videos from. | [] |
videosPerMusic | No | Integer (minimum 1) | Maximum videos per music track. Ignored when 'Scrape all music videos' is on. Default: 10 | 10 |
scrapeAllMusicVideos | No | Boolean | Collect every available video for each music track (slower, more usage). Default: false | false |
playlistIDs | No | Array of String | TikTok playlist IDs to scrape videos from. | [] |
videosPerPlaylist | No | Integer (minimum 1) | Maximum videos per playlist. Ignored when 'Scrape all playlist videos' is on. Default: 10 | 10 |
scrapeAllPlaylistVideos | No | Boolean | Collect every available video for each playlist (slower, more usage). Default: false | false |
videoDetailsList | No | Array of String | TikTok video IDs or URLs to retrieve full details for. | [] |
minRequestInterval | No | Number (minimum 0, maximum 10) | Seconds to wait between consecutive requests. Lower is faster but more likely to be rate-limited. Default: 1.2 | 1.2 |
maxRetries | No | Integer (minimum 0, maximum 10) | How many times to retry a failed/blocked request before giving up. Default: 3 | 3 |
apiKey | No | String | Optional key that lifts the rate limit for faster collection. Leave empty for the free tier. Default: "" | "" |
proxyConfiguration | No | Object | By default the scraper runs WITHOUT a proxy. If TikTok blocks the direct connection, it automatically escalates: datacenter proxy, then residential proxy, then sticks with residential. You can also force a proxy here. Default: {"useApifyProxy": false} | {"useApifyProxy": false} |
Note: several fields' descriptions above mention "Minimum 40" as inherited schema copy; the actual enforced JSON Schema minimum on those fields is 1 β any positive integer is accepted and honored exactly as entered.
Example input
{"userUrls": ["https://www.tiktok.com/@taylorswift"],"categories": ["videos", "user_info"],"maxUserResults": 25,"scrapeAllUserResults": false,"videoUrlsComments": ["https://www.tiktok.com/@taylorswift/video/7123456789012345678"],"commentsPerUrl": 50,"scrapeAllComments": false,"repliesPerComment": 5,"scrapeAllReplies": false,"hashtags": ["dance"],"videosPerHashtag": 20,"scrapeAllHashtagVideos": false,"hashtagRegion": "US","musicUrls": [],"videosPerMusic": 10,"scrapeAllMusicVideos": false,"playlistIDs": [],"videosPerPlaylist": 10,"scrapeAllPlaylistVideos": false,"videoDetailsList": [],"minRequestInterval": 1.2,"maxRetries": 3,"apiKey": "","proxyConfiguration": { "useApifyProxy": false }}
β¬οΈ Output
Every result is typed, normalized JSON with a consistent envelope shape across runs, pushed to the Actor's dataset live as it's collected β a crash mid-run still keeps whatever was saved so far. Export the dataset as JSON, CSV, Excel, XML, RSS or HTML directly from the Apify Console or via the API.
Each pushed record is charged once under the row_result pay-per-event. Only successfully collected records are pushed and charged β failed or skipped inputs are logged to the run console, never written to the dataset, so you are never charged for them.
Example output
A video record (section: "users", category: "videos"):
{"section": "users","category": "videos","input": "https://www.tiktok.com/@taylorswift","user": "taylorswift","userType": "unique_id","data": {"aweme_id": "7123456789012345678","video_id": "7123456789012345678","region": "US","title": "","content_desc": "getting ready for the show tonight π€","cover": "https://p16-sign.tiktokcdn-us.com/cover1.jpeg","ai_dynamic_cover": "https://p16-sign.tiktokcdn-us.com/dyncover1.jpeg","origin_cover": "https://p16-sign.tiktokcdn-us.com/origcover1.jpeg","duration": 27,"play": "https://v16.tiktokcdn-us.com/play1.mp4","wmplay": "https://v16.tiktokcdn-us.com/wmplay1.mp4","hdplay": null,"size": 3245621,"wm_size": 3401004,"hd_size": null,"music": "https://sf16.tiktokcdn.com/music1.mp3","music_info": { "title": "original sound", "author": "taylorswift" },"play_count": 18234092,"digg_count": 2145092,"comment_count": 38221,"share_count": 91042,"download_count": 12034,"collect_count": 154022,"create_time": 1737033600,"is_ad": false,"is_top": 0,"author": {"unique_id": "taylorswift","nickname": "Taylor Swift","avatar": "https://p16-sign.tiktokcdn-us.com/avatar1.jpeg"},"publishedAt": "2025-01-16T12:00:00Z","scrapedAt": "2026-08-04T09:12:41Z","videoUrl": "https://www.tiktok.com/@taylorswift/video/7123456789012345678","profileUrl": "https://www.tiktok.com/@taylorswift"}}
A comment record (section: "videos", category: "comments"):
{"section": "videos","category": "comments","input": "https://www.tiktok.com/@taylorswift/video/7123456789012345678","user": "7123456789012345678","userType": "video_id","data": {"id": "7123456790000000001","text": "this is the best one yet","digg_count": 4021,"reply_total": 12,"publishedAt": "2025-01-16T13:04:22Z","user": {"nickname": "swiftie4life","unique_id": "swiftie4life","signature": "team taylor since 2008","region": "US","verified": false,"follower_count": 812},"videoUrl": "https://www.tiktok.com/@taylorswift/video/7123456789012345678","scrapedAt": "2026-08-04T09:13:05Z"}}
A profile record (section: "users", category: "user_info"):
{"section": "users","category": "user_info","input": "https://www.tiktok.com/@taylorswift","user": "taylorswift","userType": "unique_id","data": {"id": "107955","unique_id": "taylorswift","nickname": "Taylor Swift","avatar": "https://p16-sign.tiktokcdn-us.com/avatar-full1.jpeg","user": {"signature": "π€ new music out now","bioLink": { "link": "taylorswift.com" },"ins_id": "taylorswift","twitter_id": "taylorswift13","youtube_channel_id": null},"stats": {"followerCount": 9021345,"followingCount": 12,"heartCount": 512034221,"videoCount": 231},"profileUrl": "https://www.tiktok.com/@taylorswift","scrapedAt": "2026-08-04T09:12:10Z"}}
How does it work?
TikTok Data Scraper reads the same public endpoints TikTok's own web and mobile apps use to render a profile, video, hashtag or sound page β no TikTok login, no cookies. Requests go out through a rate limiter (spaced by minRequestInterval) and, if blocked, escalate automatically through an Apify datacenter proxy and then a residential proxy; a specific persistent block on the user-videos route falls back to a real headless browser hitting tiktok.com directly. Only what TikTok already serves to a logged-out visitor is returned β nothing behind a login wall. The output envelope (section, category, input, user, userType, data) stays the same shape run after run, so a change to TikTok's own page layout does not change your downstream schema.
Integrations
TikTok Data Scraper runs on the Apify platform, so it works with anything that can call the Apify API or use the apify-client SDK.
Calling TikTok Data Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"userUrls": ["https://www.tiktok.com/@taylorswift"],"categories": ["videos"],"maxUserResults": 25,}run = client.actor("tiktok-data-scraper").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["data"].get("title"), item["data"].get("play_count"))
Works in Go, Ruby, Node.js, cURL β any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, use the HTTP Request node (or the Apify community node) pointed at this Actor's run endpoint with your Apify token, then parse the returned dataset items downstream. In Make, the Apify app's "Run an Actor and get dataset items" module does the same in one step. In LangChain or any agent framework, wrap the same Apify API call as a custom Tool so an agent can request fresh TikTok data mid-conversation instead of relying on stale training data.
Is it legal to scrape TikTok profiles, videos and comments?
Scraping publicly available data β data anyone can see without logging in β is generally lawful, but the personal data mixed into TikTok profiles and comments (usernames, bios, follower counts, linked social handles, commenter identities) brings data-protection law into play. TikTok Data Scraper only returns publicly available data β nothing behind a login wall. If your use case stores or processes this personal data at scale, GDPR (in the EU/UK) and CCPA (in California) may require a documented lawful basis, a defined retention period, and a way to honor deletion requests. Scraping also remains subject to TikTok's own Terms of Service, which govern your use of the platform independently of data-protection law. Consult legal counsel if your use case involves bulk storage of personal data.
Frequently asked questions
What TikTok fields does TikTok Data Scraper return?
The top fields are play_count, digg_count, comment_count, data.stats.followerCount and content_desc, alongside dozens more depending on category β see What data can I extract above for the full breakdown.
Does TikTok Data Scraper require a TikTok account or login?
No. The Actor reads only public TikTok data and needs no TikTok credentials. The optional apiKey input field is this Actor's own premium key for lifting its internal rate limit β it is unrelated to your TikTok account.
How many TikTok videos, comments or profiles can I extract in one run?
There is no fixed cap in the Actor itself β set an exact number per category (maxUserResults, commentsPerUrl, videosPerHashtag, etc.) or enable the matching "scrape all" toggle to collect everything available. The real ceiling is however much content TikTok itself has for that profile, video, hashtag, sound or playlist.
What happens if a profile is private, deleted, or has no content?
The Actor logs a warning and skips that specific input β no record is pushed for it, and it is not charged. Other profiles, videos, hashtags, music or playlists queued in the same run are processed normally and unaffected.
Can I scrape multiple TikTok profiles, videos, hashtags, sounds or playlists at once?
Yes β userUrls, videoUrlsComments, hashtags, musicUrls, playlistIDs and videoDetailsList are all arrays, so a single run can queue any number of each. Note that queued inputs are currently processed one at a time rather than in parallel, so very large batches take proportionally longer.
Does TikTok Data Scraper work with Claude, ChatGPT and other AI agent tools?
It is not exposed through an MCP server, but it is callable as a standard HTTP endpoint through the Apify API or the apify-client SDK, so any agent framework that can make an HTTP call β including custom LangChain tools or Claude/ChatGPT function-calling setups β can trigger a run and read back the dataset.
What's the difference between the free tier and the Premium data key?
Leaving apiKey empty runs on the free tier's default pacing (minRequestInterval of 1.2 seconds between requests). Supplying a premium key lifts that internal rate limit for faster collection; the schema does not publish an exact multiplier.
Does TikTok Data Scraper return data in a format LLMs can use directly?
Yes. Every record is typed, normalized JSON with consistent field names across runs β no HTML, no CSS selectors. Pass it straight to an LLM prompt, index it into a vector store, or hand it to an agent tool.
What happens when TikTok changes its layout or anti-bot system?
The Actor is maintained and its output schema is designed to stay stable across TikTok changes. It already includes an automatic proxy-escalation ladder and a direct-browser fallback specifically to survive one class of upstream block. No specific update turnaround time is published.
Can I use TikTok Data Scraper without managing proxies or browser infrastructure?
Yes. By default it runs with no proxy at all, and automatically escalates to Apify datacenter and then residential proxies only if TikTok blocks the direct connection; a headless-browser fallback for the video-listing route is also built in and runs automatically. You never have to configure any of this yourself, though proxyConfiguration lets you override it.
Which TikTok fields work best for AI training data and RAG indexing?
For RAG, index the high-information text fields: content_desc and title on videos, data.user.signature on profiles, and data.text on comments. For structured training features, use the consistently-typed numeric fields: play_count, digg_count, comment_count, share_count and data.stats.followerCount. All fields return as typed primitives (strings, integers, booleans), not embedded HTML.
Related scrapers
| Scraper | What it extracts |
|---|---|
| TikTok Shop Data Scraper | TikTok Shop product listings, prices and seller data |
| TikTok Trending Creator Insights Scraper | Trending TikTok creators and their performance insights |
| YouTube Video Scraper by Hashtag (Related Tag Expansion) | YouTube videos discovered via hashtag and related-tag expansion |
| YouTube Most Replayed Scraper | YouTube video "most replayed" heatmap and engagement data |
| YouTube Channel Scraper | YouTube channel profile and video metadata |
Your feedback
Found a bug, or need a TikTok field this Actor doesn't return yet? Open an issue from the Actor's Issues tab on its Apify Store page, or message the developer through Apify Console β reports like these directly shape what ships in the next update.