Pricing
from $1.80 / 1,000 video results
Tiktok Video Scraper
Under maintenanceExtract TikTok video metadata including caption, hashtags, mentions, views, likes, comments, shares, saves, author info, music data, and video details. Includes analytics like engagement rate and viral score. Ideal for marketing research, influencer analysis, and AI datasets.
Pricing
from $1.80 / 1,000 video results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
22
Total users
5
Monthly active users
2 hours ago
Last modified
Categories
Share
Extract comprehensive TikTok video metadata β 70+ structured fields including engagement metrics, author profiles, music data, video technical specs, and computed engagement rates + viral scoring you won't find elsewhere. Optionally download videos, covers, and avatars to permanent storage, generate text transcripts, and export comments and followers. Supports video URLs, IDs, creator profiles, hashtags, and search keywords. Export analytics-ready datasets in JSON, CSV, or Excel.
Key Features
- 70+ Structured Fields: Video metadata, rich author profile (incl. commerce/creator-marketplace fields), music info, technical specs, engagement rates, and viral scoring
- Computed Analytics (unique): Engagement rate, like rate, comment rate, share rate, save rate, and a weighted viral score β pre-calculated per video, so you don't have to
- Multiple Input Sources: Scrape by video URL, video ID, username, hashtag, or search keyword
- Media Downloads: Optionally download the MP4, cover, avatar, music art, and slideshow images β re-hosted permanently on Apify (raw TikTok CDN URLs expire within days)
- Transcripts & Subtitles: Extract native caption tracks and generate a plain-text transcript
- Comments: Scrape threaded comments (with replies) into a separate dataset
- Followers / Following: Export a profile's connections into a separate dataset
- Powerful Filtering: By date range, like count, pinned status; sort by latest/popular/oldest; related-video discovery
- 6 Dataset Views: Overview, Engagement, Authors, Music, Video Details, Downloads & Media
- Transparent Errors: Failed targets produce dataset items with codes (
PROFILE_PRIVATE,POST_NOT_FOUND_OR_PRIVATE,BLOCKED) instead of vanishing - Pay-Per-Result: Only pay for results you get β no wasted compute
Best for: Marketing agencies, social analytics platforms, AI dataset builders, ecommerce brands, and content strategists
At a Glance
| Feature | Value |
|---|---|
| Output Fields | 70+ structured fields per video |
| Dataset Views | 6 tabs (Overview, Engagement, Authors, Music, Video Details, Downloads & Media) |
| Input Sources | URLs, IDs, usernames, hashtags, search keywords |
| Extras | Video/media download, transcripts, comments, followers/following |
| Proxy Required | Recommended (residential) β TikTok blocks datacenter IPs |
| Concurrency | 5 parallel requests |
| Computed Metrics | Engagement rate, like rate, comment rate, share rate, save rate, viral score |
Downloads, Transcripts, Comments & Followers
All of these are off by default β enable only what you need.
| Capability | Input(s) | Where it lands |
|---|---|---|
| Download video (MP4) | shouldDownloadVideos | downloadAddr / mediaUrls (permanent Apify URLs) |
| Download covers / avatars / music art / slideshow | shouldDownloadCovers, shouldDownloadAvatars, shouldDownloadMusicCovers, shouldDownloadSlideshowImages | the matching field is replaced with a permanent URL (original kept under *Original) |
| Transcript / subtitles | downloadSubtitlesOptions = subtitles | transcript | subtitleLinks, transcriptionLink (plain-text) |
| Comments (+ replies) | commentsPerPost, topLevelCommentsPerPost, maxRepliesPerComment | a separate comments dataset, linked via commentsDatasetUrl |
| Followers / Following | maxFollowersPerProfile, maxFollowingPerProfile | a separate followers dataset |
| Filtering & sorting | oldestPostDate, newestPostDate, mostDiggs, leastDiggs, excludePinnedPosts, profileSorting | applied before results are saved |
| Related videos | scrapeRelatedVideos, maxRelatedVideos | TikTok's recommended videos are scraped (up to N per input video) |
Why permanent media? Raw TikTok CDN URLs are signed with an
x-expirestoken and stop working within days. When a download toggle is on, this actor fetches the asset and re-hosts it on Apify storage so your dataset never rots.
Reliability note: Comments, followers/following, and media downloads rely on TikTok APIs that are heavily rate-limited for datacenter IPs. For dependable results, run behind a residential proxy (see Proxy policy). Failed targets are reported as error items, not silently dropped.
How It Works
- Provide Sources β Enter video URLs, IDs, usernames, hashtags, or search keywords
- Crawl TikTok β Puppeteer navigates to each page and extracts embedded data
- Parse Metadata β Extracts from server-side rendered data and internal APIs
- Compute Analytics β Calculates engagement rates and viral scoring
- Export Dataset β Download as JSON, CSV, or Excel via Apify platform
Output
Table View
π TikTok Video Scraper β Output Overview Table View
Overview JSON View
{"videoId":"7615954999562095890","videoUrl":"https://www.tiktok.com/@ai.rabbit.hime/video/7615954999562095890","caption":"\ud83d\udda4. #foryoupage #viral #trending #explore #tiktok ","textLanguage":"un","hashtags":["foryoupage","viral","trending","explore","tiktok"],"mentions":[],"createTimeISO":"2026-03-11T11:15:10.000Z","duration":14,"views":987,"likes":303,"comments":0,"shares":6,"collectCount":44,"authorUsername":"ai.rabbit.hime","authorVerified":false,"region":null,"engagementRate":0.357649,"viralScore":41.44,"inputSource":"search","inputQuery":"trending"}
Engagement JSON View
{"videoId":"7615954999562095890","caption":"\ud83d\udda4. #foryoupage #viral #trending #explore #tiktok ","authorUsername":"ai.rabbit.hime","views":987,"likes":303,"comments":0,"shares":6,"collectCount":44,"repostCount":0,"engagementRate":0.357649,"likeRate":0.306991,"commentRate":null,"shareRate":0.006079,"saveRate":0.04458,"viralScore":41.44,"captionLength":51,"hashtagCount":5,"mentionCount":0,"isAd":false,"isSponsored":false}
Authors JSON View
{"videoId":"7615954999562095890","authorId":"7601123447783113729","authorUsername":"ai.rabbit.hime","authorNickname":"Goth","authorProfileUrl":"https://www.tiktok.com/@ai.rabbit.hime","authorVerified":false,"authorBio":"Follower\ud83d\udda4","authorAvatar":"https://p19-common-sign.tiktokcdn-us.com/...","authorFollowers":17600,"authorFollowing":0,"authorTotalLikes":83800,"authorVideoCount":26,"authorPrivateAccount":false}
Music JSON View
{"videoId":"7615954999562095890","caption":"\ud83d\udda4. #foryoupage #viral #trending #explore #tiktok ","authorUsername":"ai.rabbit.hime","musicId":"7615955023960214288","musicTitle":"\uc624\ub9ac\uc9c0\ub110 \uc0ac\uc6b4\ub4dc - Goth","musicAuthor":"Goth","musicOriginal":true,"musicPlayUrl":"https://v16-webapp-prime.us.tiktok.com/...","musicCoverUrl":"https://p19-common-sign.tiktokcdn-us.com/..."}
Video Details JSON View
{"videoId":"7615954999562095890","videoUrl":"https://www.tiktok.com/@ai.rabbit.hime/video/7615954999562095890","caption":"\ud83d\udda4. #foryoupage #viral #trending #explore #tiktok ","createTime":1773227710,"createTimeISO":"2026-03-11T11:15:10.000Z","duration":14,"videoHeight":1280,"videoWidth":720,"videoFormat":"mp4","videoDefinition":"720p","videoCoverUrl":"https://p16-common-sign.tiktokcdn-us.com/...","videoOriginalCoverUrl":"https://p19-common-sign.tiktokcdn-us.com/...","videoDynamicCoverUrl":"https://p16-common-sign.tiktokcdn-us.com/...","isAd":false,"isSponsored":false,"isPinned":false,"isSlideshow":false,"region":null,"effectStickers":["Graffiti memories"],"retrievedAt":"2026-03-11T12:08:10.892Z"}
All Fields JSON View
{"videoId":"7615954999562095890","videoUrl":"https://www.tiktok.com/@ai.rabbit.hime/video/7615954999562095890","caption":"\ud83d\udda4. #foryoupage #viral #trending #explore #tiktok ","textLanguage":"un","hashtags":["foryoupage","viral","trending","explore","tiktok"],"mentions":[],"createTime":1773227710,"createTimeISO":"2026-03-11T11:15:10.000Z","duration":14,"views":987,"likes":303,"comments":0,"shares":6,"collectCount":44,"repostCount":0,"authorId":"7601123447783113729","authorUsername":"ai.rabbit.hime","authorNickname":"Goth","authorProfileUrl":"https://www.tiktok.com/@ai.rabbit.hime","authorVerified":false,"authorBio":"Follower\ud83d\udda4","authorAvatar":"https://p19-common-sign.tiktokcdn-us.com/...","authorFollowers":17600,"authorFollowing":0,"authorTotalLikes":83800,"authorVideoCount":26,"authorPrivateAccount":false,"musicId":"7615955023960214288","musicTitle":"\uc624\ub9ac\uc9c0\ub110 \uc0ac\uc6b4\ub4dc - Goth","musicAuthor":"Goth","musicOriginal":true,"musicPlayUrl":"https://v16-webapp-prime.us.tiktok.com/...","musicCoverUrl":"https://p19-common-sign.tiktokcdn-us.com/...","videoHeight":1280,"videoWidth":720,"videoFormat":"mp4","videoDefinition":"720p","videoCoverUrl":"https://p16-common-sign.tiktokcdn-us.com/...","videoOriginalCoverUrl":"https://p19-common-sign.tiktokcdn-us.com/...","videoDynamicCoverUrl":"https://p16-common-sign.tiktokcdn-us.com/...","isAd":false,"isSponsored":false,"isPinned":false,"isSlideshow":false,"region":null,"effectStickers":["Graffiti memories"],"captionLength":51,"hashtagCount":5,"mentionCount":0,"engagementRate":0.357649,"likeRate":0.306991,"commentRate":null,"shareRate":0.006079,"saveRate":0.04458,"viralScore":41.44,"retrievedAt":"2026-03-11T12:08:10.892Z","inputSource":"search","inputQuery":"trending"}
Output Schema (58 Fields)
Video (9 fields)
| Field | Type | Description |
|---|---|---|
| videoId | String | TikTok video ID |
| videoUrl | String | Full video URL |
| caption | String | Video caption/description |
| textLanguage | String | Detected language of the caption |
| hashtags | Array | Hashtags used in the video |
| mentions | Array | @mentioned usernames |
| createTime | Integer | Unix timestamp (seconds) |
| createTimeISO | String | ISO 8601 creation timestamp |
| duration | Integer | Video duration in seconds |
Engagement (6 fields)
| Field | Type | Description |
|---|---|---|
| views | Integer | View/play count |
| likes | Integer | Like/digg count |
| comments | Integer | Comment count |
| shares | Integer | Share count |
| collectCount | Integer | Bookmark/save count |
| repostCount | Integer | Repost count |
Author (12 fields)
| Field | Type | Description |
|---|---|---|
| authorId | String | Creator user ID |
| authorUsername | String | Creator @username |
| authorNickname | String | Creator display name |
| authorProfileUrl | String | Profile page URL |
| authorVerified | Boolean | Verified account badge |
| authorBio | String | Profile bio/signature |
| authorAvatar | String | Avatar image URL |
| authorFollowers | Integer | Follower count |
| authorFollowing | Integer | Following count |
| authorTotalLikes | Integer | Total likes received |
| authorVideoCount | Integer | Number of videos posted |
| authorPrivateAccount | Boolean | Whether account is private |
Music (6 fields)
| Field | Type | Description |
|---|---|---|
| musicId | String | Sound/music ID |
| musicTitle | String | Sound/music title |
| musicAuthor | String | Sound/music author |
| musicOriginal | Boolean | Whether it's an original sound |
| musicPlayUrl | String | Music audio URL |
| musicCoverUrl | String | Music cover image URL |
Video Technical (7 fields)
| Field | Type | Description |
|---|---|---|
| videoHeight | Integer | Video height in pixels |
| videoWidth | Integer | Video width in pixels |
| videoFormat | String | Video format (e.g., mp4) |
| videoDefinition | String | Video quality (e.g., 720p) |
| videoCoverUrl | String | Video thumbnail URL |
| videoOriginalCoverUrl | String | Original cover image URL |
| videoDynamicCoverUrl | String | Animated/dynamic cover GIF URL |
Flags & Metadata (5 fields)
| Field | Type | Description |
|---|---|---|
| isAd | Boolean | Whether the video is an ad |
| isSponsored | Boolean | Whether the video is sponsored |
| isPinned | Boolean | Whether pinned to profile |
| isSlideshow | Boolean | Whether it's a photo slideshow |
| region | String | Video region/country code |
Derived (4 fields)
| Field | Type | Description |
|---|---|---|
| effectStickers | Array | Effect/sticker names used |
| captionLength | Integer | Character count of caption |
| hashtagCount | Integer | Number of hashtags |
| mentionCount | Integer | Number of @mentions |
Engagement Rates (6 fields)
| Field | Type | Description |
|---|---|---|
| engagementRate | Float | (likes + comments + shares + saves) / views |
| likeRate | Float | likes / views |
| commentRate | Float | comments / views |
| shareRate | Float | shares / views |
| saveRate | Float | saves / views |
| viralScore | Float | Weighted viral metric (0-100+) |
Meta (3 fields)
| Field | Type | Description |
|---|---|---|
| retrievedAt | String | ISO 8601 scrape timestamp |
| inputSource | String | Input type: video, profile, hashtag, search |
| inputQuery | String | The input value that triggered this extraction |
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| videos | Array | [] | TikTok videos to scrape β full URLs or bare numeric IDs (mix freely) |
| usernames | Array | [] | Creator profiles β handle, @handle, or profile URL |
| hashtags | Array | [] | Hashtag pages β tag, #tag, or tag URL |
| searchKeywords | Array | [] | Search TikTok by keyword (falls back to trending only if no source at all) |
| maxVideos | Integer | 50 | Max videos per source (1-500) |
| includeAuthor | Boolean | true | Include author profile data |
| includeMusic | Boolean | true | Include music/sound data |
| shouldDownloadVideos / Covers / Avatars / MusicCovers / SlideshowImages | Boolean | false | Download & permanently re-host media on Apify |
| downloadSubtitlesOptions | String | off | subtitles or transcript (native captions) |
| commentsPerPost / topLevelCommentsPerPost / maxRepliesPerComment | Integer | 0 | Scrape comments β separate comments dataset |
| maxFollowersPerProfile / maxFollowingPerProfile | Integer | 0 | Export connections β separate followers dataset |
| profileSorting / excludePinnedPosts / oldestPostDate / newestPostDate / mostDiggs / leastDiggs | mixed | β | Filter & sort scraped videos |
| scrapeRelatedVideos | Boolean | false | Also scrape TikTok's related videos (for video sources) |
| maxRelatedVideos | Integer | 10 | How many related videos to scrape per input video (1-50) |
| proxyCountryCode | String | β | Two-letter country for Apify Proxy |
| proxyConfiguration | Object | { useApifyProxy: true } | Proxy configuration (residential recommended) |
Legacy note: the older
videoUrlsandvideoIdsfields are still read if present, but the singlevideosfield replaces both β paste URLs or IDs interchangeably.
Quick Start
Example 1: Search by Keyword
{"searchKeywords":["trending"],"maxVideos":50,"includeAuthor":true,"includeMusic":true}
Example 2: Search + Hashtag Combined
{"searchKeywords":["trending"],"hashtags":["viral"],"maxVideos":50,"includeAuthor":true,"includeMusic":true}
Example 3: Creator Profile with your own residential proxy
{"usernames":["travelguru"],"maxVideos":50,"proxyConfiguration":{"useApifyProxy":false,"proxyUrls":["http://user:pass@proxy.iproyal.com:12321"]}}
π¦ Proxy policy
TikTok blocks datacenter IPs aggressively, so some features need a residential IP.
What works without a residential proxy (datacenter / no proxy is fine):
- Single video URLs/IDs, search, media downloads, transcripts.
What needs a residential proxy (marked π in the input):
- Hashtags, creator profiles, related videos, comments, followers/following.
Two ways to get a residential IP:
-
Apify Residential β just select it in the proxy editor. A
residential-resultevent is charged per result to cover the residential bandwidth (which Apify bills to the actor). -
Your own residential proxy β enter it under Custom proxy URLs. That traffic goes through your provider, so the
residential-resultevent is NOT charged:http://user:pass@proxy.iproyal.com:12321http://user:pass@proxy.brightdata.com:22225http://user:pass@proxy.oxylabs.io:7777
To keep residential costs down, the actor downloads cover/avatar/music images directly (no proxy); residential bandwidth is used only for the lightweight page/API calls that actually need it (plus the video file itself if you enable video download).
Engagement Rates & Viral Score
All engagement rates are calculated as ratios (0 to 1). Returns null if views is 0 or the metric is unavailable.
Viral Score uses a weighted formula:
viralScore =(shares *3+ saves *2+ comments *1.5+ likes)/ views *100
| Score Range | Interpretation |
|---|---|
| 0 - 5 | Low engagement |
| 5 - 10 | Average engagement |
| 10 - 25 | Good viral potential |
| 25 - 50 | Strong viral potential |
| 50+ | Exceptional / highly viral |
Dataset Views
The output is organized into 5 focused tabs on the Apify platform:
| Tab | Fields | What You See |
|---|---|---|
| Overview | 20 | Quick summary β video, caption, key metrics, author, viral score |
| Engagement | 20 | All counts + computed rates + viral score + content flags |
| Authors | 13 | Full creator profiles β bio, avatar, followers, verified |
| Music | 9 | Sound info β title, artist, original sound flag, cover |
| Video Details | 20 | Technical specs, covers, timestamps, flags, effects |
Use Cases
Influencer Marketing
Analyze TikTok creator performance and content engagement. Compare viral scores across creators to identify top performers.
Competitor Monitoring
Track competitor campaigns, viral content, and hashtag performance. Monitor shares, saves, and repost counts over time.
Trend Analysis
Identify trending hashtags, sounds, and content styles at scale. Use music data and effect stickers to spot emerging trends.
AI Dataset Generation
Generate structured datasets for training recommendation, sentiment, or content classification models.
Social Listening
Understand audience engagement through video metrics across topics. Filter by engagement rate and viral score.
Performance
| Metric | Value |
|---|---|
| Concurrency | 5 parallel requests |
| Request timeout | 60 seconds |
| Retry | Up to 2 retries per request |
| Session pooling | 5 sessions, 20 uses each |
Data Export
Supported formats (via Apify platform):
- JSON
- CSV
- Excel
- HTML
Notes
- Music play URLs are time-limited signed URLs that may expire
- textLanguage returns a language code (e.g.,
"en","es") or"un"(undetermined) if TikTok does not provide language metadata - region is extracted from multiple sources (video metadata, author profile, diversification labels)
Pricing
Pay-per-result model β you only pay for what you get.
| Event | Trigger | Count |
|---|---|---|
search-query | Each search/hashtag/profile processed | 1 per source |
video-result | Each video successfully extracted | 1 per video |
Proxy costs (if enabled) are billed to your Apify account separately.
Compliance
- Collects only publicly available TikTok video data
- Does not bypass CAPTCHAs or access gated content
- Does not collect private account data
- Intended for legitimate research, analytics, and business intelligence
- Users are responsible for compliance with applicable laws in their jurisdiction
Support
- Issues: Report via GitHub or Apify support
- Feature requests: Open an issue with your use case
Built by Coregent Digital Studio β Production-ready TikTok video metadata extraction
