# Instagram Comments Scraper: Posts, Reels, No Login (`automation_craft/instagram-comments-scraper`) Actor

Scrape Instagram comments of public posts and reels with no login: paste links, codes, ids or profiles. Each row: the text as written, time, likes, GIF, hashtags, sentiment and its post. Every comment shown, date window, keyword and verified filters, a free coverage row per post. Pay per comment.

- **URL**: https://apify.com/automation_craft/instagram-comments-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Social media, Marketing, Automation
- **Features:** Limited permissions
- **Stats:** 11 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.19 / 1,000 comments

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Instagram Comments Scraper: Posts, Reels, No Login

**Scrape Instagram comments from public posts and reels, with no login and no cookies.** Paste post or reel links, post codes,
numeric post ids or profile names, and get one row per comment: the text as written, its time, its likes, any GIF, its hashtags, a
sentiment estimate and the post it belongs to (the commenter's username, id, verified badge and picture with the personal data switch
on). Each post also gets a free coverage row: the comment count Instagram shows, how many comments were read and delivered, and why
the walk ended. Pay only for the comments delivered.

- **Deep walks**: every comment Instagram shows a logged out visitor, up to 1,000,000 a post, read page by page, newest first, each comment delivered and charged once per run.
- **Profiles**: give a username and read the comments of its latest posts (12 by default, up to 20,000: a whole grid), with a post date window.
- **Filters no comment tool usually has**: a comment date window, words a comment must or must not contain, verified commenters only,
  minimum comment likes, the post owner's own comments left out, a minimum number of @mentions (the giveaway rule), one comment per
  commenter.
- **Most liked first** as an option: each post's comments read, then delivered by likes.
- **Every link form**: /p/, /reel/, /reels/ and /tv/ links, with or without the owner's name in front, share links (/share/...),
  instagr.am and m.instagram.com links, tracking parameters, bare codes and numeric post ids; up to 5,000 posts and 500 profiles a run.
- Every miss (a removed post, a post of a private account, a profile that is not public, a link that cannot be read) is named by its
  place in your list in a free status row, one row per kind of miss.

### Quick start

1. Open the **Input** tab and put one or more links in **Post or reel links, codes or ids**, for example
   `https://www.instagram.com/p/DctPchKOVcw/`, or profile names in **Profiles (their latest posts)**.
2. Set **Comments per post** (100 by default, up to 1,000,000).
3. Click **Start**. Rows arrive in the **Output** tab within seconds; export them as JSON, CSV or Excel, or read them through the API.
4. Optional: the comment filters, **Most liked first**, **Post details** (one row per post), **Include personal data**.

### What you get

One `comment` row per comment. Fill rates measured on 99,314 comments of 1,072 posts read by this Actor on Apify on 2026-11-04 and 05
(brands, sports, news, music, fashion, a bakery; reels, carousels, photos; many languages):

| Field | What it is | Filled |
|---|---|---|
| `id`, `url` | the comment's id and its own link | 100 percent |
| `text` | the comment exactly as written (emoji, links, mentions included) | 95 percent (the rest are GIF comments) |
| `createdAt`, `createdAtTimestamp` | when it was written | 100 percent |
| `likeCount` | its likes | 100 percent (above 0 on 23 percent) |
| `contentType`, `gifUrl`, `gifId` | text, gif or text_and_gif, and the GIF | GIF on 4 percent |
| `hashtags`, `textLength` | the hashtags in the text, its length | hashtags on 2 percent |
| `sentiment`, `sentimentScore` | positive, negative or neutral from the English words and emoji of the AFINN list, and the score | 36 percent (empty when no listed word or emoji is in the text) |
| `language` | the text's language, estimated (two letter code) | 14 percent (empty when the text is too short to tell) |
| `isPostOwner` | whether the post's own account wrote it | 100 percent |
| `isCovered`, `restrictedStatus`, `hasTranslation` | Instagram's own marks on the comment, as served | `isCovered` false on all 99,314, the other two empty on all |
| `positionInPost` | its place among the comments delivered for its post | 100 percent |
| `postCode`, `postId`, `postUrl`, `postType`, `postOwnerUsername`, `postOwnerId`, `postCommentCount`, `postPostedAt` | the post it belongs to | 100 percent |
| `ownerUsername`, `ownerId`, `ownerIsVerified`, `ownerProfilePicUrl`, `ownerProfileUrl`, `mentions` | the commenter and the accounts the text mentions | with `includePersonalData` on: 100 percent; verified on 6.5 percent and mentions on 5 percent of 5,220 comments of 45 posts read with the switch on (2026-11-04) |
| `input`, `inputKind`, `inputList`, `inputPosition`, `profile` | your entry, to match rows to your list | 100 percent |

