Instagram Comments Scraper - Post & Reel Comments
Under maintenancePricing
Pay per event
Instagram Comments Scraper - Post & Reel Comments
Under maintenanceInstagram nests replies under a comment, and both levels come back marked: who wrote it, what they said, when, likes and reply count. Nothing for you to log in to and no cookie to paste. $0.40 per 1,000 rows, plus a $0.001 run start.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Comments Scraper β Post & Reel Comments
Give it an Instagram post or reel and it returns the comment thread as flat rows: who wrote each comment, what it says, when it was posted, how many likes it has, how many replies hang off it, and whether the author is verified. Export as JSON, CSV or Excel, or have each run delivered into a Notion data source.
There is nothing for you to log in to and no cookie to paste.
What a row looks like
{"type": "comment","id": "18133156861661238","mediaId": "3968217932266054373","text": "this is unreal π₯","likeCount": 42,"replyCount": 3,"createdAt": "2026-08-19T17:35:58.000Z","ownerUsername": "real_user","ownerId": "9876543210","ownerVerified": false,"isReply": false,"parentCommentId": null}
Replies come back too, as their own rows. A reply has isReply: true and parentCommentId set to
the comment it answers, so you can rebuild the thread or filter replies out with one condition.
Replies count towards maxComments and are charged like any other row.
How much of a thread you get
A run reads a fixed number of pages from the top of the thread. Instagram serves 15 comments per page, and any replies it inlines with them come along at no extra cost, so a run returns about 75 rows on a plain thread and up to 150 when the thread is reply-heavy. On a 4,487-comment NASA post it returned 76.
That is the whole story: this is not a tool for draining a 100,000-comment post, and running it
again does not reach further in β it reads from the top each time. If a run stops before your
limit it writes one free PARTIAL row saying so, instead of finishing quietly and letting you
think you have the whole thread.
Instagram serves comments ranked, not strictly newest-first, so what you get is the top of the thread as Instagram orders it.
Input
| Field | Type | Description |
|---|---|---|
postUrls | array | Post, reel or TV URLs (/p/β¦, /reel/β¦, /tv/β¦). As many as you like. |
shortcodes | array | Or bare shortcodes β the part of the URL after /p/ or /reel/. |
maxComments | integer | Total rows to return, split evenly across the posts you gave. 1β150, default 100. See "How much of a thread you get". |
sessionCookies | array | Optional, and normally left empty. Supply your own Instagram sessionid if you would rather the run read through your own account; it is then used on its own. |
proxyConfiguration | object | Optional. Set proxyUrls only if you want your own proxy servers used. |
notionConnector | string | Optional Notion connector ID. |
notionParentId | string | Optional Notion data-source ID. |
When there is nothing to return
An empty dataset with a green tick is the worst possible answer, so this actor does not give one. Every run that comes back without comments writes a free row naming the reason, and the run itself fails unless the honest answer really is "this post has no comments":
| What happened | errorCode | Run result |
|---|---|---|
| Instagram says comments are switched off on this post | COMMENTS_DISABLED | fails |
| The post is deleted, private or the URL is wrong | NOT_FOUND | fails |
| Instagram says the post has comments but would not open the thread | BLOCKED | fails |
| Instagram reports zero comments on the post | NO_RESULTS | succeeds |
| The run hit its page budget part-way through | PARTIAL | succeeds, keeps what it read |
Those rows carry ok: false and are never charged the per-comment fee.
Try it for free
Run it with no post URLs at all and you get five clearly-labelled example rows showing the exact
output shape β each one carries sampleData: true and a _notice saying it is not real data. They
are never charged the per-comment fee. Sample rows appear only when you asked for no posts; a
run that names a real post never answers with invented data.
Pricing
$0.0004 per comment row returned β $0.40 per 1,000 β plus the $0.001 Apify run-start fee that applies to every run. One flat rate at every volume.
You are charged for comment rows that are actually delivered. Diagnostic rows, sample rows and duplicates are not charged. A run that returns no comments pays the run-start fee and nothing else, whether it succeeded or failed β the start fee is charged by Apify the moment a run begins, so no run is completely free.
FAQ
Do I need an Instagram account or a cookie? No. Leave sessionCookies empty.
Then why is sessionCookies still there? Because some people would rather the run read through
their own account. If you paste a sessionid it is used on its own and takes priority over
everything else. Use a throwaway account if you do β automated reading gets accounts
rate-limited.
Posts or reels? Both, plus IGTV. /p/, /reel/ and /tv/ all work.
Why did I get fewer comments than maxComments? Either the thread ran out, or the run hit its
page budget. Check the PARTIAL or NO_RESULTS row in the dataset β it says which.
Can I get every comment on a huge post? No. See "How much of a thread you get" above.
Will I be charged for a post that returns nothing? Not the per-comment fee. Only the $0.001 run-start fee, which Apify charges on every run.
How do I get results into Notion? Set notionConnector and notionParentId and each run is
delivered automatically.
Want the posts themselves, profiles, hashtags or locations? There are companion actors for each.
