# Instagram Engagement Scraper (`maximedupre/instagram-engagement-scraper`) Actor

Analyze public Instagram profiles with separate feed and Reels engagement measures. Compare profile details, recent content mix, and engagement per 1,000 followers, with a Reels view measure when available.

- **URL**: https://apify.com/maximedupre/instagram-engagement-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $18.00 / 1,000 profile analyses

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

### 📊 Compare Instagram Profile Engagement

Use this Actor for influencer marketers, agencies, brand teams, and researchers who need to compare public Instagram profiles. Enter usernames and get profile details, recent feed and Reels sample counts, and separate engagement measures, including normalized values per 1,000 followers. Each username is checked separately, and the recent sample keeps feed posts and Reels distinct.

- Compare a shortlist of public creators with [**Instagram Profile Engagement**](https://apify.com/maximedupre/instagram-engagement-scraper/examples/instagram-profile-engagement).
- Check recent Reels measures with [**Instagram Reels Engagement**](https://apify.com/maximedupre/instagram-engagement-scraper/examples/instagram-reels-engagement).
- Review recent feed-post measures in [**Instagram Post Engagement**](https://apify.com/maximedupre/instagram-engagement-scraper/examples/instagram-post-engagement).
- Use [**Instagram Engagement Analysis**](https://apify.com/maximedupre/instagram-engagement-scraper/examples/instagram-engagement-analysis) to compare profile details and content mix.
- Check normalized measures with [**Instagram Engagement Rate**](https://apify.com/maximedupre/instagram-engagement-scraper/examples/instagram-engagement-rate).

#### 📈 Compare Feed and Reels Measures

The default dataset contains public Instagram profile analyses. It shows the profile identity and audience context, the recent content mix, and separate engagement measures for feed posts and Reels when the sample includes them. Reels view data is shown separately when it is available, so you can tell which measures have view support.

**Profile context**

Each row can show the public username, profile URL, display name, follower count, verification state, and post count.

**Engagement context**

Feed and Reels measures use their own fields. The content mix shows how many distinct feed posts and Reels were sampled, and per-1,000-follower values help compare profiles with different audience sizes.

#### ▶️ Analyze Recent Instagram Profiles

**Run steps**

1. Add one or more public Instagram usernames. Use the username with or without `@`.
2. Choose how many recent feed posts and Reels to check for each username.
3. Start the run and open the default dataset when it finishes.

The Actor checks each submitted username separately. It reads public profile data and does not require customer authentication. The sample is recent, not a lifetime archive of every post or Reel.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `usernames` | array of strings | Required. Enter one or more public Instagram usernames. Use only the username, with or without `@`. |
| `sampleDepth` | integer | Chooses how many recent feed posts and Reels to check for each username. Clear it to return all available results until the source is exhausted. A larger number checks more content. The default is `1`. |

Clear `sampleDepth` to return all available results until the source is exhausted. The value applies to the recent feed-post and Reels sample for each username.

**Example input**

This is the smallest successful common input from the current beta run:

```json
{
  "usernames": [
    "instagram"
  ],
  "sampleDepth": 1
}
```

#### 🧾 Output

The Output panel opens the default dataset. Rows always include `profile` and `contentMix`. The engagement objects can be omitted when the sample has no matching content, and `reelsEngagement.per1000Views` is omitted when Reels view data is not available.

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | link | Opens the Instagram profile analyses in the default dataset. |

**Profile row with feed and Reels measures**

This shape has sampled feed posts and Reels. The Reels view measure is omitted when `viewDataAvailable` is `false`.

| Field | Type | What it does |
| --- | --- | --- |
| `profile.username` | string | Public Instagram username used for the analysis. |
| `profile.profileUrl` | URL string | Public Instagram profile URL. |
| `profile.displayName` | string | Name shown on the public profile. |
| `profile.followersCount` | integer | Public follower count shown for the profile. |
| `profile.isVerified` | boolean | Whether Instagram marks the profile as verified. |
| `profile.postsCount` | integer | Public number of posts shown for the profile. |
| `contentMix.feedPostsSampled` | integer | Number of distinct feed posts in the recent sample. |
| `contentMix.reelsSampled` | integer | Number of distinct Reels in the recent sample. |
| `feedEngagement.per1000Followers` | number | Average feed-post engagement for every 1,000 followers in the sample. |
| `reelsEngagement.per1000Followers` | number | Average Reels engagement for every 1,000 followers in the sample. |
| `reelsEngagement.viewDataAvailable` | boolean | Whether sampled Reels include the view data needed for the view-based measure. |

**Genuine row**

This complete row is from a successful current-beta run.

```json
{
  "profile": {
    "username": "natgeo",
    "profileUrl": "https://www.instagram.com/natgeo/",
    "displayName": "National Geographic",
    "followersCount": 268563511,
    "isVerified": true,
    "postsCount": 32000
  },
  "contentMix": {
    "feedPostsSampled": 2,
    "reelsSampled": 2
  },
  "feedEngagement": {
    "per1000Followers": 0.15912064837430576
  },
  "reelsEngagement": {
    "per1000Followers": 0.18753664566144285,
    "viewDataAvailable": false
  }
}
```

**Reels-only row with view data**

This shape has no `feedEngagement` object because no feed posts were sampled. It includes the Reels view measure because `viewDataAvailable` is `true`.

| Field | Type | What it does |
| --- | --- | --- |
| `profile.username` | string | Public Instagram username used for the analysis. |
| `profile.profileUrl` | URL string | Public Instagram profile URL. |
| `profile.displayName` | string | Name shown on the public profile. |
| `profile.followersCount` | integer | Public follower count shown for the profile. |
| `profile.isVerified` | boolean | Whether Instagram marks the profile as verified. |
| `profile.postsCount` | integer | Public number of posts shown for the profile. |
| `contentMix.feedPostsSampled` | integer | Number of distinct feed posts in the recent sample. |
| `contentMix.reelsSampled` | integer | Number of distinct Reels in the recent sample. |
| `reelsEngagement.per1000Followers` | number | Average Reels engagement for every 1,000 followers in the sample. |
| `reelsEngagement.per1000Views` | number | Average Reels engagement for every 1,000 views when view data is available. |
| `reelsEngagement.viewDataAvailable` | boolean | Whether sampled Reels include the view data needed for the view-based measure. |

**Genuine row**

This complete row is from a successful current-beta run.

```json
{
  "profile": {
    "username": "instagram",
    "profileUrl": "https://www.instagram.com/instagram/",
    "displayName": "Instagram",
    "followersCount": 686677821,
    "isVerified": true,
    "postsCount": 8590
  },
  "contentMix": {
    "feedPostsSampled": 0,
    "reelsSampled": 1
  },
  "reelsEngagement": {
    "per1000Followers": 1.0038084512416485,
    "viewDataAvailable": true,
    "per1000Views": 70.75793263197443
  }
}
```

**Reels-only row without view data**

This shape has no `feedEngagement` object and no `reelsEngagement.per1000Views` value because the sample has no feed posts and no usable Reels view data.

| Field | Type | What it does |
| --- | --- | --- |
| `profile.username` | string | Public Instagram username used for the analysis. |
| `profile.profileUrl` | URL string | Public Instagram profile URL. |
| `profile.displayName` | string | Name shown on the public profile. |
| `profile.followersCount` | integer | Public follower count shown for the profile. |
| `profile.isVerified` | boolean | Whether Instagram marks the profile as verified. |
| `profile.postsCount` | integer | Public number of posts shown for the profile. |
| `contentMix.feedPostsSampled` | integer | Number of distinct feed posts in the recent sample. |
| `contentMix.reelsSampled` | integer | Number of distinct Reels in the recent sample. |
| `reelsEngagement.per1000Followers` | number | Average Reels engagement for every 1,000 followers in the sample. |
| `reelsEngagement.viewDataAvailable` | boolean | Whether sampled Reels include the view data needed for the view-based measure. |

**Genuine row**

This complete row is from a successful current-beta run.

```json
{
  "profile": {
    "username": "natgeo",
    "profileUrl": "https://www.instagram.com/natgeo/",
    "displayName": "National Geographic",
    "followersCount": 268563499,
    "isVerified": true,
    "postsCount": 32000
  },
  "contentMix": {
    "feedPostsSampled": 0,
    "reelsSampled": 1
  },
  "reelsEngagement": {
    "per1000Followers": 0.2734250941525006,
    "viewDataAvailable": false
  }
}
```

#### 💳 Pricing

**Primary event**

The Actor charges one `Profile analysis` event for each successfully analyzed public Instagram profile. The price depends on your Apify plan and is shown in the pricing panel.

#### 🔌 Integrations

**Dataset access**

Open the default dataset from the Output panel, or read its items through the Apify API.

For a walkthrough, see:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Why is `reelsEngagement.per1000Views` missing?

That field appears only when `reelsEngagement.viewDataAvailable` is `true`. The per-1,000-follower Reels measure can still be available when view data is missing.

##### What does `sampleDepth` change?

It sets how many recent feed posts and Reels the Actor checks for each username. Clear it to return all available results until the source is exhausted. It does not request a lifetime archive.

##### Can I submit several usernames?

Yes. Add several public usernames to `usernames`, and the Actor checks each one separately.

##### Can I analyze a private or deleted profile?

No. The Actor is for public Instagram profiles. Private, deleted, or otherwise non-public profiles are outside its scope.

##### Can the same Reel be counted twice?

No. A Reel that appears in both the feed and Reels collections is counted once in the recent sample.

##### Does this return comments, liker lists, or post-level records?

No. This Actor returns profile-level analysis. It does not collect individual comments, liker lists, or post-level engagement records.

##### Does it track engagement changes across runs?

No. Each run analyzes its selected recent sample. Cross-run monitoring, historical trend storage, and alerts are outside this Actor's scope.

##### Do I need Instagram credentials?

No customer authentication is required. Submit public usernames and the Actor reads public profile data.

### 📝 Changelog

**v0.0** (19-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~instagram-engagement-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Instagram Profile Stats Scraper](https://apify.com/maximedupre/instagram-profile-stats-scraper): Check known public profiles and review follower, following, and post counts beside engagement data.
- [Influencer Scraper](https://apify.com/maximedupre/influencer-scraper): Find public creator profiles across TikTok, Instagram, and YouTube before focused Instagram comparisons.
- [Instagram User Search Scraper](https://apify.com/maximedupre/instagram-user-search-scraper): Discover public Instagram accounts by keyword, then use their usernames for engagement checks.
- [Instagram Related Users Scraper](https://apify.com/maximedupre/instagram-related-users-scraper): Explore public accounts related to a known profile when you need more creators to compare.
- [Instagram Post & Reel Content Scraper](https://apify.com/maximedupre/instagram-post-content-scraper): Collect recent public posts and Reels when you need content-level context beside profile metrics.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter one or more public Instagram usernames. Use only the username, with or without @. Each username is analyzed separately.

## `sampleDepth` (type: `integer`):

Choose how many recent feed posts and Reels to check for each username. Leave it empty to return all available results until the source is exhausted. A larger number checks more content.

## Actor input object example

```json
{
  "usernames": [
    "instagram",
    "natgeo"
  ],
  "sampleDepth": 12
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the successful Instagram profile analyses in the default dataset.

# 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 = {
    "usernames": [
        "instagram"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/instagram-engagement-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 = { "usernames": ["instagram"] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/instagram-engagement-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 '{
  "usernames": [
    "instagram"
  ]
}' |
apify call maximedupre/instagram-engagement-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/instagram-engagement-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/yRT0oMN4gWQfQNYz6/builds/k2EkPVo0JAuvGasbW/openapi.json