One free `coverage` row per post walked: `shownCommentCount` (the count Instagram shows), `commentsRead`, `commentsDelivered`,
`leftOut` (how many comments each filter left out), `pages`, the newest and oldest comment read, `status` (why the walk ended:
`complete`, `capped`, `date_window`, `run_cap`, `charge_limit`, `work_allowance`, `stopped`, `partial`, `failed`, `comments_disabled`,
`no_comments`, `not_shown`, `restarted`) and `complete` (true when Instagram announced no further comments). Free `status` rows name the entries
that delivered nothing, one row per kind, and one row per profile says what its grid came to; the run ends with a free `summary` row.

**How many comments a post gives**: Instagram's count includes replies and comments it hides from visitors who are not logged in, and
it serves a logged out visitor only part of a large post's comments. Walks read to their end on 2026-11-04 gave 35 and 67 percent of
the count shown (2,142 of 6,098 and 147 of 221); one walk of a very large photo post read 20,021 comments and was still going. The coverage
row shows both numbers for every post.

```json
{
  "type": "comment",
  "id": "18104976440650018",
  "url": "https://www.instagram.com/p/DfQQryPSupf/c/18104976440650018/",
  "text": "Bring back the cilantro lime sauce please and thank you!!",
  "textLength": 57,
  "contentType": "text",
  "createdAt": "2026-11-03T17:29:39.000Z",
  "likeCount": 2,
  "ownerUsername": null,
  "isPostOwner": false,
  "hashtags": [],
  "sentiment": "positive",
  "sentimentScore": 3,
  "language": "en",
  "positionInPost": 44,
  "postCode": "DfQQryPSupf",
  "postType": "reel",
  "postOwnerUsername": "chipotle",
  "postCommentCount": 175,
  "input": "DfQQryPSupf"
}
```

### How much does it cost to scrape Instagram comments?

Pay per event, in US dollars. The price falls with your Apify plan:

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Comment (each comment delivered) | $0.27 | $0.24 | $0.22 | $0.19 |
| Post details (post details add-on, each post row) | $0.27 | $0.24 | $0.22 | $0.19 |

Prices are per 1,000 events. The Actor start is $0.0075 once per run, the same on every plan.
Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$0.19 / 1,000" on
the Comment row means one comment costs 0.019 cents on a Gold plan, so 1,000 comments cost USD 0.19. Comments a filter leaves out,
repeats, coverage rows, misses and anything Instagram did not answer are free; only the run's start fee is charged for a run that
delivers nothing.

Examples at the Free price: 100 comments of one post cost 0.0075 + 100 x 0.00027 = USD 0.0345; 10,000 comments cost
0.0075 + 10,000 x 0.00027 = USD 2.7075; the 100 latest comments of 50 posts with post details cost 0.0075 + 5,000 x 0.00027 +
50 x 0.00027 = USD 1.371. At the Gold price the same 10,000 comments cost USD 1.9075.

### Input

