Instagram Comments Scraper & Post Details avatar

Instagram Comments Scraper & Post Details

Pricing

$19.99/month + usage

Go to Apify Store
Instagram Comments Scraper & Post Details

Instagram Comments Scraper & Post Details

Instagram Comments Scraper & Post Details extracts comments from Instagram posts. It collects usernames, comment text, likes, timestamps, and reply data. Ideal for audience sentiment analysis, engagement tracking, influencer research, and social media monitoring.

Pricing

$19.99/month + usage

Rating

5.0

(1)

Developer

ScrapeBase

ScrapeBase

Maintained by Community

Actor stats

0

Bookmarked

24

Total users

2

Monthly active users

14 days ago

Last modified

Share

Collect comments from public Instagram posts and reels — and, on the same row as each comment, the post's own record: caption, owner, like/comment totals, when it went up, and its media type. No login required for comments; add a session cookie only if you hit rate limits.

What it does

Give it one or more Instagram post/reel URLs. For every comment on those posts you get:

  • the comment text, the commenter's username, profile picture and per-comment like count
  • a UTC timestamp
  • the post's own details — caption, total likes, total comment count, posted date, media type (photo / carousel / reel), the post owner's username/id/profile picture, and Instagram's own topic labels for the post (e.g. "handmade pottery")

This saves joining two exports when you need "which post triggered this conversation" alongside the comments themselves — useful for content recaps, social listening, and moderation review.

Input

FieldTypeDefaultNotes
directUrlsarray of strings["https://www.instagram.com/p/DN8-GjPkgjS"]Instagram post/reel URLs
scrapingOptions.maxCommentsinteger (1–10000, capped at 500 in practice)10Max comments per post
scrapingOptions.maxRepliesinteger (0–500, capped at 50 in practice)2See caveat below — replies need a session and Instagram's logged-out surface does not expose them today
scrapingOptions.sessionIdstringYour Instagram sessionid cookie, for more reliable access
scrapingOptions.includeNestedCommentsbooleantrueEnable/disable reply collection
scrapingOptions.isNewestCommentsbooleanfalseKept for compatibility only — Instagram's logged-out comments endpoint does not accept a sort parameter, so this has no effect
proxyConfigurationobjectOptional proxy fallback (the actor tries no proxy first, then datacenter, then residential, automatically)
includePostDetailsbooleantrueNew. Attach the post's own record (caption, likes, comments, posted date, media type) to every comment row
includePostOwnerbooleantrueNew. Add the post owner's username/id/profile picture
includePostTopicsbooleantrueNew. Add Instagram's own topic labels for the post, when present

Output

One dataset record per comment:

{
"postUrl": "https://www.instagram.com/p/DN8-GjPkgjS",
"commentUrl": "https://www.instagram.com/p/DN8-GjPkgjS/c/17878685814505076",
"id": "17878685814505076",
"text": "❤️",
"ownerUsername": "rifayil_ahmmed",
"ownerProfilePicUrl": "https://instagram.f…/…jpg",
"timestamp": "2026-07-31T09:39:59.000Z",
"repliesCount": 0,
"replies": [],
"likesCount": 0,
"owner": {
"fbid_v2": "", "full_name": "", "id": "78425128684",
"is_mentionable": true, "is_private": false, "is_verified": false,
"latest_reel_media": 0, "profile_pic_id": "",
"profile_pic_url": "https://instagram.f…/…jpg",
"username": "rifayil_ahmmed"
},
"post": {
"id": "3710113322089187538",
"shortcode": "DN8-GjPkgjS",
"caption": "Which one is your new hangout spot? 🤔⁣\n⁣\nMade with @meta.ai",
"captionIsEdited": false,
"likesCount": 179266,
"commentsCount": 9992,
"likeAndViewCountsDisabled": false,
"takenAt": "2025-08-29T20:39:55.000Z",
"mediaType": 8,
"productType": "carousel_container",
"accessibilityCaption": "Photo by Instagram on August 29, 2025.",
"location": null,
"coauthorUsernames": [],
"owner": { "id": "25025320", "username": "instagram", "profilePicUrl": "https://…" },
"topics": [{ "topicId": "handmade-pottery", "topicName": "handmade pottery" }]
}
}

replies[] entries carry the same shape minus postUrl, with commentUrl moved to the end and built as <postUrl>/c/<parentCommentId>/r/<replyId>.

post is null when includePostDetails is false, or when the post is gated (rare, logged out). post.owner is null when includePostOwner is false; post.topics is [] when includePostTopics is false or when Instagram has no topic labels for that post.

The full run is also mirrored to the key-value store under key OUTPUT as one JSON array.

Honest limitations (read before you rely on this)

  • Replies are not available logged out. Instagram's current logged-out surface has no working "child comments" endpoint at all (child_comment_count is always reported as null, and the in-app "View all replies" button opens a login prompt). maxReplies / includeNestedComments stay in the input for compatibility, but replies will be [] and repliesCount will be 0 on every row until Instagram changes this. A logged-out actor cannot honestly claim reply data — this variant does not fabricate any.
  • Comments are not sortable. isNewestComments is kept for input compatibility only. Instagram's logged-out comments query does not accept a sort argument; whatever order the API returns is what you get (in practice: recency order, not user-selectable).
  • 500 real comments per post per run. The 10000 shown as the input maximum is not honoured — actual throughput is capped by Instagram's own soft rate limiting (roughly 10–12 requests per IP per two minutes logged out), which is why a proxy fallback exists.
  • The commenter's full name, private/mentionable flags, and profile-picture id are not real data. Instagram's logged-out comment payload doesn't return them; these fields stay in the output (unchanged from the base actor) but are fixed placeholder values ("", true, false, 0), exactly as Instagram's own logged-out API omits them.
  • post.location and post.coauthorUsernames are pass-through fields — on every post measured so far Instagram returns null / [] for them logged out, so expect that in practice; the field is preserved as-is in case a future post carries a real value.