Instagram Comments Scraper API: Export Post Comments · Apify
Instagram Comments Scraper: Posts, Reels, No Login avatar

Instagram Comments Scraper: Posts, Reels, No Login

Pricing

from $0.19 / 1,000 comments

Go to Apify Store
Instagram Comments Scraper: Posts, Reels, No Login

Instagram Comments Scraper: Posts, Reels, No Login

Scrape Instagram comments of public posts and reels with no login: paste links, codes, ids or profiles. Each row: the text as written, time, likes, GIF, hashtags, sentiment and its post. Every comment shown, date window, keyword and verified filters, a free coverage row per post. Pay per comment.

Pricing

from $0.19 / 1,000 comments

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

4

Monthly active users

6 days ago

Last modified

Features

Limited permissions

Share

Instagram Comments Scraper: Posts, Reels, No Login

Scrape Instagram comments from public posts and reels, with no login and no cookies. Paste post or reel links, post codes, numeric post ids or profile names, and get one row per comment: the text as written, its time, its likes, any GIF, its hashtags, a sentiment estimate and the post it belongs to (the commenter's username, id, verified badge and picture with the personal data switch on). Each post also gets a free coverage row: the comment count Instagram shows, how many comments were read and delivered, and why the walk ended. Pay only for the comments delivered.

  • Deep walks: every comment Instagram shows a logged out visitor, up to 1,000,000 a post, read page by page, newest first, each comment delivered and charged once per run.
  • Profiles: give a username and read the comments of its latest posts (12 by default, up to 20,000: a whole grid), with a post date window.
  • Filters no comment tool usually has: a comment date window, words a comment must or must not contain, verified commenters only, minimum comment likes, the post owner's own comments left out, a minimum number of @mentions (the giveaway rule), one comment per commenter.
  • Most liked first as an option: each post's comments read, then delivered by likes.
  • Every link form: /p/, /reel/, /reels/ and /tv/ links, with or without the owner's name in front, share links (/share/...), instagr.am and m.instagram.com links, tracking parameters, bare codes and numeric post ids; up to 5,000 posts and 500 profiles a run.
  • Every miss (a removed post, a post of a private account, a profile that is not public, a link that cannot be read) is named by its place in your list in a free status row, one row per kind of miss.

Quick start

  1. Open the Input tab and put one or more links in Post or reel links, codes or ids, for example https://www.instagram.com/p/DctPchKOVcw/, or profile names in Profiles (their latest posts).
  2. Set Comments per post (100 by default, up to 1,000,000).
  3. Click Start. Rows arrive in the Output tab within seconds; export them as JSON, CSV or Excel, or read them through the API.
  4. Optional: the comment filters, Most liked first, Post details (one row per post), Include personal data.

What you get

One comment row per comment. Fill rates measured on 99,314 comments of 1,072 posts read by this Actor on Apify on 2026-11-04 and 05 (brands, sports, news, music, fashion, a bakery; reels, carousels, photos; many languages):

FieldWhat it isFilled
id, urlthe comment's id and its own link100 percent
textthe comment exactly as written (emoji, links, mentions included)95 percent (the rest are GIF comments)
createdAt, createdAtTimestampwhen it was written100 percent
likeCountits likes100 percent (above 0 on 23 percent)
contentType, gifUrl, gifIdtext, gif or text_and_gif, and the GIFGIF on 4 percent
hashtags, textLengththe hashtags in the text, its lengthhashtags on 2 percent
sentiment, sentimentScorepositive, negative or neutral from the English words and emoji of the AFINN list, and the score36 percent (empty when no listed word or emoji is in the text)
languagethe text's language, estimated (two letter code)14 percent (empty when the text is too short to tell)
isPostOwnerwhether the post's own account wrote it100 percent
isCovered, restrictedStatus, hasTranslationInstagram's own marks on the comment, as servedisCovered false on all 99,314, the other two empty on all
positionInPostits place among the comments delivered for its post100 percent
postCode, postId, postUrl, postType, postOwnerUsername, postOwnerId, postCommentCount, postPostedAtthe post it belongs to100 percent
ownerUsername, ownerId, ownerIsVerified, ownerProfilePicUrl, ownerProfileUrl, mentionsthe commenter and the accounts the text mentionswith includePersonalData on: 100 percent; verified on 6.5 percent and mentions on 5 percent of 5,220 comments of 45 posts read with the switch on (2026-11-04)
input, inputKind, inputList, inputPosition, profileyour entry, to match rows to your list100 percent

One free coverage row per post walked: shownCommentCount (the count Instagram shows), commentsRead, commentsDelivered, leftOut (how many comments each filter left out), pages, the newest and oldest comment read, status (why the walk ended: complete, capped, date_window, run_cap, charge_limit, work_allowance, stopped, partial, failed, comments_disabled, no_comments, not_shown, restarted) and complete (true when Instagram announced no further comments). Free status rows name the entries that delivered nothing, one row per kind, and one row per profile says what its grid came to; the run ends with a free summary row.

How many comments a post gives: Instagram's count includes replies and comments it hides from visitors who are not logged in, and it serves a logged out visitor only part of a large post's comments. Walks read to their end on 2026-11-04 gave 35 and 67 percent of the count shown (2,142 of 6,098 and 147 of 221); one walk of a very large photo post read 20,021 comments and was still going. The coverage row shows both numbers for every post.

{
"type": "comment",
"id": "18104976440650018",
"url": "https://www.instagram.com/p/DfQQryPSupf/c/18104976440650018/",
"text": "Bring back the cilantro lime sauce please and thank you!!",
"textLength": 57,
"contentType": "text",
"createdAt": "2026-11-03T17:29:39.000Z",
"likeCount": 2,
"ownerUsername": null,
"isPostOwner": false,
"hashtags": [],
"sentiment": "positive",
"sentimentScore": 3,
"language": "en",
"positionInPost": 44,
"postCode": "DfQQryPSupf",
"postType": "reel",
"postOwnerUsername": "chipotle",
"postCommentCount": 175,
"input": "DfQQryPSupf"
}

How much does it cost to scrape Instagram comments?

Pay per event, in US dollars. The price falls with your Apify plan:

EventFreeBronzeSilverGold
Comment (each comment delivered)$0.27$0.24$0.22$0.19
Post details (post details add-on, each post row)$0.27$0.24$0.22$0.19

Prices are per 1,000 events. The Actor start is $0.0075 once per run, the same on every plan. Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$0.19 / 1,000" on the Comment row means one comment costs 0.019 cents on a Gold plan, so 1,000 comments cost USD 0.19. Comments a filter leaves out, repeats, coverage rows, misses and anything Instagram did not answer are free; only the run's start fee is charged for a run that delivers nothing.

Examples at the Free price: 100 comments of one post cost 0.0075 + 100 x 0.00027 = USD 0.0345; 10,000 comments cost 0.0075 + 10,000 x 0.00027 = USD 2.7075; the 100 latest comments of 50 posts with post details cost 0.0075 + 5,000 x 0.00027 + 50 x 0.00027 = USD 1.371. At the Gold price the same 10,000 comments cost USD 1.9075.

Input

SettingWhat it does
postUrlsPost, reel, reels, tv and share links, codes or numeric post ids (up to 5,000)
usernamesProfiles (names, @names or profile links, up to 500): the comments of their latest posts
postsPerProfileHow many of each profile's latest posts to read (1 to 20,000, default 12); one run reads at most 50,000 posts in all
postedSince, postedUntilPosts published in this window: a day (2026-10-01) or "30 days", "24 hours"
postTypesOnly these kinds: photo, carousel, reel, video, igtv
onlyOwnPostsFor profiles: leave out the collaborations another account owns
maxCommentsPerPostComments delivered per post at most (1 to 1,000,000, default 100)
maxCommentsComments delivered in the whole run at most
sortBynewest (as Instagram serves them) or most_liked (each post's comments read, then by likes; at most 10,000 a post, and posts are read one at a time)
commentsNewerThan, commentsOlderThanComments written in this window: a day or "7 days", "24 hours"; a walk stops at the first comment older than the window
mustContain, mustNotContainWords or phrases a comment's text must hold, or must not hold (case ignored)
onlyVerifiedOnly comments by accounts with the verified badge
minCommentLikesOnly comments with at least this many likes
excludePostOwnerLeave out the post's own account's comments
minMentionsOnly comments that mention at least this many accounts
uniqueCommentersOne comment per commenter per post (the newest; at most 100,000 commenters a post)
includePostDetailsOne post row per post: caption, likes, comment count, date, owner, media, carousel items (Post details event)
includePersonalDataAdds the fields that name a commenter: ownerUsername, ownerId, ownerIsVerified, ownerProfilePicUrl, ownerProfileUrl, the mentions list, the author part of raw, and on post rows the tagged accounts, the caption's mentions and the post's raw answer; off, they are empty. The text is always delivered as written
includeRawDataThe comment as Instagram served it (raw)
compactRowsPicture and GIF links left out
maxConcurrency, maxRunSeconds, requestTimeoutSecs, maxRetries, proxyConfigurationPace and limits
{
"postUrls": ["https://www.instagram.com/p/DctPchKOVcw/", "https://www.instagram.com/reel/DfF3eqGSKKc/"],
"usernames": ["natgeo"],
"postsPerProfile": 3,
"maxCommentsPerPost": 500,
"commentsNewerThan": "30 days",
"excludePostOwner": true
}

How it reads Instagram

Logged out and with no cookies of any account: Instagram's own details of each post (one light request a post, four posts at a time), then the post's comments page by page, about 24 a page, newest first, as the Instagram web app asks for them; a profile's latest posts come from its grid as a logged out visitor sees it. Requests go from the run's own address first, and a request type moves to Apify's datacenter proxy for the rest of the run after two refusals in a row there; no residential proxy is needed.

Work that earns nothing

A run's unpaid work (links that do not exist, posts with no comments, filters nothing passes, failing answers) is bounded: it may spend about 72 seconds of work before its first billed comment, and every billed comment adds a little more. A run that only meets misses, or a filter that leaves out every comment of a long post, stops there with a free row for what it did not read; a run that delivers comments earns more work with each one.

What this Actor does NOT do

  • No replies to comments: Instagram does not serve them to a visitor who is not logged in (no reply count, no parent comment, no reply page), so this Actor never logs in to get them.
  • No Instagram ranked or "popular" order: a logged out visitor gets the newest first; Most liked first sorts what was read.
  • No commenter full name or private mark, and no "liked by the author", pinned, edited, ranked or spam marks: the logged out comment answer does not carry them.
  • No pinned mark on a profile's posts, so no "skip pinned posts": the profile grid a logged out visitor sees does not say which are pinned (pinned posts, up to three, come first).
  • No age restricted (18+) posts, no posts of private accounts, and no login or cookies of yours, ever.
  • No hashtag, place or keyword search, no tagged posts, stories, highlights or transcripts: the tools of ours listed at the end do searches; stories need a login.
  • No change tracking between runs and no "new comments only" memory: schedule the Actor with commentsNewerThan and compare runs in your own sheet.
  • No custom code runs inside the Actor (no mapping functions) and no delivery into other apps beyond Apify's integrations.
  • No Facebook comments of a post shared to Facebook: our Facebook Comments Scraper reads those.

FAQ

How do I scrape all the comments of an Instagram post?

Put the post's link in Post or reel links, set Comments per post high (up to 1,000,000) and run. The walk reads page by page until Instagram announces no further comments; the coverage row tells you whether it got there (complete) and how many comments Instagram shows. That count includes replies and hidden comments, so the comments a logged out visitor can read are fewer.

Can I scrape Instagram comments without logging in or cookies?

Yes. This Actor never logs in and needs no cookies or Instagram account: it reads what Instagram shows any visitor. The price of that is the limits above: no replies and no ranked order.

How do I pick giveaway winners from Instagram comments?

Use Minimum mentions for the "tag two friends" rule, One comment per commenter so each person counts once, Leave out the post owner's comments, and Include personal data to get the commenters' usernames. Every delivered comment is one row, so you can draw winners from the dataset.

How do I get only new Instagram comments since my last run?

Set Comments newer than (for example "24 hours") and schedule the Actor: comments come newest first, so each walk stops at the first older comment and reads only what is new.

How do I export Instagram comments of a whole profile?

Put the username in Profiles, set Posts per profile (up to 20,000, a whole grid) and, if you like, Posts published since. The comments of those posts arrive as rows, each with its post's code and link.

Why does this Actor run with limited permissions?

It needs nothing beyond its own run: it reads public Instagram pages and writes only to the run's own dataset and key-value store (its record of the post rows it charged and of the run's state, so a restarted run never charges anything twice); it opens no named store. Limited permissions keep it from touching any other storage of your account.

Use with the API

curl -X POST "https://api.apify.com/v2/acts/automation_craft~instagram-comments-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' -d '{"postUrls": ["https://www.instagram.com/p/DctPchKOVcw/"], "maxCommentsPerPost": 200}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/instagram-comments-scraper').call({ postUrls: ['https://www.instagram.com/p/DctPchKOVcw/'], maxCommentsPerPost: 200 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'comment'));
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/instagram-comments-scraper").call(run_input={"postUrls": ["https://www.instagram.com/p/DctPchKOVcw/"], "maxCommentsPerPost": 200})
comments = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "comment"]

Changelog

  • 0.1: first version (post links, codes, ids and profiles; comment filters and date window; most liked first; post details add-on).

More data tools by Automation Craft