| Setting | What it does |
|---|---|
| `postUrls` | Post, reel, reels, tv and share links, codes or numeric post ids (up to 5,000) |
| `usernames` | Profiles (names, @names or profile links, up to 500): the comments of their latest posts |
| `postsPerProfile` | How many of each profile's latest posts to read (1 to 20,000, default 12); one run reads at most 50,000 posts in all |
| `postedSince`, `postedUntil` | Posts published in this window: a day (2026-10-01) or "30 days", "24 hours" |
| `postTypes` | Only these kinds: photo, carousel, reel, video, igtv |
| `onlyOwnPosts` | For profiles: leave out the collaborations another account owns |
| `maxCommentsPerPost` | Comments delivered per post at most (1 to 1,000,000, default 100) |
| `maxComments` | Comments delivered in the whole run at most |
| `sortBy` | `newest` (as Instagram serves them) or `most_liked` (each post's comments read, then by likes; at most 10,000 a post, and posts are read one at a time) |
| `commentsNewerThan`, `commentsOlderThan` | Comments written in this window: a day or "7 days", "24 hours"; a walk stops at the first comment older than the window |
| `mustContain`, `mustNotContain` | Words or phrases a comment's text must hold, or must not hold (case ignored) |
| `onlyVerified` | Only comments by accounts with the verified badge |
| `minCommentLikes` | Only comments with at least this many likes |
| `excludePostOwner` | Leave out the post's own account's comments |
| `minMentions` | Only comments that mention at least this many accounts |
| `uniqueCommenters` | One comment per commenter per post (the newest; at most 100,000 commenters a post) |
| `includePostDetails` | One `post` row per post: caption, likes, comment count, date, owner, media, carousel items (Post details event) |
| `includePersonalData` | Adds the fields that name a commenter: `ownerUsername`, `ownerId`, `ownerIsVerified`, `ownerProfilePicUrl`, `ownerProfileUrl`, the `mentions` list, the author part of `raw`, and on post rows the tagged accounts, the caption's `mentions` and the post's `raw` answer; off, they are empty. The text is always delivered as written |
| `includeRawData` | The comment as Instagram served it (`raw`) |
| `compactRows` | Picture and GIF links left out |
| `maxConcurrency`, `maxRunSeconds`, `requestTimeoutSecs`, `maxRetries`, `proxyConfiguration` | Pace and limits |

```json
{
  "postUrls": ["https://www.instagram.com/p/DctPchKOVcw/", "https://www.instagram.com/reel/DfF3eqGSKKc/"],
  "usernames": ["natgeo"],
  "postsPerProfile": 3,
  "maxCommentsPerPost": 500,
  "commentsNewerThan": "30 days",
  "excludePostOwner": true
}
```

### How it reads Instagram

Logged out and with no cookies of any account: Instagram's own details of each post (one light request a post, four posts at a
time), then the post's comments page by page, about 24 a page, newest first, as the Instagram web app asks for them; a profile's
latest posts come from its grid as a logged out visitor sees it. Requests go from the run's own address first, and a request type
moves to Apify's datacenter proxy for the rest of the run after two refusals in a row there; no residential proxy is needed.

### Work that earns nothing

A run's unpaid work (links that do not exist, posts with no comments, filters nothing passes, failing answers) is bounded: it may
spend about 72 seconds of work before its first billed comment, and every billed comment adds a little more. A run that only meets
misses, or a filter that leaves out every comment of a long post, stops there with a free row for what it did not read; a run that
delivers comments earns more work with each one.

### What this Actor does NOT do

- No replies to comments: Instagram does not serve them to a visitor who is not logged in (no reply count, no parent comment, no
  reply page), so this Actor never logs in to get them.
- No Instagram ranked or "popular" order: a logged out visitor gets the newest first; **Most liked first** sorts what was read.
- No commenter full name or private mark, and no "liked by the author", pinned, edited, ranked or spam marks: the logged out comment
  answer does not carry them.
- No pinned mark on a profile's posts, so no "skip pinned posts": the profile grid a logged out visitor sees does not say which are
  pinned (pinned posts, up to three, come first).
- No age restricted (18+) posts, no posts of private accounts, and no login or cookies of yours, ever.
- No hashtag, place or keyword search, no tagged posts, stories, highlights or transcripts: the tools of ours listed at the end do
  searches; stories need a login.
- No change tracking between runs and no "new comments only" memory: schedule the Actor with `commentsNewerThan` and compare runs in
  your own sheet.
- No custom code runs inside the Actor (no mapping functions) and no delivery into other apps beyond Apify's integrations.
- No Facebook comments of a post shared to Facebook: our Facebook Comments Scraper reads those.

### FAQ

#### How do I scrape all the comments of an Instagram post?

Put the post's link in **Post or reel links**, set **Comments per post** high (up to 1,000,000) and run. The walk reads page by page
until Instagram announces no further comments; the coverage row tells you whether it got there (`complete`) and how many comments
Instagram shows. That count includes replies and hidden comments, so the comments a logged out visitor can read are fewer.

#### Can I scrape Instagram comments without logging in or cookies?

Yes. This Actor never logs in and needs no cookies or Instagram account: it reads what Instagram shows any visitor. The price of that
is the limits above: no replies and no ranked order.

