MEKAWeb data, ready to use.Explore APIs
MEKA/APIs/TikTok
Market research · TikTok

TikTok Comments Scraper

Collect public TikTok comments and replies from full video URLs or discover videos and public reposts from profile usernames.

Quickstart

Set your Apify token, submit the input and receive an array of Dataset rows.

POSThttps://api.apify.com/v2/acts/meka.im~tiktok-comments-scraper/run-sync-get-dataset-items
Apify API token

Set APIFY_TOKEN in your server environment and send Authorization: Bearer. Runs execute under your Apify account.

curl -X POST 'https://api.apify.com/v2/acts/meka.im~tiktok-comments-scraper/run-sync-get-dataset-items' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"postURLs":["https://www.tiktok.com/@nike/video/7693986066830839054"],"commentsPerPost":20,"topLevelCommentsPerPost":10,"maxRepliesPerComment":5,"maxConcurrency":1}'

Examples run on your server. Executing an Actor may incur charges under your Apify account. View Actor details

Input parameters

Send a JSON object as the request body.

FieldTypeDescription
postURLsOptionalarrayUp to 100 full public TikTok video URLs. Use Profile usernames below for profiles; invalid video URLs are skipped independently. Default: [].
commentsPerPostOptionalintegerMaximum total delivered comments and replies for each video. Default: 100. Range: 1–10000.
topLevelCommentsPerPostOptionalintegerMaximum top-level comments collected for each video. Default: 100. Range: 1–10000.
maxRepliesPerCommentOptionalintegerPer-parent reply upper bound, default 0. Delivers main comments first; explicitly set this to collect replies. Default: 0. Range: 0–500.
profilesOptionalarrayUp to 100 usernames, optional @. Videos and public reposts supported. Default: [].
resultsPerPageOptionalintegerDefault 1. Upper bound on discovered posts per profile, not comment rows. Default: 1. Range: 1–100.
profileSortingOptionalstringDefault latest. Native video discovery order: latest, popular or oldest. Reposts retain upstream repost order. Default: "latest".
profileScrapeSectionsOptionalarrayDefault [videos]. Select videos, reposts or both. Each section uses native upstream pagination; profileSorting applies to videos. resultsPerPage caps unique posts across selected sections. Default: ["videos"].
oldestPostDateUnifiedOptionalstringInclusive UTC publication lower bound: valid YYYY-MM-DD or integer string 1..36500 (1=today, 2=yesterday). Relative days freeze at each profile unit first request, before discovery.
newestPostDateOptionalstringYYYY-MM-DD UTC video publication date; inclusive calendar day. Applies to profile discovery before comment collection.
excludePinnedPostsOptionalbooleanDefault false. Profile discovery only. Default: false.
maxConcurrencyOptionalintegerProcess 1–16 video or profile targets at once. Each profile processes its videos sequentially. Output can arrive in completion order; this is not a requests-per-second setting. Default: 16. Range: 1–16.

Response fields

The synchronous endpoint returns a JSON array. Each row follows the Actor’s published Dataset contract.

FieldTypeDescription
cidstringVerified comment ID.
textnull | stringPublic comment or reply text; null if unavailable.
createTimenull | integerUnix seconds when supplied.
createTimeISOnull | stringCorresponding ISO UTC creation time.
diggCountnull | integerSource-reported comment likes; null is unknown.
replyCommentTotalnull | integerSource-reported reply count, not a completeness guarantee.
uidnull | stringPublic author ID when available.
uniqueIdnull | stringPublic author username when available.
repliesToIdnull | stringNull for top-level comments; directed reply target when supplied, otherwise parent. Target may be outside the sample.
avatarThumbnailnull | stringPublic author image URL reference; may expire.
likedByAuthornull | booleanVerified source flag when supplied.
pinnedByAuthornull | booleanVerified source pin flag, or null when unknown.
mentionsnull | arrayEmpty array for verified absence; otherwise null when handles cannot be verified.
detailedMentionsnull | arrayVerified Tag-contract identities with id; name, nickName and profileUrl remain null. Unknown or unverified metadata stays null.
videoWebUrlstringCanonical full TikTok video URL.
submittedVideoUrlstringActual video URL used for collection, including profile-discovered videos.
inputstringActual video input URL.
_anyfetchobjectProtected contractVersion, inputHash and video-ID:comment-ID recovery identity; no cookies or credentials.

Example response

Historical recording

Selected fields from the Actor README’s October 11, 2026 recording. This is an excerpt, not a full Dataset row or a guarantee of future values.

Selected Dataset fields
[
  {
    "cid": "7694035405498286869",
    "createTimeISO": "2026-10-07T21:07:14.000Z",
    "diggCount": 5062,
    "replyCommentTotal": 2,
    "repliesToId": null,
    "videoWebUrl": "https://www.tiktok.com/@nike/video/7693986066830839054"
  }
]

Errors & limitations

Run lifecycle

The synchronous endpoint waits at most 300 seconds. For larger batches, start an asynchronous Actor run, wait for completion and retrieve the Dataset and run key-value records. Inspect OUTPUT before interpreting partial delivery as complete.

Public source availability

Removed, restricted, unavailable or changing source content can produce fewer rows or errors. Successful platform status alone does not prove complete collection. No login credentials, private content or media downloads are supported.

For HTTP errors and run lifecycle handling, see the Apify API reference.

Traversal and Dataset v1

The published Actor accepts profile discovery controls without requiring apiVersion in Actor input. Do not send the internal Data API plan/page envelope. The Dataset remains contract v1.

postURLs accepts full public TikTok video URLs. The Actor normalizes supported URL forms to HTTPS and removes query strings and fragments before collection. Profile usernames belong in profiles. Invalid video URLs are skipped independently, and repeated IDs retain their first valid occurrence. Empty API input returns no rows.

Replies count toward commentsPerPost. Defaults collect 100 top-level rows and zero replies. To allow replies, set maxRepliesPerComment above zero and leave room below the total cap. Results are ceilings, not guaranteed counts.

Profile discovery and recovery

Profile date filters apply to video publication dates before collecting comments. oldestPostDateUnified accepts YYYY-MM-DD or an integer string 1–36500; 1 means today. Relative dates freeze at each profile unit first request. Reposts retain upstream order; profileSorting controls videos.

Photos are skipped and reported. Explicit video targets are excluded from profile discovery; overlapping rows are deduplicated before delivery and charging. Each profile processes videos sequentially. Concurrent targets can complete out of input order; maxConcurrency:1 preserves direct-video order.

The OUTPUT summary reports source errors, delivered and charged rows, skipped and duplicate inputs and budget completion. Verified partial rows remain in the Dataset. Pins and mentions use verified metadata; no text-based mention inference is performed.

Frequently asked questions

How do I collect replies?

Set maxRepliesPerComment above zero and keep the top-level cap below commentsPerPost. Every reply consumes the total per-video cap.

Can I sort or filter comments?

There is no custom comment sort or keyword filter. Profile sort and date controls select videos before comment collection, not comments.