SFOLN

Catalogue / Social media data

TikTok Comments Scraper

sfoln/tiktok-video-comments · Social media, Videos, Automation On request

Scrape comments from public TikTok videos and photo posts: text, date, likes, reply count, pinned flag and commenter handle, one JSON record per comment. Paste video URLs, short links or IDs. $0.30 per 1,000 comments + $0.003 per page of ~20. No login or cookies needed.

About

What it does

TikTok Comments Scraper gets comments from public TikTok videos and photo posts, one normalized record per comment: comment ID, text, date, likes, reply count, pinned flag, language, and the commenter's handle, nickname and IDs. The video summary also reports TikTok's total comment count. It's built for audience and sentiment research, community management, giveaway draws, product feedback mining and AI agents.

Price

Price per delivered record

EventPricePer 1,000Charged for
TikTok comment
tiktok-comment
$0.0003$0.30 / 1,000Charged once per comment delivered as a dataset record. Video summary records are never charged.
TikTok comments page
tiktok-comments-query
$0.003$3 / 1,000Charged once per page of comments (about 20) that delivered at least one new comment. Covers the per-request upstream fee. Also charged for an empty page the upstream billed (when the budget covers it).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~tiktok-video-comments/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videos":["https://www.tiktok.com/@randomspamvideos25/video/7251387037834595630"],"maxCommentsPerVideo":20}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/tiktok-video-comments"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~tiktok-video-comments/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Get up to 100 comments of https://www.tiktok.com/@randomspamvideos25/video/7251387037834595630 and summarize what viewers like and dislike.

Input

Input fields

Enter TikTok video URLs. Each video produces one dataset record per comment plus one summary record per video.

FieldTypeDefaultMeaning
videos *arrayrequiredVideo URLs
TikTok video or photo URLs (https://www.tiktok.com/@user/video/…), vm.tiktok.com short links, or numeric video IDs. Full URLs work best. Duplicates are removed. Accounts on the Apify free plan can process up to 10 videos per run.
maxCommentsPerVideointeger50Max comments per video
How many comments to return per video (1–500). Each delivered comment is one charged event, plus one page event per page of about 20. Range 1–500.
maxVideosinteger100Max videos
Safety cap on the number of videos processed in this run. Range 1–1000.
concurrencyinteger4Concurrency
How many videos are fetched in parallel (1–8). Range 1–8.
itemTimeoutSecsinteger600Time limit per input (seconds)
Pagination for one video stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. Range 60–3600.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified provider object to each result record.
Example input
{
  "videos": [
    "https://www.tiktok.com/@randomspamvideos25/video/7251387037834595630"
  ],
  "maxCommentsPerVideo": 20
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The video URL or ID as provided.
recordTypestringRecord type
comment (one per delivered comment, charged) | video (one summary per video, never charged) e.g. "comment"
positionintegerPosition
1-based position of the comment within its input
videoIdstring | nullVideo ID
videoUrlstring | nullVideo URL
URL sent upstream
totalCommentsnumber | nullTotal comments
Summary records only: TikTok's reported comment count.
commentIdstring | nullComment ID
textstring | nullText
createdAtstring | nullCreated at
ISO 8601 UTC
likesnumber | nullLikes
repliesCountnumber | nullReplies
isPinnedboolean | nullPinned
isLikedByCreatorboolean | nullLiked by creator
languagestring | nullLanguage
authorHandlestring | nullAuthor handle
authorNicknamestring | nullAuthor nickname
authorIdstring | nullAuthor ID
authorSecUidstring | nullAuthor secUid
rowsDeliveredintegerComments delivered
Summary records only.
pagesFetchedintegerPages fetched
Summary records only.
pagesChargedintegerPages charged
Summary records only.
reachedEndbooleanReached end
Summary records only: the upstream reported no further pages.
stopReasonstringStop reason
Summary records only: limit | end | budget | max_pages | deadline | empty_pages | error
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
chargedEventstringCharged event
errorobjectError
warningsarrayWarnings
sourcestringSource
fetchedAtstringFetched at
Example record
{
  "input": "https://www.tiktok.com/@stoolpresidente/video/7517114944362499342",
  "recordType": "comment",
  "position": 1,
  "videoId": "7517114944362499342",
  "videoUrl": "https://www.tiktok.com/@stoolpresidente/video/7517114944362499342",
  "commentId": null,
  "text": "DAVE BUY A TEAM",
  "createdAt": "2025-06-18T03:22:12.000Z",
  "likes": 3322,
  "repliesCount": 14,
  "isPinned": null,
  "isLikedByCreator": null,
  "language": "en",
  "authorHandle": "dimebag.duster",
  "authorNickname": "Robert Lessner",
  "authorId": "6958917445306926086",
  "authorSecUid": "MS4wLjABAAAA9rB4k_Ei3NexA5p2lb8naaa4LTgNCOdY0W9NHVo63016XkdsuZgvjkgolBnUkG8W",
  "status": "ok",
  "charged": true,
  "chargedEvent": "tiktok-comment",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents