Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Instagram Comments Scraper icon

Instagram Comments Scraper

Scrape comments from any public Instagram post or reel: text, author, likes, replies and timestamp. Nothing to log into. $0.40 per 1,000 rows.

408 runs on Apify $0.0004 per result ($0.4 / 1,000)
Run this in the cloudRun on Apify →

Social Media Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust postUrls, shortcodes, maxComments (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0004 per result = $0.4 per 1,000

You are charged forWhenPrice
Result returnedCharged per result returned. Failed/empty runs not charged.$0.0004

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-04, and they are what you are actually charged.

Inputs

FieldWhat it doesType
postUrlsInstagram post or reel URLs to read comments from. Paste as many as you like, one per line.array
shortcodesOr bare post shortcodes, the part of the URL after /p/ or /reel/.array
maxCommentsHow many comment rows to return in total, spread evenly across the posts you gave. Replies that Instagram returns alongside a comment are delivered as their own rows, marked `isReply`, and count towards this number. You are charged per comment row returned. One run reads a fixed number of pages from the top of the thread: expect about 75 rows on a plain thread and up to 150 when Instagram inlines a lot of replies. If a run stops short it says so in a free row rather than pretending it finished.integer
notionConnectorOptional Notion delivery.string
notionParentIdOptional Notion data-source id.string
sessionCookiesLeave this empty, nothing needs to be logged in for comments to come back. It exists only if you would rather the run read Instagram through your own account: paste the `sessionid` cookie value (F12 -> Application -> Cookies -> instagram.com). Use a throwaway account if you do. When set, this is used on its own and takes priority over everything else.array

What you get

A structured dataset — each result includes fields like:

textgifTitleownerUsernameownerFullNamelikeCountreplyCountisReplycreatedAtmediaId

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

5 ready-to-run use cases

Instagram Comment Scraper: Pull a Post's Comments

Comment text, author handle, like count, reply count and timestamp from any public post URL. Replies are marked, so threads stay readable.

Instagram Comment Analysis for a Product Launch Post

150 comments off a launch post with text, handle and like count, ready to sort by engagement or run through your own sentiment pass.

Export Instagram Comments from a Viral Post to CSV

Up to 200 comments with author, text, likes and replies, exported as CSV, JSON or Excel. Top-level comments and replies are labelled separately.

Instagram Comments API: Pull a Post by Shortcode

Give it the shortcode from a post URL instead of the whole link. Returns comment text, author, likes, replies and whether the row is a reply.

Instagram Comments Download from a Reel, as JSON

Reels take the same URL as posts here. Each row carries the comment, the handle, likes, reply count and when it was posted.

Related tools in Social Media Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Twitter (X) Search Scraper iconSocial Media Scrapers

Twitter (X) Search Scraper

Scrape X (Twitter) search by keyword or advanced query. Get the full text, engagement, media and author. No login needed from you. $0.40 per 1,000 tweets.

5 use cases

Twitter (X) List Scraper iconSocial Media Scrapers

Twitter (X) List Scraper

Scrape every tweet from an X (Twitter) list. Get full text, likes, retweets, views, hashtags, media and author. No login. $0.40 per 1,000 tweets.

1 use cases

Threads Scraper iconSocial Media Scrapers

Threads Scraper

Scrape public Threads profiles and recent posts with no login. Rows carry bios, followers, post text, likes, timestamps and media URLs. $0.40 per 1,000 rows.

1 use cases

Facebook Pages Scraper iconSocial Media Scrapers

Facebook Pages Scraper

Scrape public Facebook Page names, handles, likes, talking-about counts and verified badges. Up to 10 Pages per run. No login needed from you.

Ready to run — no setup

LinkedIn Profile Posts Scraper iconSocial Media Scrapers

LinkedIn Profile Posts Scraper

Scrape LinkedIn profile posts with no login: post text, author, image, publish time and URL. $0.90 per 1,000 posts, flat on every plan.

1 use cases

LinkedIn Company Posts Scraper iconSocial Media Scrapers

LinkedIn Company Posts Scraper

Scrape public posts from any LinkedIn company page: post text, reactions, comments and URLs. No login or cookies. $0.90 per 1,000 posts.

Ready to run — no setup

See all Social Media Scrapers →

Instagram Comments Scraper: comments and replies from a public post or reel

Paste a post or reel link and get the thread 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. Replies arrive as their own rows pointing at the comment they answer.

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.

InputPost or reel URLs, or bare shortcodes
OutputOne row per comment or reply
Ceiling150 rows per run
Account neededNone from you
Price$0.40 per 1,000 rows, flat on every plan

🔍 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.

Nothing to log into. No cookie to paste, no app review, no business API approval.

If you do happen to have an Instagram sessionid and would rather the run read through your own account, put it in sessionCookies. When it is set it is used on its own. 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 you give it

{
  "postUrls": ["https://www.instagram.com/p/Db9IVmrDvQ4/"],
  "maxComments": 100
}
FieldDefaultWhat it is
postUrlsnonePost, reel or IGTV links. /p/, /reel/ and /tv/ all work. As many as you like, one per line.
shortcodesnoneOr the bare code after /p/ or /reel/. You can mix the two fields.
maxComments100Rows for the whole run, split evenly across the links you gave. 1 to 150. Replies count towards it.
sessionCookiesnoneOptional. Your own Instagram sessionid, if you would rather the run read through your account. Use a throwaway one if you do.
proxyConfigurationApify defaultLeave it alone. Set proxyUrls inside it only if you have servers of your own you want used.
notionConnector, notionParentIdnoneOptional. 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?..."
}
FieldWhat it is
idUnique per comment. Use it as your dedupe key across runs.
mediaIdInstagram's id for the post the comment sits under. It is how you tell rows apart when you sent several links.
isReply, parentCommentIdfalse and null on a top-level comment. On a reply, true and the id of its parent.
replyCountHow many replies Instagram says the comment has, which is often more than the number that came back.
ownerFullNameThe name on the commenter's profile, next to ownerUsername. null when they have not set one.
hasGif, gifTitle, gifUrlA comment that is only a GIF has an empty text. Then hasGif is true, gifTitle is the GIF's own title ("Ronaldo Goat GIF") and gifUrl links to it. Otherwise false, null, null.
createdAtISO timestamp, or null when Instagram did not supply one.

