SocialGrid — Post Comments Scraper
Pricing
Pay per usage
SocialGrid — Post Comments Scraper
Scrape YouTube and TikTok post comments into flat JSON — handle, text, likes, reply count, date. YouTube mode is live-verified and guaranteed-working; TikTok is best-effort via residential proxy, with an honest structured error if gated — never fake data.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Giovanni
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Unofficial community Actor. Not affiliated with, endorsed by, or sponsored by YouTube, Google, or TikTok.
Unified-schema post comments for YouTube and TikTok, returned as flat, agent-ready JSON — one dataset item per comment, never a nested platform-specific blob. Comments are the highest-signal source of engaged fans, potential collab partners, and micro-creators; each author_handle this actor returns is a ready-made input to a profile/creator-resolver lookup.
What it does
| Platform | Status | Notes |
|---|---|---|
youtube | Guaranteed-working core. Live-verified, paginated, no proxy needed. | Reuses @socialgrid/scraper-youtube's already-live-verified getComments (including its two-endpoint onResponseReceivedEndpoints pagination fix). |
tiktok | Best-effort — live-verified working as of this writing, via Apify's RESIDENTIAL proxy. Can degrade to an explicit gated-error item if TikTok tightens signature enforcement. | Resolves the video via TikTok's public api/comment/list/ endpoint. No X-Bogus/msToken signing is implemented — this works today because that endpoint currently accepts an anonymous request carrying just a valid session cookie through a residential IP. This is inherently more fragile than the YouTube path; if TikTok starts requiring signed requests, every call will fail the same documented way (see "Honest gating" below), never silently return nothing. |
Each run pushes one dataset item per comment. If a request is fully gated (platform rejects the request, video/URL can't be resolved, etc.), the run instead pushes exactly one explicit error item — comments are never fabricated and an unreachable post never silently looks like "zero comments."
Input
{"platform": "youtube","postUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw","maxComments": 100,"includeReplies": false}
platform(required):"youtube"or"tiktok"postUrl(required): full URL of the video/post- YouTube: any
youtube.com/watch?v=...oryoutu.be/...URL - TikTok: full video URL that includes the author's handle in the path (
tiktok.com/@handle/video/123...)
- YouTube: any
maxComments(default100, max2000): paginates internally to reach this countincludeReplies(defaultfalse): currently has no effect on YouTube (see Known limitations) — TikTok returnsreply_countper top-level comment but does not expand reply threads in this versionproxyGroup(default"RESIDENTIAL", TikTok only): Apify proxy group; TikTok mandatory-login-walls datacenter IPs, so this must stayRESIDENTIALforplatform=tiktokto work at all. Unused forplatform=youtube.
Output — one item per comment
{"platform": "youtube","post_id": "jNQXAC9IVRw","comment_id": "UgzuC3zzpRZkjc5Qzsd4AaABAg","text": "We're so honored that the first ever YouTube video was filmed here!","author_handle": "@SanDiegoZoo","author_name": "@SanDiegoZoo","likes": 4600000,"reply_count": null,"published_at": "2020-07-19T18:22:35.014Z"}
Real TikTok example (live-verified — note author_handle and author_name are genuinely distinct on this platform, and reply_count is a real number):
{"platform": "tiktok","post_id": "7635602188613487894","comment_id": "7636247254504866580","text": "whatever you say handsome 😜","author_handle": "aaronjhon28","author_name": "Aaron_jhon","likes": 8407,"reply_count": 2,"published_at": "2026-05-05T03:39:39.000Z"}
null means the platform genuinely doesn't expose that field for that comment (or, for YouTube's reply_count, that this actor version doesn't parse it out yet — see below) — never fabricated as 0 or "".
Gated / failed request
{ "error": "tiktok-comments-gated", "detail": "TikTok comment/list rejected the request (status_code=10202: verify required)" }
{ "error": "comments-harvester-failed", "detail": "No comments panel found for \"...\" (comments may be disabled)" }
Known limitations (honest, not silently hidden)
- YouTube
reply_countis alwaysnull.getComments(the reused, live-verified core scraper) currently only parses top-level comment threads — YouTube's reply threads live behind a separate per-comment continuation token that isn't fetched yet.includeReplies: trueis accepted as input but has no effect on YouTube in this version. - YouTube
author_nameduplicatesauthor_handle. YouTube's comment renderer exposes a single author label field, not a separate display-name/@handle pair, so there's nothing further to honestly split out. - TikTok comments are inherently more fragile than YouTube's. This actor makes a genuine anonymous request to TikTok's public
api/comment/list/endpoint (real session cookie, real residential-proxy IP, real aweme id resolved via the already-live-verifiedgetPost) — it does not implement TikTok'sX-Bogus/msTokenrequest signing. This was confirmed working live as of this writing; if TikTok tightens enforcement on that endpoint, every TikTok call will fail with the same explicittiktok-comments-gatederror rather than degrading to fake or empty data. - Instagram is intentionally out of scope (login-walled).
Usage
Apify CLI
apify actors call fulinlabs/socialgrid-comments-harvester \--input '{"platform": "youtube", "postUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw", "maxComments": 50}'
REST API
curl "https://api.apify.com/v2/acts/fulinlabs~socialgrid-comments-harvester/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"platform": "tiktok", "postUrl": "https://www.tiktok.com/@handle/video/1234567890", "maxComments": 50}'
Deploy
$./deploy.sh # pnpm run bundle && apify push
Fair use / ToS note
This actor reads only publicly viewable comment data (no login, no private/friends-only content). Scraping social platforms is contrary to most platforms' Terms of Service; use conservatively, respect rate limits, and don't use this to harvest personal data for spam or harassment. YouTube is accessed via its public InnerTube endpoints with no proxy; TikTok is accessed through Apify's residential proxy pool specifically because its comment/video endpoints wall off datacenter IPs.