TikTok Post & Slideshow Detail Scraper avatar

TikTok Post & Slideshow Detail Scraper

Pricing

from $0.49 / 1,000 results

Go to Apify Store
TikTok Post & Slideshow Detail Scraper

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

Nimbryxo-studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

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

ModeWhat you provideWhat you get
PostsVideo/photo URLs, share links, or numeric IDsOne row per post
ProfilesHandles, @names, or profile URLsOne row per newest post, up to 500 per profile
CommentsPost URLs/IDs and/or profilesOne 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 maxDetail posts, 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 a GET Range request 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

FieldTypeDefaultNotes
modeselectpostsposts, profiles, or comments
postUrlsarrayone slideshow prefillVideo/photo URLs, /v/ and /share/ links, embed links, vm.tiktok.com/vt.tiktok.com/tiktok.com/t/ short links, or bare IDs
postIdsarray–15–20 digit numeric IDs
profilesarray–@handle, profile URL, or bare handle; up to 500 newest posts per profile
maxItemsinteger 1–1000100Global row cap. Posts/profiles count posts; comments counts comments + replies
maxDetailinteger 1–30050How many posts get the slower page/detail enrichment
maxCommentsPerPostinteger 1–1000100Comments + replies kept per post
includeRepliesbooleanfalseFetch reply threads under root comments
includeCommentsbooleanfalseAttach a comments array in posts/profiles mode; emit root comment rows in comments mode
proxyConfigurationobject–Optional. Direct requests are the default; AUTO datacenter is used on a block signal
includeMediaUrlsbooleantrueSigned video/cover/music/image URLs and mediaUrlExpiresAt
validateMediaUrlsbooleanfalseRange GET probe → mediaUrlAccessible
includeAuthorStatsbooleantrueauthorStats and legacy author counts
includeHashtagsbooleantrueHashtags array
includeMentionsbooleantrueMentions array with offsets
includeSubtitlesbooleanfalsevideo.subtitleInfos, bitrateInfo, volumeInfo
includeRawFieldsbooleanfalseitem_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), postUrl
  • caption, textLanguage, createTime, createdAt, locationCreated, viewerRegion
  • author — id, secUid, username, displayName, bio, verified, privateAccount, avatarUrl, roomId (legacy counts also live here)
  • authorStats — followerCount, followingCount, heartCount, videoCount
  • stats — 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, coverUrl
  • video — width, height, duration, ratio, definition, bitrate, codecType, format, size, videoQuality, playUrl, downloadAddr, cover, originCover, dynamicCover, optional subtitle/bitrate/volume tracks
  • images — ordered carousel objects: ordinal, width, height, urlList
  • hashtags, mentions
  • mediaUrlExpiresAt, optional mediaUrlAccessible
  • source (embed, detail, ssr, or profile), scrapedAt, recordType
  • Profiles mode adds profileUsername, position, and isPinned when the profile pinned the post
  • comments when includeComments is on: root comments, each optionally carrying a replies array

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 maxItems rows (1–1000). maxDetail caps the slower page/detail lookups (1–300).
  • Profiles: up to 500 newest posts per profile and maxItems rows 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 total counter 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. mediaUrlExpiresAt tells 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.