#### How do I pick giveaway winners from Instagram comments?

Use **Minimum mentions** for the "tag two friends" rule, **One comment per commenter** so each person counts once, **Leave out the
post owner's comments**, and **Include personal data** to get the commenters' usernames. Every delivered comment is one row, so you
can draw winners from the dataset.

#### How do I get only new Instagram comments since my last run?

Set **Comments newer than** (for example "24 hours") and schedule the Actor: comments come newest first, so each walk stops at the
first older comment and reads only what is new.

#### How do I export Instagram comments of a whole profile?

Put the username in **Profiles**, set **Posts per profile** (up to 20,000, a whole grid) and, if you like, **Posts published since**. The comments of
those posts arrive as rows, each with its post's code and link.

#### Why does this Actor run with limited permissions?

It needs nothing beyond its own run: it reads public Instagram pages and writes only to the run's own dataset and key-value store
(its record of the post rows it charged and of the run's state, so a restarted run never charges anything twice); it opens no named store. Limited
permissions keep it from touching any other storage of your account.

### Use with the API

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~instagram-comments-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' -d '{"postUrls": ["https://www.instagram.com/p/DctPchKOVcw/"], "maxCommentsPerPost": 200}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/instagram-comments-scraper').call({ postUrls: ['https://www.instagram.com/p/DctPchKOVcw/'], maxCommentsPerPost: 200 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'comment'));
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/instagram-comments-scraper").call(run_input={"postUrls": ["https://www.instagram.com/p/DctPchKOVcw/"], "maxCommentsPerPost": 200})
comments = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "comment"]
```

### Changelog

- 0.1: first version (post links, codes, ids and profiles; comment filters and date window; most liked first; post details add-on).

### More data tools by Automation Craft

- [Instagram Posts Scraper: Profiles, Reels, No Login](https://apify.com/automation_craft/instagram-posts-scraper)
- [Instagram Search Scraper: Reels, Users, Hashtags](https://apify.com/automation_craft/instagram-search-scraper)
- [Instagram Reels Search Scraper: Reels by Keyword](https://apify.com/automation_craft/instagram-reels-search-scraper)
- [Instagram User Search Scraper: Profiles by Keyword](https://apify.com/automation_craft/instagram-user-search-scraper)
- [Facebook Comments Scraper: Replies, No Login](https://apify.com/automation_craft/facebook-comments-scraper)
- [Threads Replies Scraper: Comments of Any Post](https://apify.com/automation_craft/threads-replies-scraper)
- [Facebook Post Scraper: Reactions and Shares by URL](https://apify.com/automation_craft/facebook-post-scraper)
- [Threads Profile Scraper: Followers, Bio, Posts](https://apify.com/automation_craft/threads-profile-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/instagram-comments-scraper/changelog.md

# Actor input Schema

## `postUrls` (type: `array`):

Instagram posts and reels to read the comments of: links (/p/, /reel/, /reels/, /tv/, with or without the owner's name, share links /share/...), post codes (DctPchKOVcw) or numeric post ids. Each post is read once per run.

## `usernames` (type: `array`):

Instagram profiles whose latest posts to read the comments of: usernames (natgeo, @natgeo) or profile links. The posts are read newest first as the profile's grid shows them (pinned posts first).

## `postsPerProfile` (type: `integer`):

How many of each profile's latest posts to read (12 is one page of the grid; up to 20,000, a whole grid). The post filters below apply to these. One run reads at most 50,000 posts in all.

## `postedSince` (type: `string`):

Only posts published on or after this day (2026-10-01, from 00:00 UTC) or within the last days or hours ("30 days", "24 hours"). A profile's grid is read only down to this date.

## `postedUntil` (type: `string`):

Only posts published on or before this day (2026-10-31, up to 23:59:59 UTC), or before the last days or hours ("7 days").

## `postTypes` (type: `array`):

Only posts of these kinds. Empty: every kind.

## `onlyOwnPosts` (type: `boolean`):

For profiles: leave out the posts their grid shows that another account owns (a collaboration posted by a partner).

## `maxCommentsPerPost` (type: `integer`):

The most comments delivered for one post (after the filters), up to 1,000,000: in effect every comment Instagram shows a logged out visitor. The walk ends earlier when Instagram shows no more.

## `maxComments` (type: `integer`):

A cap on the comments delivered in the whole run. Empty: no cap besides the one per post.

## `sortBy` (type: `string`):

Newest first is the order Instagram serves comments in. Most liked first reads each post's comments up to the cap, then delivers them by likes (at most 10,000 a post; posts are then read one at a time).

## `commentsNewerThan` (type: `string`):

Only comments written on or after this day (2026-10-01, from 00:00 UTC) or within the last days or hours ("7 days", "24 hours"). Comments come newest first, so a post's walk stops at the first older one.

## `commentsOlderThan` (type: `string`):

Only comments written on or before this day (2026-10-31, up to 23:59:59 UTC), or more than a number of days or hours ago ("2 days").

## `mustContain` (type: `array`):

Only comments whose text holds at least one of these words or phrases (case ignored).

## `mustNotContain` (type: `array`):

Leave out comments whose text holds any of these words or phrases (case ignored).

## `onlyVerified` (type: `boolean`):

Only comments written by accounts with Instagram's verified badge.

## `minCommentLikes` (type: `integer`):

Only comments with at least this many likes.

## `excludePostOwner` (type: `boolean`):

Leave out the comments the post's own account wrote (its replies to fans, its own captions in comments).

## `minMentions` (type: `integer`):

Only comments that mention (@) at least this many accounts: the usual entry rule of a giveaway.

## `uniqueCommenters` (type: `boolean`):

Keep only the newest comment (or, most liked first, the newest read) of each commenter on a post: one entry per person, as for a giveaway draw (at most 100,000 commenters a post).

## `includePostDetails` (type: `boolean`):

Add one post row per post: caption, likes, comment count, date, owner, media and carousel items (the Post details event, see Pricing).

## `includePersonalData` (type: `boolean`):

Add the fields that name a commenter: username, user id, verified badge, profile picture and profile link, the accounts a comment mentions, and the author part of the raw comment; on post rows, the tagged accounts, the accounts the caption mentions and the post's raw answer. Off, these fields are empty; the comment's own text is always delivered as written. You are responsible for a lawful use of personal data, the GDPR included.

## `includeRawData` (type: `boolean`):

Add the comment as Instagram served it (`raw`); its author part only with personal data on. With post details, the post's raw answer also comes only with personal data on.

## `compactRows` (type: `boolean`):

Leave the picture and GIF links out of the comment rows.

## `maxConcurrency` (type: `integer`):

How many posts are read in parallel.

## `maxRunSeconds` (type: `integer`):

Stop reading after this many seconds and deliver what was read. Empty: the run's own timeout.

## `requestTimeoutSecs` (type: `integer`):

How long one request to Instagram may take.

## `maxRetries` (type: `integer`):

How often a failed request is tried again on a fresh address.

## `proxyConfiguration` (type: `object`):

Apify Proxy is on by default: the run reads from its own address first and moves to Apify's datacenter proxy if Instagram refuses it. A residential group is read through the datacenter proxy instead.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.instagram.com/p/DctPchKOVcw/",
    "https://www.instagram.com/reel/DfF3eqGSKKc/"
  ],
  "postsPerProfile": 12,
  "onlyOwnPosts": false,
  "maxCommentsPerPost": 100,
  "sortBy": "newest",
  "onlyVerified": false,
  "excludePostOwner": false,
  "uniqueCommenters": false,
  "includePostDetails": false,
  "includePersonalData": false,
  "includeRawData": false,
  "compactRows": false,
  "maxConcurrency": 4,
  "requestTimeoutSecs": 30,
  "maxRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "postUrls": [
        "https://www.instagram.com/p/DctPchKOVcw/",
        "https://www.instagram.com/reel/DfF3eqGSKKc/"
    ],
    "maxCommentsPerPost": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/instagram-comments-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "postUrls": [
        "https://www.instagram.com/p/DctPchKOVcw/",
        "https://www.instagram.com/reel/DfF3eqGSKKc/",
    ],
    "maxCommentsPerPost": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/instagram-comments-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "postUrls": [
    "https://www.instagram.com/p/DctPchKOVcw/",
    "https://www.instagram.com/reel/DfF3eqGSKKc/"
  ],
  "maxCommentsPerPost": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/instagram-comments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/instagram-comments-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JYH8ChCzZNLDurJ6d/builds/4wYSOdx0RJIn3avgz/openapi.json
