# Instagram Commenters & Engaged Audience Scraper (`zapticx/instagram-engaged-audience-scraper`) Actor

Enter an Instagram username and get one row per unique person who commented on its recent posts. No post URLs needed.

- **URL**: https://apify.com/zapticx/instagram-engaged-audience-scraper.md
- **Developed by:** [Zapticx](https://apify.com/zapticx) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.90 / 1,000 engaged users

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Commenters & Engaged Audience Scraper

**Enter a username. Get people, not comments.**

Most Instagram comment scrapers make you collect post URLs first. This one takes `natgeo` — or `@natgeo`, or a profile URL — finds the profile's recent posts and reels automatically, reads the comments, and returns **one row per unique person**.

Someone who comments five times on one post and twice on another is **one row** with `engagementCount: 7` and `postsEngagedWith: 2` — not seven rows you pay for seven times.

### What you get

- **One row per unique person**, deduplicated by numeric Instagram user ID
- **Repeat-engagement signal** — `engagementCount`, `postsEngagedWith`, `isRepeatEngager`
- **Verified and private flags** on every row, so you can filter to reachable accounts
- **The profile's own comments excluded by default** — brands pin comments to their own posts, and you don't want the target inside its own audience list
- **An honest run summary** — posts scanned, duplicates removed, and how many replies existed that were not fetched

### Use cases

- **Competitor audience research** — who actually engages with a rival brand
- **Lead generation** — an active commenter beats a dormant follower
- **Influencer audience analysis** — who shows up in the comments, and how often
- **Community research** — find and rank your most repeat-engaged people
- **Repeat-engager identification** — sort an audience by real activity
- **Social media market research** — sample a niche through its commenters

### What this Actor does not claim

This Actor returns **observed commenters from the posts sampled at run time** — not followers, and not a complete audience. Instagram does not expose "everyone who engages with an account", so **no follower-coverage percentage is reported and none should be inferred**. Run it again tomorrow and the posts, and therefore the people, will legitimately differ.

**This is not a follower scraper.**

Replies are not collected in this version. The run summary always reports `repliesAvailableNotFetched` so you can see exactly what was left out.

### Input

```json
{
  "username": "natgeo",
  "maxPosts": 3,
  "maxCommentsPerPost": 50
}
```

| Field | Description |
|---|---|
| `username` | Public Instagram profile to analyse. Accepts `natgeo`, `@natgeo` or a profile URL. **Post URLs are rejected — this Actor finds the posts for you.** |
| `maxPosts` | How many of the profile's most recent posts and reels to read comments from. More posts means a larger audience and a higher cost. |
| `maxCommentsPerPost` | Upper bound on comments read from each post. Popular posts can have thousands; this caps cost per post. Typical values: 25, 50, 100, 200. |
| `excludeSourceAccount` | Accounts frequently comment on and pin comments to their own posts. Leave enabled so the target does not appear in its own audience list. |
| `includeCommentText` | Adds every comment each person wrote. Off by default — this Actor is audience-focused, not comment-analysis focused. |
| `includeProfileDetails` | Adds bio, follower counts and public email where available. Not available in this version. |
| `includeReplies` | Not available in this version. Replies are never included in Instagram's top-level comment response; the run summary always reports how many existed. |

### Output

One row per unique engaged user:

```json
{
  "username": "example_user",
  "userId": "58632251513",
  "fullName": "Example User",
  "profileUrl": "https://www.instagram.com/example_user/",
  "isVerified": false,
  "isPrivate": false,
  "engagementCount": 4,
  "postsEngagedWith": 2,
  "isRepeatEngager": true,
  "engagementType": "comment",
  "sourcePostUrls": ["https://www.instagram.com/p/XXXXXXXXXXX/"],
  "firstObservedAt": "2026-09-10T16:53:07.000Z",
  "lastObservedAt": "2026-09-14T08:12:00.000Z",
  "sourceUsername": "natgeo",
  "sampledPosts": 3,
  "collectedAt": "2026-09-17T12:02:38.000Z"
}
```

| Field | Meaning |
|---|---|
| `userId` | Numeric Instagram user ID, as a **string** — the deduplication key |
| `username`, `fullName`, `profileUrl`, `profilePicUrl` | Public profile identity |
| `isVerified`, `isPrivate` | Account flags; private accounts cannot be enriched |
| `engagementCount` | Total comments this person left across the sampled posts |
| `postsEngagedWith` | How many distinct sampled posts they commented on |
| `isRepeatEngager` | True when they commented more than once, or on more than one post |
| `sourcePostUrls` | The sampled posts where they were observed |
| `firstObservedAt` / `lastObservedAt` | Time window of observed engagement |
| `sampledPosts` | How many posts this run scanned — the basis for the whole row |

#### Run summary

Every run writes a `RUN_SUMMARY` record to the key-value store with `rawCommentsCollected`, `uniqueEngagers`, `duplicatesRemoved`, `sourceAccountCommentsExcluded`, `repliesAvailableNotFetched`, per-post status, and:

- `audienceType: "observed_commenters"`
- `coverageBasis: "not_applicable_engagement_mode"`

No follower-coverage percentage is reported, because engaged commenters are not a subset of followers and any such ratio would be misleading.

### Export and integrate

Export to **JSON, CSV or Excel**, run on a schedule, or call it from the **API**. Two dataset views are provided: **Engaged Audience** (default) and **Repeat Engagers**.

### Pricing

Pay per **unique engaged user** delivered. Duplicate comments and the profile's own comments are never charged — if someone comments seven times, you pay once.

### Notes

- Works on public Instagram profiles. No login and no cookies required.
- Private profiles return no public posts; the run reports `no_posts_or_private_account`.

# Actor input Schema

## `username` (type: `string`):

Public Instagram profile to analyse. Accepts "natgeo", "@natgeo" or "https://www.instagram.com/natgeo/". Post/reel URLs are rejected — this Actor discovers the posts for you.

## `maxPosts` (type: `integer`):

How many of the profile's most recent posts and reels to read comments from. More posts means a larger audience and a higher cost.

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

Upper bound on comments read from each post. Popular posts can have thousands; this caps cost per post. Typical values: 25, 50, 100, 200.

## `excludeSourceAccount` (type: `boolean`):

Accounts frequently comment on and pin comments to their own posts. Leave enabled so the target does not appear in its own audience list.

## `includeCommentText` (type: `boolean`):

Adds every comment each person wrote. Off by default — this Actor is audience-focused, not comment-analysis focused.

## `includeProfileDetails` (type: `boolean`):

Adds bio, follower counts, external link and public email where available. Requires one extra request per person. Not available in this version.

## `includeReplies` (type: `boolean`):

Not available in this version. Replies are never included in Instagram's top-level comment response; the run summary always reports how many existed via repliesAvailableNotFetched.

## Actor input object example

```json
{
  "username": "natgeo",
  "maxPosts": 3,
  "maxCommentsPerPost": 50,
  "excludeSourceAccount": true,
  "includeCommentText": false,
  "includeProfileDetails": false,
  "includeReplies": false
}
```

# Actor output Schema

## `engagedAudience` (type: `string`):

Unique commenters found across the sampled posts, with repeat-engagement counts.

## `repeatEngagers` (type: `string`):

People who commented more than once or across more than one post.

## `runSummary` (type: `string`):

Counts, per-post status and honest-coverage fields for this run.

# 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 = {
    "username": "natgeo",
    "maxPosts": 3,
    "maxCommentsPerPost": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/instagram-engaged-audience-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 = {
    "username": "natgeo",
    "maxPosts": 3,
    "maxCommentsPerPost": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("zapticx/instagram-engaged-audience-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 '{
  "username": "natgeo",
  "maxPosts": 3,
  "maxCommentsPerPost": 50
}' |
apify call zapticx/instagram-engaged-audience-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zapticx/instagram-engaged-audience-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/zCqgyA4uJ6R2ew7rs/builds/c7yAhih9DF6PZiKmP/openapi.json
