# Instagram Comments Scraper

> Paste links to Instagram posts or reels and get every comment, with its text, date, likes and the post it was left on.

Instagram Comments Scraper takes links to Instagram posts or reels and returns every comment Instagram shows, newest first, back to the very first one. Each comment is one row with its text, date, likes, the commenter and the post it was left on. Replies to comments are not included, because Instagram shows them only to people who are logged in.

- Web page: https://keklik.io/scrapers/instagram-comments-scraper
- Apify Actor: `keklik/instagram-comments-scraper` (https://apify.com/keklik/instagram-comments-scraper)
- You enter: Links to Instagram posts or reels
- You get: Comment text, date, likes, the commenter and the post
- Status: working, last tested 12 Nov 2026
- Needs: an Apify account (free is enough to try). No login to the site itself.

## Price per 1,000 comments

US dollars, on each Apify plan. Apify's platform costs are included. Add-ons are charged only when switched on in the input.

| Charge | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| Comment: Each comment the scraper saves. | $1.00 | $0.90 | $0.80 | $0.70 |

Apify's plans and a calculator: https://keklik.io/pricing.md

## Input

The run input is a JSON object with these keys:

- `urls` (array, required): Posts or reels. One per line: a post link, a reel link or just its shortcode, such as DeTUk4sDSp-. The posts must be public.
- `maxCommentsPerPost` (integer, optional): Max comments per post. Stops each post after this many comments, newest first. Leave it empty for every top-level comment.
- `newerThan` (string, optional): Newer than. A UTC date such as 2026-01-31, or a period back from now such as 24h, 7d or 2w. Leave it empty for comments of any age.
- `maxResults` (integer, optional): Max results. Stops the whole run after this many comments, across all posts. Leave it empty for no limit.

Example input:

```json
{
  "urls": [
    "https://www.instagram.com/p/DeTUk4sDSp-/",
    "https://www.instagram.com/p/DeJ28eTxo4s/",
    "https://www.instagram.com/p/DeaMlUSEpgs/",
    "https://www.instagram.com/p/DeSM5CYPDfd/",
    "https://www.instagram.com/p/DePHLhtON_i/",
    "https://www.instagram.com/p/DeMIwYYPAMt/",
    "https://www.instagram.com/p/DeK6OuDNzWC/",
    "https://www.instagram.com/p/DeKe6teEpya/",
    "https://www.instagram.com/p/DdG4RIxIPyf/",
    "https://www.instagram.com/p/DdhFkS7KGkZ/"
  ],
  "maxCommentsPerPost": 300
}
```

## Output: one row per comment

23 fields in 5 groups.

### Comment

- `text`: Comment text. Comment text.
- `timestamp_datetime`: Date. When the comment was written, ISO 8601 in UTC.
- `timestamp`: Date (Unix). When the comment was written, Unix seconds.
- `likes_count`: Likes. Number of likes on the comment.
- `is_edited`: Edited. True when the commenter edited the comment.
- `is_covered`: Hidden as offensive. True when Instagram hides the comment behind a warning as possibly offensive.
- `comment_url`: Comment URL. Link to the comment.
- `comment_id`: Comment ID. Instagram comment ID, as a string.

### GIF comments

- `giphy_url`: GIF URL. GIF image link, for GIF comments. Empty otherwise.
- `giphy_id`: GIPHY ID. GIPHY ID, for GIF comments. Empty otherwise.

### Commenter

- `owner_username`: Commenter username. Username of the commenter.
- `owner_profile_url`: Commenter profile URL. Link to the commenter's profile.
- `owner_profile_pic_url`: Commenter profile picture. Profile picture link of the commenter. Instagram image links expire after a while.
- `owner_id`: Commenter ID. Instagram user ID of the commenter, as a string.
- `owner_is_verified`: Commenter verified. True when the commenter has a verified badge.

### Post

- `post_owner_full_name`: Post author name. Display name of the post's author.
- `post_owner_username`: Post author username. Username of the post's author.
- `post_owner_is_verified`: Post author verified. True when the post's author has a verified badge.
- `post_comments_count`: Post comment count. Comment count Instagram shows on the post. It includes replies, which are not scraped.
- `post_url`: Post URL. Link to the post or reel.
- `post_owner_id`: Post author ID. Instagram user ID of the post's author, as a string.

### Search details

- `source_url`: Input. The input this comment came from, as you entered it.
- `scraping_time`: Scraped at. When the row was scraped, ISO 8601 in UTC.

## How it works

1. Paste the posts. Add as many post or reel links as you like, one per line.
2. Every comment, newest first. You get every comment Instagram shows, back to the very first one. Replies to comments are not included: Instagram shows them only to people who are logged in.
3. Keep only the comments you want. Keep only recent comments, or stop at a number per post or for the whole run.
4. Download your list. As a spreadsheet, in Google Sheets, or into your own reports.

## Use cases

- Social listening: Read what people write under your posts, a competitor's or a campaign's, and catch complaints and questions early.
- Sentiment analysis: Thousands of comments as a dataset for sentiment, topic or language analysis.
- Giveaways: Every comment on a contest post, with usernames and dates, so you can pick winners fairly.
- Checking influencers: See who comments on a creator's posts and how many of them are verified accounts.

## Good to know

Instagram shows replies to logged-in users alone, so you get top-level comments only. Replies still count towards the total on the post, which is why you usually get fewer rows than that number. Comments Instagram has hidden or restricted are left out.

## Questions

### Is it legal to scrape Instagram comments?

The scraper reads only what Instagram shows publicly to visitors who are not logged in. Comments are still personal data of the people who wrote them: their usernames, user IDs, profile pictures and words. If you are in the EU or handle data of people there, the GDPR applies, and other countries have similar laws. Make sure you have a lawful reason to collect and use the data, keep only what you need, and ask a lawyer if you are unsure.

### Do I need an Instagram account?

No. You don't need an Instagram account, a login or cookies, and there is nothing to set up. Your own account is never used, so it cannot be blocked.

### Can I scrape replies to comments?

No. Instagram shows replies only to logged-in users, so you get top-level comments only. Instagram counts replies in the comment total it shows on the post, so you usually get fewer rows than that total. On one reel showing 6,790 comments, the scraper returned 5,225 top-level comments.

### Can I sort comments by "most relevant"?

No. "Most relevant" ordering is available only when logged in. Comments always come newest first. That is why Newer than is a cheap way to collect only recent comments: each post stops at the first comment older than your cutoff.

### How many comments can I get from one post?

Every top-level comment Instagram shows. In our tests the scraper went back to the very first comment of a reel with 6,790 comments in about 7 minutes. Instagram leaves out comments it has hidden or restricted, so those don't appear.

### Can I scrape comments from private accounts?

No. Posts of private accounts are not public, so they are reported as not_found.

### Can I get comments together with post data?

Yes. The Instagram Post Scraper and Instagram Reels Scraper can add a few of each post's newest comments to their own rows with their Comments per post setting. Use this Instagram comments scraper when you want many comments per post, or each comment as a row of its own.

### What happens when a run fails?

The run's status message says why, and the log names each input that failed. If a mistake in the input stops the run before anything is scraped, the run ends without results and its status message says what to change. Either way the Actor sends us a short error report, so we can fix the cause even if you never open an issue: the Actor's build, the reason, the counts from the end-of-run summary, whether your Apify plan is free or paid and, for an unexpected error, where in our code it happened. Web addresses and @usernames are blanked out first. The report never includes your input, your account, the pages you scraped or your results. Every run, failed or not, also sends one usage line as it ends, so we can see which options people use, what runs cost us and how well the data is filled: how many of each charged event it used (for example 120 full details) and the price your plan paid for them; the run's platform cost by item and its resources (time, memory, proxy traffic); whether it stopped at your maximum cost or maximum items; how it was started (Console, API, schedule, saved task, and for API runs the kind of tool, such as Make, Zapier or the Apify client, never the tool's full identity); our scraper's own retry and timing counts; and for each output field, how many results had it filled (counts only, never the values). That never includes your input, your account, your IP address, the pages you scraped or your results either. If you need help with a run, open an issue on the Issues tab and attach the run, or email support@kekliktech.com with the run's link; the run's log ends with both.

## Run it

- In Apify Console: https://apify.com/keklik/instagram-comments-scraper
- With the Apify API: POST https://api.apify.com/v2/acts/keklik~instagram-comments-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN with the input JSON as the body. It returns the rows.
- From an AI agent: connect the Apify MCP server (https://mcp.apify.com), add the Actor `keklik/instagram-comments-scraper` and call it with the input.
