Instagram Comments Scraper — Scrape Instagram Comments, Replies avatar

Instagram Comments Scraper — Scrape Instagram Comments, Replies

Pricing

from $0.60 / 1,000 comments

Go to Apify Store
Instagram Comments Scraper — Scrape Instagram Comments, Replies

Instagram Comments Scraper — Scrape Instagram Comments, Replies

Scrape Instagram comments and their replies for any post, reel or IGTV URL — text, author, likes, timestamps. No login. Replies open thread by thread until the run's reply budget is spent, and each comment says whether its thread was opened. A reply costs the same. From $0.60 per 1,000 comments.

Pricing

from $0.60 / 1,000 comments

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

44

Total users

19

Monthly active users

2 hours ago

Last modified

Share

Paste the Instagram post, reel or IGTV links you want and get the comments underneath them: text, author, likes, timestamp, and the replies in each thread. No login, no cookies, no proxy to configure. Your limit is exact and it is per post — set 200 and you get 200 from each link, and a comment we could not deliver is never charged. Replies cost the same as a top-level comment, on the same single event. Nothing is charged for starting a run.

Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/instagram-comments-scraper

  • Actor id: steadyfetch/instagram-comments-scraper
  • Input: { "postUrls": ["CA2aJYrg6cZ"] } — the one field to set. A bare post code as shown, or the whole post, reel or IGTV link you copied. Add "resultsLimit": 200 and "includeReplies": true to set the per-post limit and pull the threads.
  • Cap the bill: set maxTotalChargeUsd on the run (a run option, not Actor input), e.g. 0.50 — the run stops when it reaches it.
  • Price: from $0.60 per 1,000 comments on Gold and above, $2.40 per 1,000 on the Apify free plan — a reply is charged on that same event, at that same price. No start fee, and a comment we could not deliver is never charged. Full table below.
  • How often it changes: comments keep arriving for days after a post goes up and the busiest hours are the first few, so the useful pattern is the same links again tomorrow. A re-run charges nothing for what you hold: it reads on past the comments you already have to the ones you do not have yet.
  • Run it on a schedule: save your input as a Task (Actor page → Save as a new task), then add that task to an Apify Schedule (Console → Schedules → Create) with a cron such as 0 7 * * * for daily. Comments this account already received in the last 90 days are skipped and not charged again, so a daily watch on the same links pays only for what is new.

Unofficial. Not affiliated with, endorsed by, or sponsored by Instagram or Meta Platforms, Inc.

What you get

One row per comment, at one price — a reply is a row like any other, and there is no second charge for "threads":

ColumnWhat it holds
commentIdthe comment's own Instagram id
textwhat they wrote (empty when the comment is a GIF — isGif says so)
username · userFullName · userId · userIsVerifiedwho wrote it
likeCountlikes on the comment
isReply · parentCommentId · repliedToCommentIdwhether it is a reply, to which comment, and to which reply inside the thread
replyCount · repliesCollectedhow many replies the comment has, and whether this run opened the thread
createdAtwhen it was posted, ISO-8601 UTC
isPinned · isEdited · isByPostAuthorpinned by the author, edited, or left by the account that posted
postShortcode · postUrl · sourcewhich post it belongs to (source is always instagram)
charged · status · statusReasonwhether this row was billed, and why, so your invoice reconciles from the dataset itself

Replies land directly under the comment they answer, so the thread reads in order. The requesting network address is stripped out of every link before it reaches your dataset.

What a row looks like

One delivered row from a real run — the post DcOX3hWFiey, 2026-09-11. Every comment is one comment charge, and a reply costs the same as a top-level comment: isReply and parentCommentId tell them apart. Profile pictures are signed and time-limited by Instagram, so they are shown here as placeholders.

{
"commentId": "17979728991110710",
"postShortcode": "DcOX3hWFiey",
"postUrl": "https://www.instagram.com/p/DcOX3hWFiey/",
"text": "Image description: The Tarantula Nebula—vibrant and colorful. Clouds of red, yellow, orange, and green crest over a background of deep blue haze, black space, and red stars. Bright spots of light line the center, causing parts of the clouds to glow luminous gold.",
"username": "nasa",
"userId": "528817151",
"userFullName": "NASA",
"userIsVerified": true,
"userProfilePicUrl": "https://…",
"isReply": false,
"parentCommentId": null,
"repliedToCommentId": null,
"likeCount": 2213,
"replyCount": 0,
"createdAt": "2026-08-19T14:11:50.000Z",
"isPinned": true,
"isEdited": false,
"isByPostAuthor": true,
"isGif": false,
"repliesCollected": true,
"source": "instagram",
"input": "https://www.instagram.com/p/DcOX3hWFiey/",
"sourceIndex": 0,
"scrapedAt": "2026-09-11T10:25:40.411Z",
"repeat": false,
"charged": true,
"status": "delivered",
"retryable": false,
"statusReason": null,
"#k": "17979728991110710",
"#ce": {"comment":1},
"#ask": {"delivered":1}
}

Price

One charged event, comment, and it lands only on a comment that was actually delivered. A reply is charged on that same event, at that same price.

Apify planPer commentPer 1,000 comments
Free plan$0.0024$2.40
Bronze$0.0014$1.40
Silver$0.0009$0.90
Gold and above$0.0006$0.60 per 1,000

Platform usage is included in that price — there is no separate compute bill on top, and no start fee. Set maxTotalChargeUsd on the run and it is a hard ceiling: the run stops cleanly under it and the last row says what is left.

Honest rows: what "not charged" actually means

