TikTok Scraper — Profiles, Posts & Video Details avatar

TikTok Scraper — Profiles, Posts & Video Details

Pricing

from $1.50 / 1,000 tiktok profiles

Go to Apify Store
TikTok Scraper — Profiles, Posts & Video Details

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

ScrapingMonkey

Maintained by Community

Actor stats

1

Bookmarked

98

Total users

35

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

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?

ModeInputOutputBest for
autoSupported TikTok URLsAutomatically detected profile, media, playlist, or LIVE rowsMixed URL batches
profileUsernames or profile URLsPublic identity, biography, avatars, counts, and account flagsCreator research
profilePostsUsernames or profile URLsOne profile row plus available matching-author video/photo previews (up to 22)Creator content monitoring
videoVideo URLs or numeric IDsComplete public video metadataPost and campaign analysis
photoPhoto URLs or numeric IDsSlideshow metadata and ordered image URLsVisual content research
searchPhotosKeywordsPaginated public Photo Search rowsVisual trend discovery
playlistComplete playlist URLsMatching public playlist metadataSeries and collection research
liveStatusUsernames, LIVE URLs, or room IDsPublic room availability/statusStream 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

  1. Select Profile and recent posts.
  2. Enter one or more usernames such as tiktok or nasa.
  3. Keep maxResults at 10 for the first run.
  4. Leave HTTP enrichment enabled when complete engagement and media fields are required.
  5. 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"}]}
{"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.

CategoryFields
Record and sourcerecordType, resultType, id, url, sourceMode, sourceTarget, sourceUrl, finalUrl, sourceEndpoints, transport, position, scrapedAt, country, language, availability, isPartial, fallbackUsed
Creator identityusername, nickname, authorId, secUid, signature, avatarThumb, avatarMedium, avatarLarge, isVerified, isPrivate, isBusinessAccount, bioLink
Creator metricsfollowersCount, followingCount, friendsCount, heartsCount, likesGivenCount, videosCount
Contentdescription, createTime, createTimeIso, mediaType, durationSeconds, width, height, ratio, format, codecType, definition
Media URLsvideoUrl, downloadUrl, coverUrl, dynamicCoverUrl, originCoverUrl, imageUrls, imageCount
Content flagsisAd, isOriginal, isOfficial, isSecret, isCollected, isReviewing, commentsEnabled, downloadEnabled, duetEnabled, stitchEnabled, textLanguage, aigcDescription
EngagementlikesCount, commentsCount, sharesCount, viewsCount, savesCount
Tagshashtags, mentions
MusicmusicId, musicTitle, musicAuthor, musicAlbum, musicUrl, musicCoverUrl, musicDurationSeconds, musicOriginal, musicCopyrighted, musicCommercial
HashtaghashtagId, hashtagName, hashtagTitle, hashtagDescription, hashtagVideoCount, hashtagViewCount
PlaylistplaylistId, playlistName, playlistVideoCount, playlistCoverUrl
LIVEroomId, liveStatus, isLive, liveTitle, liveViewerCount, liveLikeCount, liveStartTime, liveCoverUrl, liveStreamUrls, liveHashtag, liveAgeRestricted
Complete nested dataauthor, authorStats, stats, video, images, music, hashtag, playlist, live, raw

Input parameters

ParameterTypeRequiredDefaultDescription
modestringYesprofilePostsauto, profile, profilePosts, video, photo, searchPhotos, playlist, or liveStatus
startUrlsrequest[]By mode[]Supported public TikTok URLs
targetsstring[]By mode["tiktok"]Usernames, URLs, media IDs, or LIVE room IDs
searchTermsstring[]Photo Search[]Photo Search keywords
maxResultsintegerNo20Media candidates processed per profile or keyword; filters and duplicates can reduce saved rows. 0 allows every HTTP-accessible candidate
maxTotalResultsintegerNo0Stop collecting after this many unique eligible records; ordering applies to that collected sample. 0 disables the additional run cap
countrystringNoUSResidential proxy country and regional request hint
languagestringNoenHTML/API language and Accept-Language locale
sortstringNorelevanceOrder of collected results: relevance, latest, popular, or oldest. Changes order only; does not search extra pages for better results
publishedAfterISO stringNo—Keep media from the start of the specified UTC date or from the exact timestamp. Undated media is excluded.
publishedBeforeISO stringNo—Keep media through the end of the specified UTC date or up to and including the exact timestamp. Undated media is excluded.
minLikesintegerNo0Minimum public likes; use enrichment for reliable post filtering
minCommentsintegerNo0Minimum public comment count; use enrichment for reliable post filtering
minViewsintegerNo0Minimum public views/play count
includeRawbooleanNofalseInclude sanitized public source objects; increases Dataset size
enrichPartialResultsbooleanNotrueFetch complete public media HTML for lightweight recent-post rows
maxConcurrencyintegerNo5Parallel HTTP targets/enrichments, 1–25
maxSessionRotationsintegerNo3Fresh residential proxy/session attempts, 1–6
navigationTimeoutSecsintegerNo45Per-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:

WorkflowRequestsDecoded response bytesRows
Profile1about 368 KB1
Profile plus available matching lightweight posts2about 380–400 KBVaries; can be only the profile
Video detail1about 392 KB1
Photo Search, five results2about 410 KB5
Playlist metadata2about 374 KB1

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 actionPPE event
Public profileprofile-result
Video or photovideo-photo-result
Playlist metadataplaylist-result
LIVE statuslive-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

  • profilePosts keeps 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: true until 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 null or [].
  • includeRaw can 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.