TikTok Scraper — Profiles, Posts & Video Details
Pricing
from $1.50 / 1,000 tiktok profiles
TikTok Scraper — Profiles, Posts & Video Details
Extract TikTok profiles, recent posts, video and photo details, photo search results, playlists, and LIVE status with low-traffic HTTP requests.
Pricing
from $1.50 / 1,000 tiktok profiles
Rating
0.0
(0)
Developer
ScrapingMonkey
Maintained by CommunityActor stats
1
Bookmarked
98
Total users
35
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
TikTok Scraper — Profiles, Posts, Videos, Photos and LIVE Status
Extract structured public TikTok data with low-traffic HTTP requests. The Actor does not start Chrome, Playwright, or another browser and does not require a TikTok account, cookies, or an API key.
- Collect complete public profile identity, biography, counts, avatars, and account flags
- Return one profile row plus available creator-matched media previews (up to 22 candidates) for each username
- Enrich recent posts with complete public engagement, author, music, hashtag, video, and photo data
- Extract individual video and photo/slideshow details from URLs or IDs
- Paginate public TikTok Photo Search results
- Resolve public creator playlist metadata and LIVE status
- Process inputs concurrently with retry, proxy-session rotation, filtering, sorting, and deduplication
- Export one stable 113-field contract through a single Results table
What can you do with this Actor?
| Mode | Input | Output | Best for |
|---|---|---|---|
auto | Supported TikTok URLs | Automatically detected profile, media, playlist, or LIVE rows | Mixed URL batches |
profile | Usernames or profile URLs | Public identity, biography, avatars, counts, and account flags | Creator research |
profilePosts | Usernames or profile URLs | One profile row plus available matching-author video/photo previews (up to 22) | Creator content monitoring |
video | Video URLs or numeric IDs | Complete public video metadata | Post and campaign analysis |
photo | Photo URLs or numeric IDs | Slideshow metadata and ordered image URLs | Visual content research |
searchPhotos | Keywords | Paginated public Photo Search rows | Visual trend discovery |
playlist | Complete playlist URLs | Matching public playlist metadata | Series and collection research |
liveStatus | Usernames, LIVE URLs, or room IDs | Public room availability/status | Stream monitoring |
Top Search, Video Search, User Search, hashtag/music feeds, Explore, For You, and LIVE discovery are intentionally not advertised: current public web routes require short-lived TikTok signatures or a live browser session. Removing those modes keeps the Actor fast and economically sustainable.
Quick start
- Select Profile and recent posts.
- Enter one or more usernames such as
tiktokornasa. - Keep
maxResultsat 10 for the first run. - Leave HTTP enrichment enabled when complete engagement and media fields are required.
- Start the Actor and open the single Results table.
Input examples
Profile details
{"mode":"profile","targets":["tiktok","nasa"],"maxResults":1,"country":"US","language":"en"}
Profile plus recent posts
{"mode":"profilePosts","targets":["tiktok"],"maxResults":20,"enrichPartialResults":true,"country":"US"}
Fast profile posts without per-item enrichment
{"mode":"profilePosts","targets":["tiktok"],"maxResults":20,"enrichPartialResults":false,"country":"US"}
Auto-detect a mixed URL batch
{"mode":"auto","startUrls":[{"url":"https://www.tiktok.com/@tiktok"},{"url":"https://www.tiktok.com/@axl17_/video/7627482636847435026"}],"maxResults":10}
Video details
{"mode":"video","startUrls":[{"url":"https://www.tiktok.com/@axl17_/video/7627482636847435026"}]}
Photo or slideshow details
{"mode":"photo","startUrls":[{"url":"https://www.tiktok.com/@creator/photo/7650904787013127438"}]}
Photo Search
{"mode":"searchPhotos","searchTerms":["home decor","street style"],"maxResults":50,"country":"US"}
Playlist metadata
{"mode":"playlist","startUrls":[{"url":"https://www.tiktok.com/@tiktok/playlist/Behind-The-Breakthrough-7659874208872221471"}]}
LIVE status
{"mode":"liveStatus","targets":["creator","7672717264355003156"],"maxResults":1}
maxResults limits the media candidates processed for each profile or Photo Search keyword; filters and duplicates can reduce the saved result count. profilePosts also returns one profile row. TikTok's unsigned public embed route returns a limited preview mixed with recommendations. This Actor keeps only posts matching the requested creator, so fewer results than maxResults can be returned; a complete or newest-first creator feed is not guaranteed. maxTotalResults stops collection after the first eligible unique rows across the run. Ordering applies only to that collected sample.
Complete output examples
The implementation always initializes the complete 113-field top-level contract. Optional public data is represented by null; list fields use []. No separate dataset error records or Errors view are created. Safe failure and partial-source counts are written to RUN_SUMMARY and the run log. Confirmed results use recoverable intermediate state. When ordering is requested, only the collected sample is reordered before final output. Every selected row is saved and charged once; ordering does not discard selected rows or change the saved-result count. Recovery resumes confirmed work without duplicate charges or lost paid results. raw is null unless includeRaw is enabled; when enabled it contains a sanitized source-defined TikTok object whose session, cookie, token, signature and device identifiers are removed.
Complete profile output — 113 top-level fields
The profile details row uses the same stable 113-field contract. Fields that do not apply to this record type are explicitly returned as null or [].
{"recordType": "profile","resultType": "profile","id": "10001","url": "https://www.tiktok.com/@creator","sourceMode": "profile","sourceTarget": "creator","sourceUrl": "https://www.tiktok.com/@creator","finalUrl": "https://www.tiktok.com/@creator","sourceEndpoints": ["/api/example/"],"transport": "httpHtml","position": 1,"scrapedAt": "2026-08-11T12:00:00Z","country": "US","language": "en","availability": "public","isPartial": false,"fallbackUsed": false,"username": "creator","nickname": "Creator","authorId": "10001","secUid": "MS4wLjABAAAA_public","signature": "Public profile biography","avatarThumb": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","avatarMedium": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg","avatarLarge": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg","isVerified": true,"isPrivate": false,"isBusinessAccount": false,"bioLink": "https://example.com","followersCount": 1250000,"followingCount": 120,"friendsCount": 80,"heartsCount": 24000000,"likesGivenCount": 340,"videosCount": 275,"description": null,"createTime": null,"createTimeIso": null,"mediaType": null,"durationSeconds": null,"width": null,"height": null,"ratio": null,"format": null,"codecType": null,"definition": null,"videoUrl": null,"downloadUrl": null,"coverUrl": null,"dynamicCoverUrl": null,"originCoverUrl": null,"imageUrls": [],"imageCount": null,"isAd": null,"isOriginal": null,"isOfficial": null,"isSecret": null,"isCollected": null,"isReviewing": null,"commentsEnabled": null,"downloadEnabled": null,"duetEnabled": null,"stitchEnabled": null,"textLanguage": null,"aigcDescription": null,"likesCount": null,"commentsCount": null,"sharesCount": null,"viewsCount": null,"savesCount": null,"hashtags": [],"mentions": [],"musicId": null,"musicTitle": null,"musicAuthor": null,"musicAlbum": null,"musicUrl": null,"musicCoverUrl": null,"musicDurationSeconds": null,"musicOriginal": null,"musicCopyrighted": null,"musicCommercial": null,"hashtagId": null,"hashtagName": null,"hashtagTitle": null,"hashtagDescription": null,"hashtagVideoCount": null,"hashtagViewCount": null,"playlistId": null,"playlistName": null,"playlistVideoCount": null,"playlistCoverUrl": null,"roomId": null,"liveStatus": null,"isLive": null,"liveTitle": null,"liveViewerCount": null,"liveLikeCount": null,"liveStartTime": null,"liveCoverUrl": null,"liveStreamUrls": [],"liveHashtag": null,"liveAgeRestricted": null,"author": {"id": "10001","uniqueId": "creator","nickname": "Creator","avatarThumb": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","avatarMedium": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg","avatarLarger": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg","signature": "Public profile biography","verified": true,"secUid": "MS4wLjABAAAA_public","secret": false,"ftc": false,"relation": 0,"openFavorite": true,"commentSetting": 0,"duetSetting": 0,"stitchSetting": 0,"privateAccount": false,"isADVirtual": false,"downloadSetting": 0,"isEmbedBanned": false},"authorStats": {"followerCount": 1250000,"followingCount": 120,"friendCount": 80,"heartCount": 24000000,"diggCount": 340,"videoCount": 275},"stats": null,"video": null,"images": null,"music": null,"hashtag": null,"playlist": null,"live": null,"raw": null}
Complete media-video output — 113 top-level fields
The video media row uses the same stable 113-field contract. Fields that do not apply to this record type are explicitly returned as null or [].
{"recordType": "media","resultType": "video","id": "7412345678901234567","url": "https://www.tiktok.com/@creator/video/7412345678901234567","sourceMode": "video","sourceTarget": "https://www.tiktok.com/@creator/video/7412345678901234567","sourceUrl": "https://www.tiktok.com/@creator/video/7412345678901234567","finalUrl": "https://www.tiktok.com/@creator/video/7412345678901234567","sourceEndpoints": ["/api/example/"],"transport": "httpHtml","position": 1,"scrapedAt": "2026-08-11T12:00:00Z","country": "US","language": "en","availability": "public","isPartial": false,"fallbackUsed": false,"username": "creator","nickname": "Creator","authorId": "10001","secUid": "MS4wLjABAAAA_public","signature": "Public profile biography","avatarThumb": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","avatarMedium": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg","avatarLarge": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg","isVerified": true,"isPrivate": false,"isBusinessAccount": null,"bioLink": null,"followersCount": null,"followingCount": null,"friendsCount": null,"heartsCount": null,"likesGivenCount": null,"videosCount": null,"description": "A public TikTok video #travel @friend","createTime": 1786468800,"createTimeIso": "2026-08-11T12:00:00Z","mediaType": "video","durationSeconds": 21,"width": 1080,"height": 1920,"ratio": "720p","format": "mp4","codecType": "h264","definition": "720p","videoUrl": "https://v16-webapp.tiktok.com/video.mp4","downloadUrl": "https://v16-webapp.tiktok.com/download.mp4","coverUrl": "https://p16-sign.tiktokcdn-us.com/cover.jpeg","dynamicCoverUrl": "https://p16-sign.tiktokcdn-us.com/dynamic.webp","originCoverUrl": "https://p16-sign.tiktokcdn-us.com/origin.jpeg","imageUrls": [],"imageCount": 0,"isAd": false,"isOriginal": true,"isOfficial": false,"isSecret": false,"isCollected": false,"isReviewing": false,"commentsEnabled": true,"downloadEnabled": true,"duetEnabled": true,"stitchEnabled": true,"textLanguage": "en","aigcDescription": "","likesCount": 182400,"commentsCount": 4200,"sharesCount": 8100,"viewsCount": 3200000,"savesCount": 50700,"hashtags": ["travel"],"mentions": ["friend"],"musicId": "7300000000000000001","musicTitle": "Original sound","musicAuthor": "Creator","musicAlbum": "","musicUrl": "https://sf16-ies-music.tiktokcdn.com/audio.mp3","musicCoverUrl": "https://p16-sign.tiktokcdn-us.com/music.jpeg","musicDurationSeconds": 21,"musicOriginal": true,"musicCopyrighted": false,"musicCommercial": false,"hashtagId": null,"hashtagName": null,"hashtagTitle": null,"hashtagDescription": null,"hashtagVideoCount": null,"hashtagViewCount": null,"playlistId": null,"playlistName": null,"playlistVideoCount": null,"playlistCoverUrl": null,"roomId": null,"liveStatus": null,"isLive": null,"liveTitle": null,"liveViewerCount": null,"liveLikeCount": null,"liveStartTime": null,"liveCoverUrl": null,"liveStreamUrls": [],"liveHashtag": null,"liveAgeRestricted": null,"author": {"id": "10001","uniqueId": "creator","nickname": "Creator","avatarThumb": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","avatarMedium": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg","avatarLarger": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg","signature": "Public profile biography","verified": true,"secUid": "MS4wLjABAAAA_public","secret": false,"ftc": false,"relation": 0,"openFavorite": true,"commentSetting": 0,"duetSetting": 0,"stitchSetting": 0,"privateAccount": false,"isADVirtual": false,"downloadSetting": 0,"isEmbedBanned": false},"authorStats": {"followerCount": 1250000,"followingCount": 120,"heartCount": 24000000,"videoCount": 275,"diggCount": 340,"friendCount": 80},"stats": {"diggCount": 182400,"shareCount": 8100,"commentCount": 4200,"playCount": 3200000,"collectCount": 50700},"video": {"id": "7412345678901234567","height": 1920,"width": 1080,"duration": 21,"ratio": "720p","cover": "https://p16-sign.tiktokcdn-us.com/cover.jpeg","originCover": "https://p16-sign.tiktokcdn-us.com/origin.jpeg","dynamicCover": "https://p16-sign.tiktokcdn-us.com/dynamic.webp","playAddr": "https://v16-webapp.tiktok.com/video.mp4","downloadAddr": "https://v16-webapp.tiktok.com/download.mp4","format": "mp4","codecType": "h264","definition": "720p","size": 2345678,"videoID": "v10044","zoomCover": {}},"images": {},"music": {"id": "7300000000000000001","title": "Original sound","authorName": "Creator","album": "","duration": 21,"coverLarge": "https://p16-sign.tiktokcdn-us.com/music.jpeg","coverMedium": "https://p16-sign.tiktokcdn-us.com/music-medium.jpeg","coverThumb": "https://p16-sign.tiktokcdn-us.com/music-thumb.jpeg","playUrl": "https://sf16-ies-music.tiktokcdn.com/audio.mp3","original": true,"private": false,"isCopyrighted": false,"is_commerce_music": false,"is_unlimited_music": false,"shoot_duration": 21,"tt2dsp": {}},"hashtag": null,"playlist": null,"live": null,"raw": null}
Complete media-photo output — 113 top-level fields
The photo or slideshow media row uses the same stable 113-field contract. Fields that do not apply to this record type are explicitly returned as null or [].
{"recordType": "media","resultType": "photo","id": "7412345678901234567","url": "https://www.tiktok.com/@creator/photo/7412345678901234567","sourceMode": "searchPhotos","sourceTarget": "street food","sourceUrl": "https://www.tiktok.com/@creator/photo/7412345678901234567","finalUrl": "https://www.tiktok.com/@creator/photo/7412345678901234567","sourceEndpoints": ["/api/example/"],"transport": "httpHtml","position": 1,"scrapedAt": "2026-08-11T12:00:00Z","country": "US","language": "en","availability": "public","isPartial": false,"fallbackUsed": false,"username": "creator","nickname": "Creator","authorId": "10001","secUid": "MS4wLjABAAAA_public","signature": "Public profile biography","avatarThumb": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","avatarMedium": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg","avatarLarge": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg","isVerified": true,"isPrivate": false,"isBusinessAccount": null,"bioLink": null,"followersCount": null,"followingCount": null,"friendsCount": null,"heartsCount": null,"likesGivenCount": null,"videosCount": null,"description": "A street food photo carousel #food","createTime": 1786468800,"createTimeIso": "2026-08-11T12:00:00Z","mediaType": "photo","durationSeconds": 0,"width": 1080,"height": 1920,"ratio": "720p","format": "mp4","codecType": "h264","definition": "720p","videoUrl": null,"downloadUrl": null,"coverUrl": "https://p16-sign.tiktokcdn-us.com/cover.jpeg","dynamicCoverUrl": null,"originCoverUrl": "https://p16-sign.tiktokcdn-us.com/origin.jpeg","imageUrls": ["https://p16-sign.tiktokcdn-us.com/photo-1.jpeg","https://p16-sign.tiktokcdn-us.com/photo-2.jpeg"],"imageCount": 2,"isAd": false,"isOriginal": true,"isOfficial": false,"isSecret": false,"isCollected": false,"isReviewing": false,"commentsEnabled": true,"downloadEnabled": true,"duetEnabled": true,"stitchEnabled": true,"textLanguage": "en","aigcDescription": "","likesCount": 182400,"commentsCount": 4200,"sharesCount": 8100,"viewsCount": 3200000,"savesCount": 50700,"hashtags": ["food"],"mentions": [],"musicId": "7300000000000000001","musicTitle": "Original sound","musicAuthor": "Creator","musicAlbum": "","musicUrl": "https://sf16-ies-music.tiktokcdn.com/audio.mp3","musicCoverUrl": "https://p16-sign.tiktokcdn-us.com/music.jpeg","musicDurationSeconds": 21,"musicOriginal": true,"musicCopyrighted": false,"musicCommercial": false,"hashtagId": null,"hashtagName": null,"hashtagTitle": null,"hashtagDescription": null,"hashtagVideoCount": null,"hashtagViewCount": null,"playlistId": null,"playlistName": null,"playlistVideoCount": null,"playlistCoverUrl": null,"roomId": null,"liveStatus": null,"isLive": null,"liveTitle": null,"liveViewerCount": null,"liveLikeCount": null,"liveStartTime": null,"liveCoverUrl": null,"liveStreamUrls": [],"liveHashtag": null,"liveAgeRestricted": null,"author": {"id": "10001","uniqueId": "creator","nickname": "Creator","avatarThumb": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","avatarMedium": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg","avatarLarger": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg","signature": "Public profile biography","verified": true,"secUid": "MS4wLjABAAAA_public","secret": false,"ftc": false,"relation": 0,"openFavorite": true,"commentSetting": 0,"duetSetting": 0,"stitchSetting": 0,"privateAccount": false,"isADVirtual": false,"downloadSetting": 0,"isEmbedBanned": false},"authorStats": {"followerCount": 1250000,"followingCount": 120,"heartCount": 24000000,"videoCount": 275,"diggCount": 340,"friendCount": 80},"stats": {"diggCount": 182400,"shareCount": 8100,"commentCount": 4200,"playCount": 3200000,"collectCount": 50700},"video": {"id": "7412345678901234567","height": 1920,"width": 1080,"duration": 0,"ratio": "720p","cover": "https://p16-sign.tiktokcdn-us.com/cover.jpeg","originCover": "https://p16-sign.tiktokcdn-us.com/origin.jpeg","dynamicCover": null,"playAddr": null,"downloadAddr": null,"format": "mp4","codecType": "h264","definition": "720p","size": 2345678,"videoID": "v10044","zoomCover": {}},"images": {"title": "Street food","images": [{"imageURL": {"urlList": ["https://p16-sign.tiktokcdn-us.com/photo-1.jpeg"]},"displayImage": {"urlList": ["https://p16-sign.tiktokcdn-us.com/photo-display.jpeg"]}}],"cover": {"urlList": ["https://p16-sign.tiktokcdn-us.com/cover.jpeg"]},"shareCover": {"urlList": ["https://p16-sign.tiktokcdn-us.com/share.jpeg"]}},"music": {"id": "7300000000000000001","title": "Original sound","authorName": "Creator","album": "","duration": 21,"coverLarge": "https://p16-sign.tiktokcdn-us.com/music.jpeg","coverMedium": "https://p16-sign.tiktokcdn-us.com/music-medium.jpeg","coverThumb": "https://p16-sign.tiktokcdn-us.com/music-thumb.jpeg","playUrl": "https://sf16-ies-music.tiktokcdn.com/audio.mp3","original": true,"private": false,"isCopyrighted": false,"is_commerce_music": false,"is_unlimited_music": false,"shoot_duration": 21,"tt2dsp": {}},"hashtag": null,"playlist": null,"live": null,"raw": null}
Complete playlist output — 113 top-level fields
The playlist details row uses the same stable 113-field contract. Fields that do not apply to this record type are explicitly returned as null or [].
{"recordType": "playlist","resultType": "playlist","id": "7312345678901234567","url": "https://www.tiktok.com/@creator/playlist/Travel-7312345678901234567","sourceMode": "playlist","sourceTarget": "https://www.tiktok.com/@creator/playlist/Travel-7312345678901234567","sourceUrl": "https://www.tiktok.com/@creator/playlist/Travel-7312345678901234567","finalUrl": "https://www.tiktok.com/@creator/playlist/Travel-7312345678901234567","sourceEndpoints": ["/api/example/"],"transport": "httpJson","position": 1,"scrapedAt": "2026-08-11T12:00:00Z","country": "US","language": "en","availability": "public","isPartial": false,"fallbackUsed": false,"username": null,"nickname": null,"authorId": null,"secUid": null,"signature": null,"avatarThumb": null,"avatarMedium": null,"avatarLarge": null,"isVerified": null,"isPrivate": null,"isBusinessAccount": null,"bioLink": null,"followersCount": null,"followingCount": null,"friendsCount": null,"heartsCount": null,"likesGivenCount": null,"videosCount": null,"description": null,"createTime": null,"createTimeIso": null,"mediaType": null,"durationSeconds": null,"width": null,"height": null,"ratio": null,"format": null,"codecType": null,"definition": null,"videoUrl": null,"downloadUrl": null,"coverUrl": null,"dynamicCoverUrl": null,"originCoverUrl": null,"imageUrls": [],"imageCount": null,"isAd": null,"isOriginal": null,"isOfficial": null,"isSecret": null,"isCollected": null,"isReviewing": null,"commentsEnabled": null,"downloadEnabled": null,"duetEnabled": null,"stitchEnabled": null,"textLanguage": null,"aigcDescription": null,"likesCount": null,"commentsCount": null,"sharesCount": null,"viewsCount": null,"savesCount": null,"hashtags": [],"mentions": [],"musicId": null,"musicTitle": null,"musicAuthor": null,"musicAlbum": null,"musicUrl": null,"musicCoverUrl": null,"musicDurationSeconds": null,"musicOriginal": null,"musicCopyrighted": null,"musicCommercial": null,"hashtagId": null,"hashtagName": null,"hashtagTitle": null,"hashtagDescription": null,"hashtagVideoCount": null,"hashtagViewCount": null,"playlistId": "7312345678901234567","playlistName": "Travel","playlistVideoCount": 24,"playlistCoverUrl": "https://p16-sign.tiktokcdn-us.com/playlist.jpeg","roomId": null,"liveStatus": null,"isLive": null,"liveTitle": null,"liveViewerCount": null,"liveLikeCount": null,"liveStartTime": null,"liveCoverUrl": null,"liveStreamUrls": [],"liveHashtag": null,"liveAgeRestricted": null,"author": null,"authorStats": null,"stats": null,"video": null,"images": null,"music": null,"hashtag": null,"playlist": {"id": "7312345678901234567","mixId": "7312345678901234567","mixName": "Travel","name": "Travel","videoCount": 24,"cover": "https://p16-sign.tiktokcdn-us.com/playlist.jpeg","creator": {"id": "10001","uniqueId": "creator","nickname": "Creator"}},"live": null,"raw": null}
Complete live-status output — 113 top-level fields
The LIVE status row uses the same complete contract. An offline creator has isLive: false; when TikTok exposes a room ID, the Actor also calls the public status endpoint.
{"recordType": "live","resultType": "liveStatus","id": "creator","url": "https://www.tiktok.com/@creator","sourceMode": "liveStatus","sourceTarget": "creator","sourceUrl": "https://www.tiktok.com/@creator/live","finalUrl": "https://www.tiktok.com/@creator","sourceEndpoints": [],"transport": "httpHtml","position": 1,"scrapedAt": "2026-08-11T23:16:54.774915Z","country": "US","language": "en","availability": "notLive","isPartial": true,"fallbackUsed": true,"username": "creator","nickname": null,"authorId": null,"secUid": null,"signature": null,"avatarThumb": null,"avatarMedium": null,"avatarLarge": null,"isVerified": null,"isPrivate": null,"isBusinessAccount": null,"bioLink": null,"followersCount": null,"followingCount": null,"friendsCount": null,"heartsCount": null,"likesGivenCount": null,"videosCount": null,"description": null,"createTime": null,"createTimeIso": null,"mediaType": null,"durationSeconds": null,"width": null,"height": null,"ratio": null,"format": null,"codecType": null,"definition": null,"videoUrl": null,"downloadUrl": null,"coverUrl": null,"dynamicCoverUrl": null,"originCoverUrl": null,"imageUrls": [],"imageCount": null,"isAd": null,"isOriginal": null,"isOfficial": null,"isSecret": null,"isCollected": null,"isReviewing": null,"commentsEnabled": null,"downloadEnabled": null,"duetEnabled": null,"stitchEnabled": null,"textLanguage": null,"aigcDescription": null,"likesCount": null,"commentsCount": null,"sharesCount": null,"viewsCount": null,"savesCount": null,"hashtags": [],"mentions": [],"musicId": null,"musicTitle": null,"musicAuthor": null,"musicAlbum": null,"musicUrl": null,"musicCoverUrl": null,"musicDurationSeconds": null,"musicOriginal": null,"musicCopyrighted": null,"musicCommercial": null,"hashtagId": null,"hashtagName": null,"hashtagTitle": null,"hashtagDescription": null,"hashtagVideoCount": null,"hashtagViewCount": null,"playlistId": null,"playlistName": null,"playlistVideoCount": null,"playlistCoverUrl": null,"roomId": null,"liveStatus": "offline","isLive": false,"liveTitle": null,"liveViewerCount": null,"liveLikeCount": null,"liveStartTime": null,"liveCoverUrl": null,"liveStreamUrls": [],"liveHashtag": null,"liveAgeRestricted": null,"author": null,"authorStats": null,"stats": null,"video": null,"images": null,"music": null,"hashtag": null,"playlist": null,"live": null,"raw": null}
What data can you extract?
Every output key is listed below.
| Category | Fields |
|---|---|
| Record and source | recordType, resultType, id, url, sourceMode, sourceTarget, sourceUrl, finalUrl, sourceEndpoints, transport, position, scrapedAt, country, language, availability, isPartial, fallbackUsed |
| Creator identity | username, nickname, authorId, secUid, signature, avatarThumb, avatarMedium, avatarLarge, isVerified, isPrivate, isBusinessAccount, bioLink |
| Creator metrics | followersCount, followingCount, friendsCount, heartsCount, likesGivenCount, videosCount |
| Content | description, createTime, createTimeIso, mediaType, durationSeconds, width, height, ratio, format, codecType, definition |
| Media URLs | videoUrl, downloadUrl, coverUrl, dynamicCoverUrl, originCoverUrl, imageUrls, imageCount |
| Content flags | isAd, isOriginal, isOfficial, isSecret, isCollected, isReviewing, commentsEnabled, downloadEnabled, duetEnabled, stitchEnabled, textLanguage, aigcDescription |
| Engagement | likesCount, commentsCount, sharesCount, viewsCount, savesCount |
| Tags | hashtags, mentions |
| Music | musicId, musicTitle, musicAuthor, musicAlbum, musicUrl, musicCoverUrl, musicDurationSeconds, musicOriginal, musicCopyrighted, musicCommercial |
| Hashtag | hashtagId, hashtagName, hashtagTitle, hashtagDescription, hashtagVideoCount, hashtagViewCount |
| Playlist | playlistId, playlistName, playlistVideoCount, playlistCoverUrl |
| LIVE | roomId, liveStatus, isLive, liveTitle, liveViewerCount, liveLikeCount, liveStartTime, liveCoverUrl, liveStreamUrls, liveHashtag, liveAgeRestricted |
| Complete nested data | author, authorStats, stats, video, images, music, hashtag, playlist, live, raw |
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
mode | string | Yes | profilePosts | auto, profile, profilePosts, video, photo, searchPhotos, playlist, or liveStatus |
startUrls | request[] | By mode | [] | Supported public TikTok URLs |
targets | string[] | By mode | ["tiktok"] | Usernames, URLs, media IDs, or LIVE room IDs |
searchTerms | string[] | Photo Search | [] | Photo Search keywords |
maxResults | integer | No | 20 | Media candidates processed per profile or keyword; filters and duplicates can reduce saved rows. 0 allows every HTTP-accessible candidate |
maxTotalResults | integer | No | 0 | Stop collecting after this many unique eligible records; ordering applies to that collected sample. 0 disables the additional run cap |
country | string | No | US | Residential proxy country and regional request hint |
language | string | No | en | HTML/API language and Accept-Language locale |
sort | string | No | relevance | Order of collected results: relevance, latest, popular, or oldest. Changes order only; does not search extra pages for better results |
publishedAfter | ISO string | No | — | Keep media from the start of the specified UTC date or from the exact timestamp. Undated media is excluded. |
publishedBefore | ISO string | No | — | Keep media through the end of the specified UTC date or up to and including the exact timestamp. Undated media is excluded. |
minLikes | integer | No | 0 | Minimum public likes; use enrichment for reliable post filtering |
minComments | integer | No | 0 | Minimum public comment count; use enrichment for reliable post filtering |
minViews | integer | No | 0 | Minimum public views/play count |
includeRaw | boolean | No | false | Include sanitized public source objects; increases Dataset size |
enrichPartialResults | boolean | No | true | Fetch complete public media HTML for lightweight recent-post rows |
maxConcurrency | integer | No | 5 | Parallel HTTP targets/enrichments, 1–25 |
maxSessionRotations | integer | No | 3 | Fresh residential proxy/session attempts, 1–6 |
navigationTimeoutSecs | integer | No | 45 | Per-request timeout, 15–120 seconds |
Date and engagement filters apply before a row is selected for the collected sample or counts toward maxTotalResults. When a date range is active, media with a known date outside the range is excluded before enrichment. Media with an unknown date can first receive the enabled, budget-permitted enrichment; if its date is still unknown afterward, or enrichment is unavailable, it is excluded and counted in RUN_SUMMARY with the missing-date reason.
With date or engagement filters enabled, Photo Search stops a keyword after two consecutive pages where filters leave no new eligible photos. Other keywords continue. The stop appears in RUN_SUMMARY as paginationStopped:filteredSearchPages.
Use cases
Creator and influencer research
Collect creator identity, biography, verification, privacy flags, follower/following counts, total hearts, and video totals without opening profiles manually.
Recent creator content
Return the profile and available video/photo previews belonging to that creator. The source offers up to 22 candidates and can include unrelated recommendations, which are excluded; a complete or newest-first feed is not guaranteed. Enable HTTP enrichment for additional available likes, comments, shares, saves, music, hashtags, mentions, and media fields.
Individual post analysis
Extract complete public video or slideshow metadata from specific URLs, including engagement, author, sound attribution, ordered image URLs, and available playback/cover URLs.
Visual trend discovery
Paginate Photo Search by keyword, apply date and engagement filters, and stop at the collection limits. Order the collected sample by publication time or popularity without searching extra pages for a better-ranked result.
Playlist and LIVE monitoring
Resolve public creator playlist metadata and schedule repeated LIVE-status checks through Apify schedules, webhooks, or API integrations.
Performance and cost
The Actor uses HTTP/2-capable browser-TLS impersonation but never starts a browser. It downloads only the required HTML documents and JSON responses; it does not load JavaScript bundles, fonts, videos, or background browser resources.
Measured local smoke examples through residential test proxies:
| Workflow | Requests | Decoded response bytes | Rows |
|---|---|---|---|
| Profile | 1 | about 368 KB | 1 |
| Profile plus available matching lightweight posts | 2 | about 380–400 KB | Varies; can be only the profile |
| Video detail | 1 | about 392 KB | 1 |
| Photo Search, five results | 2 | about 410 KB | 5 |
| Playlist metadata | 2 | about 374 KB | 1 |
These are decoded application bytes from representative runs, not guaranteed proxy-billing bytes. Response size varies by profile, locale, TikTok experiments, and optional enrichment. Each matching partial post selected for enrichment can add a media-detail HTTP request. Unrelated recommendations are excluded before enrichment.
Separate enrichment and source-without-results charges apply only when those events are included in the active pricing for your run. Until then, enrichment is included in the saved-result price and a source with no saved results has no separate source fee. The platform's Actor Start fee still applies.
Saved-result events are charged only for successfully saved Dataset rows. Ordering changes neither the selected rows nor their saved-result charges; every selected row is saved and charged once. When the separate enrichment event is active, enrichment costs $1.50 per 1,000 attempts on every plan, in addition to saved-result charges. One attempt is charged per post per run when its first additional detail request starts; retries are included. That fee applies even if enrichment fails or the post is later removed by a filter. Enrichment and source-without-results events create no additional Dataset rows; the Dataset contains extracted data only.
There is no per-page filtering charge. If one page has no matching results, Photo Search continues while TikTok offers more pages and the collection and budget limits allow it. maxResults limits the candidates checked per keyword, so filters can produce fewer saved rows.
When the corresponding source-without-results event is active, its fee is charged at most once per source per run when actual TikTok HTTP requests were made but no result row was saved. This includes a missing object, exhausted request attempts, an empty search, or results all excluded by filters. For profile and profilePosts, the fee matches the profile-result price. For video, photo, Photo Search, playlist, and LIVE sources, it matches their saved-result price. No source fee is added if an enrichment attempt has already been charged for that source. Locally invalid inputs, duplicate sources, and sources stopped by a result cap, exhausted budget, or cancellation do not incur this fee.
When you resume the same run, a confirmed source fee covers the first recovered row for that source. Later rows use their regular result pricing.
| Chargeable action | PPE event |
|---|---|
| Public profile | profile-result |
| Video or photo | video-photo-result |
| Playlist metadata | playlist-result |
| LIVE status | live-result |
| Post enrichment attempt, when active ($1.50 per 1,000 on every plan) | post-enrichment-attempt |
| Profile or profilePosts source with no saved results, when active (profile-result price) | profile-source-without-results |
| Other source with no saved results, when active (corresponding saved-result price) | source-without-results |
The Store Pricing tab is the source of truth for current prices.
API usage
After a run, retrieve the single Results view through the Dataset API:
https://api.apify.com/v2/datasets/<DATASET_ID>/items?view=overview&clean=true&format=json
Run the Actor through the Apify API, schedule recurring checks, or connect successful runs to webhooks and downstream automations. The same complete field contract is available in JSON, CSV, Excel, XML, and RSS exports.
Best for / not for
Best for: public creator intelligence, recent creator posts, individual video/photo details, photo trend datasets, playlist inventories, and public LIVE-status monitoring.
Not for: Top/Video/User Search, hashtag or music feeds, Explore, For You, LIVE discovery, private profiles, follower/following lists, comment threads, TikTok Shop, authenticated feeds, media-file downloads, stream recording, or CAPTCHA-protected content.
Limits and good to know
profilePostskeeps only creator-matched items from the unsigned embed preview (up to 22 candidates). The source can return mostly unrelated recommendations, leaving few or no matching posts. Cursor pagination and a complete creator feed are not available on that route.- Lightweight recent-post rows contain description, author identifiers, play count, covers, and playback URL. They are marked
isPartial: trueuntil successfully enriched. - Enrichment remains HTTP-only but performs one additional public media request per partial row.
- Individual photo pages are resolved through the same public SSR data path TikTok uses for the media ID, allowing ordered slideshow image URLs to be extracted without a browser.
- Photo Search requires one lightweight HTML warm-up request per keyword before JSON pagination.
- Country selects the mandatory residential proxy region, but TikTok ultimately controls regional availability and ranking.
- Signed CDN media URLs can expire. Store or process them promptly when your workflow permits.
- The 113-field contract is stable, but fields that do not apply to a record type use
nullor[]. includeRawcan substantially increase Dataset transfer and storage.
Frequently asked questions
What input should I provide?
Use usernames for profile workflows, complete TikTok URLs for media/playlist workflows, keywords for Photo Search, and usernames or numeric room IDs for LIVE status. Auto mode accepts only the URL types listed above.
Why does Profile posts return one extra row?
The requested public profile is a separate row. maxResults limits the media candidates processed for that profile; filters and duplicates can reduce the following media rows. The profile row also counts toward an active maxTotalResults run cap.
How many recent profile posts can I extract?
The current unsigned public embed endpoint offers up to 22 candidates, but some or most can be unrelated recommendations and are excluded. The Actor can therefore return fewer matching posts or only the profile. It does not guarantee a complete or newest-first creator feed; higher limits do not enable additional profile pagination.
Why are some recent-post fields empty?
The low-traffic embed response intentionally contains fewer fields. enrichPartialResults is enabled by default and requests complete public details for partial posts. Enrichment is included unless the separate enrichment event is active in your run's pricing; when active, it costs $1.50 per 1,000 attempts on every plan. Retries are included; failed attempts and posts later removed by filters are still charged under that event. Failed enrichment keeps the lightweight row with isPartial: true if it passes the active filters. If the remaining budget cannot cover both an active enrichment fee and saving its result, the extra request is skipped and the available partial row is kept if it passes those filters. With an active date range, a row whose date remains unknown is excluded. Disable enrichPartialResults to keep available lightweight data without enrichment-attempt charges, subject to the same filters.
Can a source with no saved results still be charged?
Yes, when the corresponding source-without-results event is active in your run's pricing. If actual TikTok requests were made but the source saved no results, that fee can apply once per source per run, subject to the exceptions above. Posts with known dates outside the requested range are excluded before enrichment and do not incur an enrichment-attempt fee. There is no per-page filtering charge, and no additional source-without-results fee is added when enrichment has already been charged for that source.
Can I process multiple inputs?
Yes. Add multiple usernames, URLs, room IDs, or Photo Search keywords. maxResults applies independently to media candidates for each profile or keyword. maxTotalResults stops collection after the first eligible unique rows across all inputs; 0 disables this additional run cap.
How do result limits and ordering work?
The Actor applies date and engagement filters, removes duplicates, and collects the first eligible unique rows up to maxTotalResults. It then stops fetching and orders only those collected rows. Newest first and Most popular first do not search additional pages to find the best rows beyond the limit. For example, a run cap of 1 with Most popular first keeps the first eligible unique row encountered; it does not scan a larger set to choose one winner. Raise the collection limits if you want to compare a larger sample. maxTotalResults: 0 disables the additional run cap, while the per-input maxResults candidate limit still applies.
Do I need a TikTok account, API key, cookies, or proxy settings?
No account, API key, saved cookies, or user-facing proxy configuration is required. Published runs automatically use Apify Residential Proxy, and first-party cookies live only inside an isolated HTTP session.
Does the Actor extract comments or follower lists?
No. Media rows include public comment counts, while complete comment threads and follower/following lists are outside this public HTTP-only product boundary.
Responsible use
Use the Actor only for lawful collection of publicly available data. Respect privacy, intellectual-property rights, platform terms, applicable laws, and reasonable request volumes. Do not use it to bypass access controls or collect private information.
Support
If a public target repeatedly returns no rows, include the mode, sanitized input, run ID, country, and approximate time in an Apify issue. Never post proxy credentials, cookies, signed media URLs, or authentication data in a public issue.