Every run closes its own books. A post that returned less than it was asked for leaves an uncharged row saying which of nine things happened, and none of them is billed:

  • post_not_found — Instagram has nothing at that link: wrong code, private account, or the post was deleted. A definitive answer about your link. A post that served comments and then stopped is not this one — that is the end of its comment list, below.
  • no_comments — Instagram's own answer about the post, and the row says which half it is. The post is real and has none, because comments are turned off for it or nobody has commented yet; or it served no further page after the comments you were given — including when the page it pointed us at had nothing behind it, which is how this feed ends a list. Or an earlier run on your account had already read that post to the end and its published comment count has not moved since, so this run did not buy the pages below the first — the row names the day that read happened and the count it is unchanged from. A definitive answer, not a failure, and a re-run returns the same one.
  • skipped.page_cap — one of this actor's own bounds stopped the walk: it reads at most 400 comment pages for a single post, so one post cannot spend a whole run. Instagram had more to give — that bound is ours, the row says so, and it tells you how to carry on from where the run stopped.
  • skipped.all_repeat — this actor's other bound: the pages it read held only comments you already have, so the walk stopped rather than keep buying pages that add nothing. How far it reads past comments you already have grows with the number of comments you ask for per post — at least three pages, more for a bigger ask — so a higher per-post limit reaches further down the list. That bound is ours too, and the row names the setting that collects them again.
  • stopped_at_limit — one of your own limits, the run clock, or the Apify free plan's daily allowance (below) stopped it first. The row names which — for the daily allowance, ONE row counts every comment it held and says when it resets (UTC).
  • vendor_unavailable — the read did not go through. Temporary, says nothing about your post, and a re-run is the fix. If comments for that post had already been delivered before it went dark, the row opens with how many: those were charged, as each of their rows says, and the re-run is for the rest.
  • source_refused — Instagram refused to answer for that link at all, and it refuses it the same way every time, so a re-run cannot change it. Open the link in a browser; if the post is there, say so on the Issues tab.
  • unsupported_shape — Instagram answered in a shape this actor does not read yet. That is on us, not on your post, and a re-run gets the same answer — tell us on the Issues tab which post it was and support for it will be added.
  • vendor_budget — this actor's own data budget stopped the run rather than collecting more. Usually that is its budget for one run, and a new run on the same links continues, skipping comments you already have; rarely its data source is paused until the start of next month. The row says which.

The last row of every run is a receipt: delivered, how many were replies, asked for, what was skipped, what stopped it, and the charged-event totals. A time limit ends the collecting, never the delivering — comments already in hand are always written out.

How often this data changes

Comments keep arriving on a post for days after it goes up, and the busiest hours are the first few. So the useful pattern here is not one run — it is the same links again tomorrow. Re-running would otherwise re-buy the comments you already have, so it does not: every run remembers what it delivered to your account, in the key-value store ig-comments-account in your own Apify account, and a later run skips those. Not delivered again, not charged, and the slot goes to the next new comment instead, so you still get the number you asked for. Holding the top of a post's comment list does not stop a re-run there: it reads on past the comments you already have to the ones below them — how far grows with Max comments per post, at least three pages and more for a bigger ask — and only the new comments it delivers are charged. The memory is a key-value store in your own Apify account, so a run started with a scoped API token in restricted-access mode needs key-value store Read, Write and Create permission (Write is what lets the run remember what it delivered; without it every run pays again) or Actor runs set to Full access; without it the run says so on its status line and on an uncharged row, and cannot skip the comments you already have. A post your account has already read to the end is not walked again either: the run reads its first page — the page that says whether anything has been added — and where that page holds only comments you already have and the post's own published comment count has not moved since, it stops there rather than buying the pages below it, and the row says so. The moment that count rises, the run goes and collects what is new. That makes a daily watch on the same posts cost only what is new, as long as the token the watch runs on can open that store. Switch Include comments you already have on to get them back anyway, marked repeat: true and still uncharged, and use Skip comments in this dataset to carry the same memory across accounts.

A plain cadence to schedule: daily for a post in its first week, weekly after that. Most comments land in a post's first days, so a weekly run on an older post still catches what has trickled in since, and pays only for that.

Replies, and when a thread is not opened

With Include replies on (the default), a comment that has a thread gets that thread collected and delivered right under it, at the same price. A very long run of one-reply threads costs more to collect than the comments are priced at, so the run bounds that: when it happens, the remaining threads are left unopened, those comments carry repliesCollected: false, and the run line and the receipt both say so rather than leaving you to notice. Top-level comments are never affected.

Reliability

The comments come from a licensed data feed rather than from scraping Instagram's own web pages, which is why there is nothing to log into and nothing to configure. When that feed cannot answer, the run says so on an uncharged row and finishes successfully — a failed read is never billed and never dressed up as a post with no comments.

Limits and good manners

Your settings are never refused for being too big. This actor delivers up to 5,000 comments per post (resultsLimit) and runs for up to 1 hour (maxRunSeconds, minimum 30 seconds). Ask for more than that — or for a shorter clock — and the run still starts: it continues at the nearest limit and leaves one uncharged row saying what you asked for and what bound it. Nothing is refused before it starts.

On the Apify free plan this actor makes at most 30 pages of comments per account in any 24 hours (a reply thread is one page), and accounts on that plan share one daily allowance on this actor. Past either, the run keeps everything it already delivered, ships one uncharged row saying when it resets (UTC), and charges nothing past it. Paid Apify plans carry no daily allowance.

Only public posts are returned. Instagram serves comments in its own ranked order rather than strictly newest-first, and a very deep ask on a post will eventually run out — the run says so instead of padding. This actor may stop working if Instagram changes how the data is served; if it does, failed items are never charged.

Support

Something off, or a column you need that is not here? Open an issue on the Issues tab — we usually reply within a couple of hours.

If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.