Nothing is guessed. A field Instagram did not send comes back null.

🧾 Reading the output

Three kinds of row can land in your dataset, and only the first kind is billed.

RowHow to spot itBilled
A comment or replyok: true and type: "comment"yes
A sample rowsampleData: trueno
A diagnosticok: false and a codeno

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.

The code on a diagnostic row says what happened:

CodeWhat it means
BAD_INPUTThat shortcode cannot exist. Nothing was looked up.
NOT_FOUNDThe post is deleted, private, or the link is wrong.
COMMENTS_DISABLEDThe owner switched comments off on that post.
NO_RESULTSInstagram returned no comments for that post: it has none yet, comments are switched off, or it is no longer public.
PARTIALThe run delivered some rows for that post and then stopped. What arrived is complete and correct.
RATE_LIMITEDToo much traffic on that post just now. Try again shortly.
BLOCKED, LOGIN_REQUIREDThe thread could not be opened this time. If you supplied a cookie, check it is still valid.
SERVER_ERRORInstagram 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.

▶️ How to run it

1. Open Instagram Comments Scraper and click Try for free. 2. Paste your links into Post URLs, one per line. 3. Set Max comments. Start at 15 while you look at the output shape. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.40 per 1,000 comment rows. Flat on every Apify plan, no volume tiers.

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 people use it for

  • Reading what people actually said under a launch post, rather than counting the likes.
  • Pulling the commenters on a giveaway or a competition post into a list to work through 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.

  • Running it again does not go deeper. It starts from the top every time.
  • 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.
  • A run that gets nothing anywhere ends as failed, with a labelled row saying why, except the

four cases above.

🧭 Which Instagram scraper do you need?

If you wantUse
Comments under a post or reelThis one
The post itself, caption and countsInstagram Post Scraper
Everything one account has postedInstagram Profile Scraper
Posts under a hashtagInstagram Hashtag Scraper
Reels, with plays and audioInstagram Reel Scraper

❓ Questions people ask

Do I need an Instagram account? No. Leave sessionCookies empty and it works.

Then why is the cookie field there? Because some people would rather the run read through their own account. Paste a sessionid and it is used on its own. Use a throwaway account if you do.

Posts or reels? Both, and IGTV. /p/, /reel/ and /tv/ links all work.

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.

Can I get every comment on a huge post? No, and that is a real limit rather than a setting you can turn up.

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.