Instagram comments scraper: export Instagram comments to CSV, JSON or Excel from any public post or reel — comment text, author, likes, reply threads, @mentions and #hashtags, optional comment likers, no duplicates, no login. Each post gets a summary row with how many comments Instagram served.
All notable changes to this actor are documented here.
[0.0.19] - 2026-10-14
Maintenance
Internal maintenance. Results, columns and price are unchanged.
[0.0.18] - 2026-10-11
Changed
Maintenance: internal improvements. No change to inputs, results, run time or price.
[0.0.17] - 2026-10-11
Changed
Maintenance: groundwork for faster, better-targeted searches. No change to inputs, results, run time or price.
[0.0.16] - 2026-10-11
Changed
The upgrade hint now shows Apify's current starting price for paid plans: $19/month with $19 in platform credits (it said $29).
[0.0.15] - 2026-10-08
Fixed
A post with no comments now says so, instead of asking you to re-run. A post that opened fine but had no comments yet ended the run with "Couldn't finish reading — please re-run", and running it again gave the same answer every time. It now ends with "This post has no comments". Nothing is charged, as before.
"Comments are switched off" now reaches you. A run whose posts all had comments switched off by their owner, or a mix of such posts and posts with no comments, finished with a general "nothing could be collected" message instead of the specific one. It now names the reason.
[0.0.14] - 2026-10-08
Fixed
A temporary error from Instagram data is waited out instead of ending the post after a few seconds. When a post link, comment replies or a commenter's profile answered with a temporary error, the request was asked three times over about nine seconds and then given up — so a run with one post link could finish with no comments while the same post opened fine a few minutes later. A request now keeps asking, spread out, for up to about two minutes of waiting — never past the run's own timeout. If two requests in a row still fail, the run stops asking and names what it could not read this time. Nothing is charged for anything not read.
[0.0.13] - 2026-10-02
Fixed
Post links that could not be opened in time no longer end the run as your input error. When none of your post links opened and at least one failed only because Instagram data could not be reached in time, the run stopped with "Posts that are deleted, or that belong to a private account, cannot be read" — about posts it had not been able to read. Now the run finishes and names the links a re-run can open, separately from any that really are deleted or private, or are not post links at all. Nothing is charged.
A busy moment no longer ends a read after a few seconds. When many runs ask for Instagram data at once, a request used to be given up after about 7 seconds. It now waits its turn, never past the run's own timeout, and a dropped connection or a temporary error is asked again before anything is given up. A post whose comments still could not be read to the end keeps everything already read, as before.
[0.0.12] - 2026-09-23
Fixed
A run that restarts on the platform no longer charges again for comments it already delivered. Comments and likers are billed once, after they reach your results.
Comments that could not be saved to your results are no longer charged.
After a restart, "Max comments per post" still holds, each comment arrives once, and each post's summary row describes the whole run.
The run now stops at the maximum cost per run you set instead of reading on past it.
The closing message names the limit that actually stopped reading. On the free plan with "Max comments per post" below 50, it said raising it would not help; it does, up to the 50 comments a free run reads.
[0.0.11] - 2026-09-23
Fixed
Each comment now carries its own likers, and you pay only for likers in your results. With replies on, a comment's likers could land on the last reply under it, and a comment could come back with an empty "Comment Likers" list while its likers were charged.
The comment count on each row is the one the post shows today. It could be an older, lower number.
Posts with comment likes switched off are now detected before any lookup, as the option describes. Comments with no likes are no longer looked up, so liker runs are faster.
The closing message now says when a liker list came back short — some likers could not be read this time, the list stopped at "Max likers per comment", or comment likes are switched off on the post. RUN_SUMMARY has matching likerLists counts. API_USAGE counts liker lookups under fetch.
[0.0.10] - 2026-09-15
Unchecking "Start a Fresh Run" now picks up from your previous run. The form says it resumes the previous run, but for some accounts the run could not find it and read every post again. It now skips the posts your last finished run read to the end. Runs that finished before this update cannot be picked up this way, so the first such run after it reads everything once.
The free plan's monthly run count is now kept for this actor on its own. Free runs of this actor count toward its own allowance of 15 runs a month, separately from any other actor you use, starting from this build.
The welcome box on your first paid run now fits inside its border. Long tips wrap onto the next line instead of running past the right-hand edge.
Wording. When a single post was read to the end and still came back short of the count it shows, the note said "One post were read to the very end". It now reads "One post was read to the very end", and its title speaks of one post too.
[0.0.9] - 2026-09-15
Wording only, in the README and the storage record descriptions: the API_USAGE record is now described simply as the request count for this run. Nothing changed in how the actor runs, what it returns or what it costs.
[0.0.8] - 2026-09-15
Wording only. On the free plan, the note under a capped post no longer suggests raising
"Max comments per post" — that setting cannot lift the free plan's ceiling of 50 comments per
run, so a bigger number on the same post returned the same 50 comments. The note now says so
plainly, next to the upgrade link that was already there. Nothing changed for paying customers.
[0.0.7] - 2026-09-04
Wording only, from the first run on a real free account. When several links are pasted, the
run reads them in turn and can spend its allowance before the last one gets a turn — that post
now says "not reached — the run ran out of comments before its turn" instead of "stopped
early — 0 comments read", which described it as a failure of the post. Its share now reads
0%; a rounding floor meant to stop a real-but-tiny share showing as 0% was printing 1% for
a post that returned nothing.
[0.0.6] - 2026-09-04
Changed
The free plan is now 50 comments per run, from up to 3 post links (was 500 comments from
up to 50 links). The monthly allowance of 15 runs is unchanged, and it is now the limit you
will actually meet: all fifteen runs together cost $1.95 of the $5 monthly credit Apify gives
a free account, where three of the old runs used $3.90 of it. Links past the third come back
as their own free rows and cost nothing.
When a free run stops at the ceiling it now says what it held back and where to lift it —
how many of your posts were still being read, how many links were not opened, and a link to
your plan page. It never guesses a number of missing comments: a post's counter includes
replies, hidden and deleted comments, so that subtraction would not mean what it looks like.
The demo run on empty input quotes the cap that will actually apply to your account, and its
cost estimate matches it.
Fixed
The monthly-limit message offered "unlimited profiles per run" — this actor reads comments.
The completed-run panel had a "Skipped (free limit)" line that could never appear. It now
reports how many posts were cut short, which is a number a run can produce.
A paid run no longer sees "the free plan still applies" on a demo run.
Nothing changed for paying customers: prices, columns, both views, replies, likers, the 50-link
ceiling and resume all behave exactly as before.
[0.0.5] - 2026-09-04
README wording only, no code change. Two lines now say exactly what the actor does: a run you
abort still uses up a free-plan slot, and replies count toward the per-post cap, so a post with
200 top-level comments and busy threads is closer to 400 rows. Five long sentences shortened.
[0.0.4] - 2026-09-04
Changed
Prices. Comments now cost $2.60 per 1,000 on the Free plan (was $3.00), $2.34 on Bronze,
$2.08 on Silver and $1.82 on Gold, Platinum and Diamond. Comment likers $0.43 per 1,000 (was
$0.50), stepping down the same way. The plan-tier text on each event now says exactly what is
charged.
Name. The actor is now called Instagram Comments Scraper with Replies — CSV Export, No Login.
Same actor, same link.
README rewritten in plain language: what you give, what you get, what you won't get. The
output section lists the columns by group and shows both dataset views.
The Commenters view is described truthfully. It shows the same rows trimmed to the person and
who they tagged; someone who commented twice appears twice — dedupe by handle in your sheet.
Earlier text described it as a list with a single line for each author, which a view cannot
produce.
Sample row corrected. The coverage columns (Delivered Top-Level, Delivered Replies,
Stop Reason) are null on comment rows and filled on the post's post_summary row; the
README sample now shows that.
Input-form help shortened; the run's Output tab now links to COMMENT_COVERAGE.
No change to defaults, columns or limits.
[0.0.3] - 2026-09-03
A post read to its last page is now marked end, not reported as an error.
Per-post totals moved to one free post_summary row per post.
[0.0.2] - 2026-09-03
Prices recorded on the platform. Gold, Platinum and Diamond share one rate.
[0.0.1] - 2026-09-03
First release.
What it does
Paste an Instagram post or reel link and get its comments as rows — text, author, timestamp,
like count — with reply threads returned as their own rows, and optionally the accounts that
liked each individual comment. @mentions and #hashtags are pulled out of the text into their
own columns, so a tag-a-friend giveaway reads as an entrant list without any parsing on your
side. A second output view, Commenters, shows the same rows trimmed to the person and who
they tagged.
Two things worth knowing before your first run
Instagram serves fewer comments than a post says it has. The number on the post counts
replies, hidden comments and deleted comments, so it is normally higher than anything that can
be read back. Across eight posts read to the very end of Instagram's cursor, the share
delivered ranged from 39% to 75%, median 44% — with nothing capping those runs.
Rather than promise a total that cannot be met, every comment row carries the count its post
declares, and each post gets one extra free row with what was actually delivered and why reading
stopped: the list ran out, a cap was reached, the source stopped answering, or comments are
switched off on that post. The run says the same thing in plain words when it finishes, and
writes it to COMMENT_COVERAGE for anything reading programmatically.
Duplicates are removed before you are charged. Instagram occasionally serves the same
comment on two different pages. This actor recognises the repeat by Instagram's own comment id
and drops it, so you are billed once per comment and never receive one twice — including
across a restart, where the ids already delivered are read back from your own results rather
than assumed.
Included
Comments from any public post or reel, up to 50 links per run.
Reply threads, on by default; each reply carries the comment it answers.
Comment likers, off by default and priced as a separate, cheaper event.
Private accounts are included. Roughly six commenters in ten on a busy post have a
private profile; their comment is public and it is in your results.
A per-post cost ceiling, counted in comments — a reply is a comment and spends from the same
allowance, so the cap bounds what you pay either way.
Posts read in turn, a page at a time, so one viral link cannot consume a whole run and leave
the others empty.
Every link that could not be read comes back as its own free row naming the link and the
reason — a mistyped address, a deleted post, or a post inside a private account are told
apart, because only two of the three are worth retrying.
Resume: uncheck Start a Fresh Run to continue from where the last finished run stopped.
Not included, on purpose
There is no sort order. Instagram exposes no ordering control on this data, so no tool can
offer one honestly. Comments arrive in the order Instagram serves them, with each reply
directly behind the comment it answers — which is the only order a thread reads correctly in.