TikTok Post & Slideshow Detail Scraper
Pricing
from $0.49 / 1,000 results
TikTok Post & Slideshow Detail Scraper
Fetch full metadata for any TikTok video or photo-carousel post by URL or ID: engagement stats, author snapshot, music details, hashtags, mentions, and signed media URLs.
Pricing
from $0.49 / 1,000 results
Rating
0.0
(0)
Developer
Nimbryxo-studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
TikTok Post Scraper
Paste a TikTok link, a bare post ID, or a profile handle and get structured post data back: engagement counts, the creator's snapshot at scrape time, the sound, every hashtag and @mention, carousel images, and signed media URLs. The actor also reads comment threads, including replies, and can walk a profile's newest posts. No TikTok account, cookies, or login are required.
Three ways to use it
| Mode | What you provide | What you get |
|---|---|---|
| Posts | Video/photo URLs, share links, or numeric IDs | One row per post |
| Profiles | Handles, @names, or profile URLs | One row per newest post, up to 500 per profile |
| Comments | Post URLs/IDs and/or profiles | One row per comment and reply, up to 1,000 per post |
The default run is the smallest useful one: one known slideshow post, embed-first, no comments.
What makes it useful
- Fast first, rich when asked. Every post starts on TikTok's embed surface (~0.7 s). The slower page/detail path runs only for
maxDetailposts, so bulk runs stay quick while the first rows still carry language, collect/repost counts, and video tracks. - Slideshows stay slideshows. Carousel posts are detected from both the embed shape (
imagePostInfo.displayImages) and the detail shape (imagePost.images), so the images array is not lost when the fast path misses. - Bare IDs work. IDs are opened with a safe placeholder username instead of the
/video/<id>path that redirects to a 404. - No silent holes. Deleted, private, region-locked, or blocked inputs become explicit
recordType: "status"rows with a reason, not an empty dataset. - Honest media checks. TikTok's video CDN rejects
HEAD; the optional URL check uses aGET Rangerequest and reports what actually answered. - Deduplicated. The same post ID from a URL, a short link, and an ID list is scraped once. Comments are deduplicated by comment ID.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
mode | select | posts | posts, profiles, or comments |
postUrls | array | one slideshow prefill | Video/photo URLs, /v/ and /share/ links, embed links, vm.tiktok.com/vt.tiktok.com/tiktok.com/t/ short links, or bare IDs |
postIds | array | – | 15–20 digit numeric IDs |
profiles | array | – | @handle, profile URL, or bare handle; up to 500 newest posts per profile |
maxItems | integer 1–1000 | 100 | Global row cap. Posts/profiles count posts; comments counts comments + replies |
maxDetail | integer 1–300 | 50 | How many posts get the slower page/detail enrichment |
maxCommentsPerPost | integer 1–1000 | 100 | Comments + replies kept per post |
includeReplies | boolean | false | Fetch reply threads under root comments |
includeComments | boolean | false | Attach a comments array in posts/profiles mode; emit root comment rows in comments mode |
proxyConfiguration | object | – | Optional. Direct requests are the default; AUTO datacenter is used on a block signal |
includeMediaUrls | boolean | true | Signed video/cover/music/image URLs and mediaUrlExpiresAt |
validateMediaUrls | boolean | false | Range GET probe → mediaUrlAccessible |
includeAuthorStats | boolean | true | authorStats and legacy author counts |
includeHashtags | boolean | true | Hashtags array |
includeMentions | boolean | true | Mentions array with offsets |
includeSubtitles | boolean | false | video.subtitleInfos, bitrateInfo, volumeInfo |
includeRawFields | boolean | false | item_control, contents, effectStickers, stickersOnItem |
Examples
Scrape one video and one carousel, with detail enrichment:
{"mode": "posts","postUrls": ["https://www.tiktok.com/@natgeo/video/7683891628230315295","https://www.tiktok.com/@nba/photo/7690755132400618783"],"maxItems": 2,"maxDetail": 2}
Walk a profile's newest posts:
{"mode": "profiles","profiles": ["natgeo"],"maxItems": 50,"maxDetail": 20}
Read comments and replies from a post:
{"mode": "comments","postUrls": ["https://www.tiktok.com/@natgeo/video/7683891628230315295"],"maxCommentsPerPost": 200,"includeReplies": true,"maxItems": 200}
Bulk short links and IDs:
{"mode": "posts","postUrls": ["https://vm.tiktok.com/ZMabc123/"],"postIds": ["7574844184952081686"],"maxItems": 100}
Output
Every record is omit-empty: absent fields are left out rather than returned as null, "", or an empty array.
Post rows (recordType: "post")
postId,postType(video/slideshow),postUrlcaption,textLanguage,createTime,createdAt,locationCreated,viewerRegionauthor— id, secUid, username, displayName, bio, verified, privateAccount, avatarUrl, roomId (legacy counts also live here)authorStats— followerCount, followingCount, heartCount, videoCountstats— playCount, likeCount, commentCount, shareCount, collectCount, repostCount (also kept as flat legacy fields)flags— stitchEnabled, duetEnabled, shareEnabled, commentStatus, isAd, isAigc, isECVideo, privateItem, forFriend, originalItem, plus labels when present (also kept flat)music— id, title, authorName, album, original, duration, shootDuration, licensing flags, dspLinks, playUrl, coverUrlvideo— width, height, duration, ratio, definition, bitrate, codecType, format, size, videoQuality, playUrl, downloadAddr, cover, originCover, dynamicCover, optional subtitle/bitrate/volume tracksimages— ordered carousel objects:ordinal,width,height,urlListhashtags,mentionsmediaUrlExpiresAt, optionalmediaUrlAccessiblesource(embed,detail,ssr, orprofile),scrapedAt,recordType- Profiles mode adds
profileUsername,position, andisPinnedwhen the profile pinned the post commentswhenincludeCommentsis on: root comments, each optionally carrying arepliesarray
Comment rows (recordType: "comment" or "reply")
commentId, postId, postUrl, text, createTime, createdAt, likeCount, replyCount, isPinnedByAuthor, isLikedByAuthor, isTranslatable, language, isReply, replyToCommentId, threadId, user (id, secUid, username, displayName, avatarUrl, optional verified), images, textExtra, optional share link/stickers/labels, source, scrapedAt.
Status rows (recordType: "status")
status is one of not_found, private, region, or blocked, plus input, optional postId, message, httpStatus, source, and scrapedAt. Status rows are diagnostics and do not count toward maxItems.
Limits and behaviour
- Posts: up to
maxItemsrows (1–1000).maxDetailcaps the slower page/detail lookups (1–300). - Profiles: up to 500 newest posts per profile and
maxItemsrows overall. The profile feed normally comes from TikTok's itemList; if that XHR returns an empty body, the actor retries and then falls back to the creator itemList endpoint. - Comments: up to 1,000 comment + reply rows per post. TikTok's
totalcounter is not used as a progress guarantee; the actor follows the cursor and stops after repeated empty windows. - Pacing: requests are spaced 1.2–2.0 s apart. HTTP 429 and 503 responses are retried with a 1.5–4.5 s backoff.
- Media URLs are signed and typically expire in about 48 hours.
mediaUrlExpiresAttells you when. - Private / deleted / region-locked posts cannot be read without cookies; they produce a status row.
- Comments on deleted posts may look identical to a post with no comments; the actor reports the post status it observed.
FAQ
Do I need a TikTok account or cookies? No. The actor uses public embed pages, the public video page, and unsigned comment endpoints.
Is a proxy required? No. Direct requests are the primary path. If TikTok blocks the request, the actor retries with an Apify datacenter proxy. A proxy is exposed only for users who want to supply their own.
Why do some rows have more fields than others?
The embed path is fast but omits a few detail-only values (caption language, collect/repost counts, video tracks). Raise maxDetail to enrich more posts; the actor never fabricates a field it could not read.
How do I get only slideshows?
Provide slideshow URLs or IDs. Slideshow rows have postType: "slideshow" and an ordered images array. There is no separate slideshow-only mode because the same post-ID path covers videos and carousels.
Why is a row missing? Check the status view. Inputs that cannot be parsed, resolved, or read are reported there instead of disappearing.
Can I attach comments to post rows?
Yes. Set includeComments: true in posts or profiles mode; set includeReplies too if you want reply threads nested under each root comment.
Is this affiliated with TikTok? No. This is an independent, third-party actor that reads publicly viewable TikTok content.