Instagram Comments Scraper - Post & Reel Comments
Pricing
from $0.38 / 1,000 results
Instagram Comments Scraper - Post & Reel Comments
Scrape comments and replies from a public Instagram post or reel. Every row has the author's username and name, the text, the time, likes, reply count and the verified flag; GIF comments come with a title and link. One run reads the top 75 to 150 rows. $0.40 per 1,000 rows.
Pricing
from $0.38 / 1,000 results
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
38
Total users
11
Monthly active users
16 hours
Issues response
6 days ago
Last modified
Categories
Share
Paste an Instagram post or reel link and get its comments and replies back as flat rows: who wrote each comment, by username and by name, what it says, when, how many likes it picked up, how many replies hang off it, and whether the author is verified. A comment that is only a GIF comes back with the GIF's title and a link to it.
Here is the part worth knowing before you start, because it changes what you should ask for. This reads the top of a thread, not the whole thing. One run comes back with roughly 75 rows on a plain thread and up to 150 when Instagram inlines a lot of replies. Running it again does not reach further down. It reads from the top each time. On the free Apify plan a run reads one page of the first post, roughly 15 to 30 rows.
| Input | Post or reel URLs, or bare shortcodes |
| Output | One row per comment or reply: text, author username and name, verified flag, likes, reply count, time, GIF title and link |
| Ceiling | 150 rows per run |
| Account needed | None |
| Price | $0.40 per 1,000 rows on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 12,500 |
🔍 What Instagram Comments Scraper does
You give it links, it gives you the conversation under them. Comments and replies land in the same
row shape, so you can drop the lot into a sheet without branching on type. A reply carries
isReply: true and a parentCommentId, which is enough to rebuild the tree or to filter replies
out with one condition.
You don't need an Instagram account.
If you do happen to have an Instagram sessionid and would rather the run read through your own
account, put it in sessionCookies. Most people leave it
empty and never think about it again.
Instagram serves comments ranked rather than strictly newest first, so what you get is the top of the thread the way Instagram orders it.
📋 What data you get from each Instagram comment
| What you get | Field |
|---|---|
| The comment's id, and the post it sits under | id, mediaId |
| What it says | text |
| A GIF-only comment's title and link | hasGif, gifTitle, gifUrl |
| Likes and how many replies it has | likeCount, replyCount |
| When it was written | createdAt |
| Who wrote it | ownerUsername, ownerFullName, ownerId, ownerVerified |
| Whether it is a reply, and to which comment | isReply, parentCommentId |
▶️ How to scrape Instagram comments
- Open Instagram Comments Scraper and click Try for free.
- Paste your links into Post URLs, one per line.
- Set Max comments. Start at 15 while you look at the output shape.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Start it with no post at all and you get five labelled sample rows, which are not charged.
💰 How much does it cost to scrape Instagram comments?
$0.40 per 1,000 comment rows on the Free plan. Paid plans pay a little less: $0.395 on Starter, $0.39 on Scale and $0.385 on Business. On the free plan, the $5 Apify gives you each month covers about 12,500 rows. On the free plan a run stops after one page and says so in a free row; a paid plan gets the full run.
You pay per row delivered. The same comment is never delivered twice in a run, so you never pay for it twice. Sample rows and diagnostic rows are not billed, and neither is a post that turns out to have nothing under it.
📥 What you give it
{"postUrls": ["https://www.instagram.com/p/Db9IVmrDvQ4/"],"maxComments": 100}
| Field | Default | What it is |
|---|---|---|
postUrls | none | Post, reel or IGTV links. /p/, /reel/ and /tv/ all work. As many as you like, one per line. |
shortcodes | none | Or the bare code after /p/ or /reel/. You can mix the two fields. |
maxComments | 100 | Rows for the whole run, split evenly across the links you gave. 1 to 150. Replies count towards it. |
sessionCookies | none | Optional. Your own Instagram sessionid, if you would rather the run read through your account. |
proxyConfiguration | none, the form fills it in | Leave it alone unless you have servers of your own you want used. |
notionConnector, notionParentId | none | Optional. Write each comment into a Notion data source as well as the dataset. |
A shortcode that cannot be a real one, wrong length or wrong characters, is rejected before any lookup happens. You get a labelled row saying so.
📤 What you get back
A real row from 26 September 2026, a brand account commenting on a football post. Its closing emoji is cut from this block:
{"ok": true,"type": "comment","id": "18107041583611449","mediaId": "3993517018170036322","text": "THE GOAT","hasGif": false,"gifTitle": null,"gifUrl": null,"likeCount": 17841,"replyCount": 108,"createdAt": "2026-09-24T21:18:00.000Z","ownerUsername": "luxury","ownerFullName": "Luxury","ownerId": "1122059043","ownerVerified": true,"isReply": false,"parentCommentId": null}
A GIF-only comment from the same run, link shortened:
{"text": "","hasGif": true,"gifTitle": "The Boys Messi GIF","gifUrl": "https://cdn.fbsbx.com/v/t59.2708-21/822297128_..._n.gif?..."}
| Field | How to read it |
|---|---|
id | Unique per comment. Use it as your dedupe key across runs. |
mediaId | Instagram's id for the post the comment sits under. It is how you tell rows apart when you sent several links. |
isReply, parentCommentId | false and null on a top-level comment. On a reply, true and the id of its parent. |
replyCount | How many replies Instagram says the comment has, which is often more than the number that came back. |
ownerFullName | The name on the commenter's profile. null when they have not set one. |
hasGif, gifTitle, gifUrl | A comment that is only a GIF has an empty text. Then hasGif is true and the other two describe the GIF. Otherwise false, null, null. |
createdAt | ISO timestamp, or null when Instagram did not supply one. Nothing is guessed. |
🧾 Reading the output
Three kinds of row can land in your dataset, and only the first kind is billed.
| Row | How to spot it | Billed |
|---|---|---|
| A comment or reply | ok: true and type: "comment" | yes |
| A sample row | sampleData: true, charged: false | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your thread. Sample rows appear only when you start a run
without naming a post, so a run that names a real post never answers with invented data.
| Code | What it means |
|---|---|
BAD_INPUT | That shortcode cannot exist. Nothing was looked up. |
NOT_FOUND | The post is deleted, private, or the link is wrong. |
COMMENTS_DISABLED | The owner switched comments off on that post. |
NO_RESULTS | Instagram returned no comments for that post: it has none yet, comments are switched off, or it is no longer public. |
FREE_PLAN_LIMIT | You are on the free Apify plan, so the run read only part of your input. postsNotRead lists what it skipped. A paid plan gets the full run. |
PARTIAL | The run delivered some rows for that post and then stopped. What arrived is complete and correct. |
TIME_LIMIT | The run reached its time limit and stopped on its own. The comments delivered before that are complete and charged. If none had come back yet, the run ends as failed. Give it more time, or ask for fewer comments. |
RATE_LIMITED | Too much traffic on that post just now. Try again shortly. |
LOGIN_REQUIRED | The thread could not be opened this time. If you supplied a cookie, check it is still valid. |
NOT_SERVED | This request was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
SERVER_ERROR | Instagram answered badly. Re-run it. |
A run that could not read what it was asked for ends as failed, with a labelled row telling you
why, because a green tick over an empty dataset is the worst answer a scraper can give. Four cases
succeed instead, each with its own row: a post with no comments (NO_RESULTS), comments switched
off (COMMENTS_DISABLED), a link that is not a post (BAD_INPUT) and a post that no longer exists
(NOT_FOUND). If at least one link produced comments, the run succeeds and the rest get their own
rows. No diagnostic row is billed as a comment.
💡 What people use it for
- Reading what people actually said under a launch post, rather than counting the likes.
- Going through the entries on a giveaway or a competition post by hand.
- Collecting a few hundred comments across a set of posts to see which complaint keeps coming up.
- Checking whether a creator's engagement looks like a conversation or like the same ten accounts.
🚧 What it does not do
- No full export of a big thread. Roughly 75 rows, up to 150 with a lot of inlined replies, and then it stops. A 4,000-comment post returns the top of the thread and says so.
- Replies come back only where Instagram sends them alongside the comment. There is no separate pass that walks into each reply thread.
- Order is Instagram's ranking, not newest first, and you cannot change it.
- No private accounts. Public posts and reels only.
- No comment likers, no editing, no posting, no deleting. This reads.
- It is not an official Instagram tool. Dami's Studio is independent and is not affiliated with or endorsed by Instagram or Meta, or by any other company named on this page.
🧭 Which Instagram scraper do you need?
| If you want | Use |
|---|---|
| Comments under a post or reel | This one |
| The post itself, caption and counts | Instagram Post Scraper |
| Everything one account has posted | Instagram Scraper |
| Posts under a hashtag | Instagram Hashtag Scraper |
| Reels, with plays and audio | Instagram Reel Scraper |
| Posts that tag or mention an account | Instagram Mentions Scraper |
| Comments under a Facebook post or reel | Facebook Comments Scraper |
| Comments under a TikTok video | TikTok Comments Scraper |
❓ Questions people ask
Do I need an Instagram account to scrape comments?
No. Leave sessionCookies empty and it works. The field is there for people who would rather the
run read through their own account.
Can I get every comment on a huge post?
No, and that is a real limit rather than a setting you can turn up. A run reads the top of the thread, about 75 to 150 rows.
Why did I get fewer rows than I asked for?
Either the thread ran out, or the run reached the end of what it reads in one pass. The
NO_RESULTS or PARTIAL row in your dataset says which.
Why is the order different from what I see in the app?
Instagram ranks comments rather than listing them newest first, so the app and a run can put them in a different order. Rows come back in Instagram's order, top first. Like and reply counts are a snapshot at read time.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has
ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP
client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-comments-scraper.
Either way the run happens on your Apify account at the same price.
Is scraping Instagram legal?
This reads public posts only, never private accounts or messages. Comments still contain personal data, which GDPR and similar laws cover, so have a reason for collecting them. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the post link you used and the run ID. The code on the diagnostic row usually explains it on its own.