Tiktok Data Scraper avatar

Tiktok Data Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Tiktok Data Scraper

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

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

0

Monthly active users

a day ago

Last modified

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 CategoryPublicly AvailableRestricted (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 textYes
Comment repliesYes
Hashtag video feedYes
Music/sound video feedYes
Playlist (mix) videosYes
Full follower and following username listsYes β€” gated behind login on tiktok.com itself
Private-account content and direct messagesYes β€” 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 NameDescription
video_id / aweme_idNumeric TikTok video ID (the canonical ID always lives in video_id)
titleVideo title, if TikTok returns one
content_descVideo caption/description text
regionRegion code the video was posted from
cover / origin_cover / ai_dynamic_coverCover image URLs (static, original, animated)
music / music_infoSound metadata used on the video (title, author)
authorNested author object (unique_id, nickname, etc.)
videoUrlCanonical tiktok.com/@handle/video/<id> link, built locally
profileUrlCanonical tiktok.com/@handle link for the video's author
hashtagUrl / musicUrlAdded only on hashtag- and music-sourced records

πŸ“Š Engagement, metrics and timestamp fields

Field NameDescription
play_countView count
digg_countLike count
comment_countComment count
share_countShare count
download_countDownload count
collect_countSave/bookmark count
durationVideo length in seconds
create_timeRaw TikTok publish epoch
publishedAtISO-8601 UTC timestamp derived from create_time
scrapedAtISO-8601 UTC timestamp of when this Actor collected the record
is_ad / is_topBoolean flags TikTok attaches to the item
play / wmplay / hdplayDirect MP4 links (watermarked, watermarked-alt, HD no-watermark)

πŸ‘€ Profile, comment and follower fields

Field NameDescription
data.id / data.unique_id / data.nicknameUser ID, handle and display name
data.avatarAvatar image URL
data.user.signatureProfile bio text
data.user.bioLink.linkBio link URL, if set
data.user.ins_id / data.user.twitter_id / data.user.youtube_channel_idLinked social handles, if the profile has them
data.stats.followerCount / data.stats.followingCount / data.stats.heartCount / data.stats.videoCountProfile-level counts
data.textComment or reply text
data.reply_totalNumber of replies to a comment
data.reply_to_comment_idParent comment ID, present only on reply records
data.user.verified / data.user.follower_countCommenter'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).

FeatureTikTok Official APIsTikTok Data Scraper
Data scopeDisplay API: only your own authorized account; Research API: broader but access-gatedAny public profile, video, hashtag, sound or playlist by URL/ID
Approval processOAuth app review, or a verified academic/institutional applicationNone β€” configure input and run
Commercial useResearch API commercial use is not permittedYes
Login requiredYes β€” OAuth from the content ownerNo β€” public data only
Rate limit~600 req/min (Display), ~1,000 req/day (Research), as observed aboveConfigurable via minRequestInterval and maxRetries; not tied to a developer-app quota
Setup timeApp review plus OAuth integrationFill 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).

  1. Open TikTok Data Scraper on its Apify Store page and click Try for free (or Run, if you already have it saved).
  2. Fill in at least one input array β€” userUrls, videoUrlsComments, hashtags, musicUrls, playlistIDs or videoDetailsList β€” with the profiles, videos, hashtags, sounds or playlists you want.
  3. For profiles, pick which categories to collect (videos, favourite videos, following, search, user info) and set maxUserResults or enable scrapeAllUserResults.
  4. Click Start and watch the run log for live progress per input.
  5. 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.followerCount and data.stats.videoCount from user_info runs to chart follower growth over time.
  • 🎯 Social listening teams monitoring a hashtag use play_count and digg_count from hashtags records to spot which videos on a trending tag are actually gaining traction.
  • πŸ”¬ Researchers studying comment sentiment use data.text and data.reply_total from comments records to build a labeled dataset of real audience reactions.
  • 🎡 Music and label teams tracking a sound's spread use videosPerMusic output's author.unique_id and play_count to see which creators are driving a track's reach.
  • πŸ€– AI engineers feed content_desc, title and data.user.signature text 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.

ParameterRequiredTypeDescriptionExample Value
userUrlsNoArray of StringOne or more profiles. Examples: https://www.tiktok.com/@taylorswift, taylorswift, @taylorswift, 107955["https://www.tiktok.com/@taylorswift"]
categoriesNoArray 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"]
maxUserResultsNoInteger (minimum 1)Maximum items to fetch per profile / section. Ignored when 'Scrape all results' is enabled. Default: 1025
scrapeAllUserResultsNoBooleanIgnore the limit above and collect everything available for each profile. Default: falsefalse
videoUrlsCommentsNoArray of StringTikTok video URLs or IDs to scrape comments from.["https://www.tiktok.com/@taylorswift/video/7123456789012345678"]
commentsPerUrlNoInteger (minimum 1)Maximum comments per video. Ignored when 'Scrape all comments' is on. Default: 1050
scrapeAllCommentsNoBooleanCollect every available comment per video (slower, more usage). Default: falsefalse
repliesPerCommentNoInteger (minimum 0)Maximum replies per comment. Set to 0 to skip replies entirely. Ignored when 'Scrape all replies' is on. Default: 05
scrapeAllRepliesNoBooleanCollect every available reply for each comment (slower, more usage). Default: falsefalse
hashtagsNoArray of StringTikTok hashtag names or URLs to scrape videos from.["dance"]
videosPerHashtagNoInteger (minimum 1)Maximum videos per hashtag. Ignored when 'Scrape all hashtag videos' is on. Default: 1020
scrapeAllHashtagVideosNoBooleanCollect every available video for each hashtag (slower, more usage). Default: falsefalse
hashtagRegionNoString (pattern: two letters)Two-letter country code used for localization (e.g. US, GB, IN). Default: "US""US"
musicUrlsNoArray of StringTikTok music URLs or IDs to scrape videos from.[]
videosPerMusicNoInteger (minimum 1)Maximum videos per music track. Ignored when 'Scrape all music videos' is on. Default: 1010
scrapeAllMusicVideosNoBooleanCollect every available video for each music track (slower, more usage). Default: falsefalse
playlistIDsNoArray of StringTikTok playlist IDs to scrape videos from.[]
videosPerPlaylistNoInteger (minimum 1)Maximum videos per playlist. Ignored when 'Scrape all playlist videos' is on. Default: 1010
scrapeAllPlaylistVideosNoBooleanCollect every available video for each playlist (slower, more usage). Default: falsefalse
videoDetailsListNoArray of StringTikTok video IDs or URLs to retrieve full details for.[]
minRequestIntervalNoNumber (minimum 0, maximum 10)Seconds to wait between consecutive requests. Lower is faster but more likely to be rate-limited. Default: 1.21.2
maxRetriesNoInteger (minimum 0, maximum 10)How many times to retry a failed/blocked request before giving up. Default: 33
apiKeyNoStringOptional key that lifts the rate limit for faster collection. Leave empty for the free tier. Default: """"
proxyConfigurationNoObjectBy 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 ApifyClient
client = 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.

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.

ScraperWhat it extracts
TikTok Shop Data ScraperTikTok Shop product listings, prices and seller data
TikTok Trending Creator Insights ScraperTrending 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 ScraperYouTube video "most replayed" heatmap and engagement data
YouTube Channel ScraperYouTube 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.