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

Extract engagement metrics from public Instagram profiles. Get feed engagement rate, Reels views, and follower stats. Covers up to 72 posts and 36 Reels. No login needed. From $0.02 per result.

- **URL**: https://apify.com/phantom_coder/instagram-engagement-scraper.md
- **Developed by:** [Phantom Coder](https://apify.com/phantom_coder) (community)
- **Categories:** Social media, Automation, Integrations
- **Features:** Limited permissions
- **Stats:** 93 total users, 9 monthly users, 96.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $20.00 / 1,000 results

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 influencer engagement scraper

Know which influencers are actually driving engagement - not just accumulating followers - before you commit budget to a campaign.

***

### Who is this for

- **Marketing agencies** vetting a shortlist of creators before pitching a campaign to a client
- **Brand managers** benchmarking competitor brands and their partner influencers to understand real engagement levels
- **Growth teams** tracking creator performance week-over-week to catch engagement trend shifts early

No Instagram account, API key, or login required. The Actor works on any public profile out of the box.

***

### Why it's different

Most influencer research tools give you follower counts and post frequency. This Actor goes further: it measures how many people actually interact per post, normalizes that against audience size, and compares Reels vs. feed performance in a single run.

A creator with 200K followers and 3% engagement is worth more than one with 2M followers and 0.1% engagement. This Actor surfaces that difference in seconds.

***

### What you get

- **Feed engagement rate** - average likes + comments per post as a percentage of followers
- **Reels metrics** - average views, average engagement, and engagement rate by views
- **Cross-format comparison** - how Reels perform relative to feed posts (`engagement_skew_reels_over_feed`)
- **Normalized benchmarks** - interactions per 1K followers for fair comparisons across account sizes
- **Profile metadata** - follower count, following count, verified status, post count, and bio link
- **Coverage stats** - how many posts and Reels were analyzed per profile

***

### Common use cases

**Influencer vetting**

You're shortlisting creators for a skincare launch. @glossier has 2.8M followers with `interactions_per_1k_followers: 4.2`. A smaller creator you're considering has 380K followers but `interactions_per_1k_followers: 18.7`. The smaller account's audience is 4× more engaged per 1,000 followers - often a better buy for a product launch. Sort by `interactions_per_1k_followers` to rank your shortlist in one pass.

**Reels vs. feed analysis**

Use `engagement_skew_reels_over_feed` to identify creators whose Reels significantly outperform their feed posts. A value of 3.0 means their Reels get 3× the engagement of their feed posts - a strong signal of where to place sponsored content for maximum reach.

**Competitor benchmarking**

Run the Actor on a competitor brand's profile and their known partner influencers. You'll quickly see what engagement benchmarks they're working with and whether those partnerships are actually delivering.

**Periodic tracking**

Run the same list of usernames weekly to track trends over time. Use the Apify scheduler with a cron expression like `0 9 * * 1` (every Monday at 9am) to automate it. A consistent drop in `feed_avg_engagement_rate_by_followers` over 4 weeks is an early signal worth investigating before renewing a partnership.

***

### How engagement rate is calculated

Raw follower counts are a poor proxy for influence because the algorithm never shows a post to all followers. The metric that matters is `interactions_per_1k_followers`: total likes and comments across all analyzed posts and Reels, divided by follower count, multiplied by 1,000.

This normalizes for audience size so you can compare a 50K niche creator directly against a 5M celebrity. Industry benchmarks: above 10 per 1K is strong for mid-size accounts; above 3 per 1K is considered healthy for accounts over 1M.

For Reels, `reels_engagement_rate_by_views` (interactions ÷ views) tells you how actively viewers respond, regardless of how many times the Reel was served. A high view count with low engagement often signals viral reach but passive audience - useful context before a partnership decision.

***

### How to use

<ol>
  <li>Click <strong>Try for free</strong> on the Actor page.</li>
  <li>Enter one or more public Instagram usernames (without the @ prefix).</li>
  <li>Click <strong>Start</strong> and wait - each username takes around 20-30 seconds.</li>
  <li>Download results as JSON or CSV, or connect to Google Sheets, Make, or Zapier via Apify integrations.</li>
</ol>

> ⚠️ **Getting `reels_avg_views: 0` or `reels_count: 0` is completely normal.** It means the account has no public Reels, or Instagram returned no view data for them. All `reels_*` metrics will be `0` in this case - the Actor is working correctly.
>
> **How to tell if a result is valid:**
>
> - ✅ If `feed_count` is greater than 0, the profile was successfully analyzed
> - ⚠️ If you see `"error": "private_or_not_found"`, the account is private, deleted, or the username is misspelled
> - ⚠️ If you see `"error": "soft_blocked"`, the proxy IP was temporarily rate-limited by Instagram - rerun the username

***

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `usernames` | array of strings | - | Public Instagram handles to analyze (without @ prefix). At least one required. |
| `maxFeedPosts` | integer | `72` | Maximum feed posts to fetch per username (1-72). |
| `maxReels` | integer | `36` | Maximum Reels to fetch per username (1-36). |

**Example input:**

```json
{
  "usernames": ["natgeo"],
  "maxFeedPosts": 72,
  "maxReels": 36
}
```

***

### Output

The Actor pushes one dataset record per username.

#### Successful result

```json
{
  "id": "25025320",
  "username": "natgeo",
  "fullName": "National Geographic",
  "followersCount": 269000000,
  "followsCount": 122,
  "verified": true,
  "postsCount": 30300,
  "profilePicUrl": "https://example.cdninstagram.com/...",
  "externalUrl": "https://www.nationalgeographic.com/",
  "followers_approx": false,
  "overall_interactions": 8871840,
  "feed_avg_engagement": 75320.00,
  "feed_avg_engagement_rate_by_followers": 0.028,
  "reels_avg_engagement": 228229.00,
  "reels_avg_views": 1500000.00,
  "reels_engagement_rate_by_views": 15.2153,
  "posts_contribution_pct": 66.67,
  "reels_contribution_pct": 33.33,
  "engagement_skew_reels_over_feed": 3.0302,
  "avg_interactions_per_content": 82147.78,
  "interactions_per_1k_followers": 32.98,
  "total_items": 108,
  "feed_count": 72,
  "reels_count": 36,
  "reels_view_coverage": 1.0,
  "feed_view_coverage": 0.0
}
```

#### Failed result (private or non-existent account)

```json
{
  "username": "some_private_user",
  "error": "private_or_not_found"
}
```

***

### Limitations

<ul>
  <li><strong>Public profiles only</strong> - private accounts return an error record, not metrics.</li>
  <li><strong>72 feed posts maximum</strong> - 72 is the maximum number of feed posts that can be analyzed per profile.</li>
  <li><strong>36 Reels maximum</strong> - 36 is the maximum number of Reels that can be analyzed per profile.</li>
  <li><strong>Feed view counts unavailable</strong> - Instagram never returns view counts for feed posts, so <code>feed_view_coverage</code> is always <code>0</code>.</li>
  <li><strong>Residential proxy required</strong> - the Actor uses Apify residential proxy automatically. A paid Apify plan with the <code>RESIDENTIAL</code> proxy group enabled is needed.</li>
  <li><strong>Soft blocks</strong> - Instagram occasionally blocks proxy IPs temporarily. The Actor retries automatically before recording a <code>soft_blocked</code> error for that username.</li>
</ul>

***

### Pricing vs. alternatives

The only comparable Actor on Apify Store charges **$0.04 per profile** at all subscription tiers. This Actor matches that price for free users and gets cheaper the higher your Apify plan - up to 50% off on Business plans and above.

You are also charged **$0.00005 per Actor start** (charged once per run, regardless of how many usernames you process in that run).

| Apify plan | Price per profile |
|---|---|
| Free | $0.04 |
| Starter | $0.03 |
| Scale | $0.025 |
| Business and above | $0.02 |

**Typical monthly cost at Starter plan ($0.03/profile):**

- Vet 20 influencers once: **$0.60**
- Monitor 20 influencers weekly (80 runs/month): **$2.40/month** - less than one hour of manual research
- Agency running 500 profiles/month: **$15.00/month**

***

### FAQ

**Do I need an Instagram account or API key?**
No. The Actor works entirely on public data - no login, no credentials, no API setup required.

**Is 72 posts enough for a reliable engagement rate?**
Yes. 72 posts covers roughly 6-12 months of activity for most active creators, which is more than enough to smooth out viral outliers and get a stable baseline. If an account has fewer posts, the Actor fetches all of them.

**What happens if an account goes private mid-run?**
The Actor records `{ "username": "...", "error": "private_or_not_found" }` and moves on. No charge is applied for failed accounts.

**Why do some Reels show 0 views?**
Instagram doesn't always return view count data for Reels through the API. If `reels_view_coverage` is below 1.0, some Reels had no play count available. The engagement metrics (likes, comments) are still accurate - only the view-based metrics like `reels_engagement_rate_by_views` will be affected.

***

### Reference: output fields

#### Engagement metrics

| Field | What it measures |
|---|---|
| `feed_avg_engagement` | Average likes + comments per feed post (raw interaction count) |
| `feed_avg_engagement_rate_by_followers` | `feed_avg_engagement / followers × 100` - expressed as a percentage |
| `reels_avg_engagement` | Average likes + comments per Reel |
| `reels_avg_views` | Average play count across analyzed Reels |
| `reels_engagement_rate_by_views` | `reels_avg_engagement / reels_avg_views × 100` - what percentage of viewers interact |
| `overall_interactions` | Total likes + comments summed across all analyzed feed posts and Reels |
| `avg_interactions_per_content` | `overall_interactions / total_items` - average engagement per piece of content |
| `interactions_per_1k_followers` | `overall_interactions / followers × 1000` - normalized for audience size comparison |
| `engagement_skew_reels_over_feed` | `reels_avg_engagement / feed_avg_engagement` - values above 1 mean Reels outperform feed posts |
| `posts_contribution_pct` | Percentage of analyzed items that are feed posts |
| `reels_contribution_pct` | Percentage of analyzed items that are Reels |

#### Coverage fields

| Field | What it means |
|---|---|
| `feed_count` | Feed posts actually fetched (may be less than `maxFeedPosts` if the account has fewer) |
| `reels_count` | Reels actually fetched |
| `total_items` | `feed_count + reels_count` |
| `reels_view_coverage` | Fraction of Reels that had a play count available (0 to 1) |
| `feed_view_coverage` | Always `0` - Instagram does not expose view counts for feed posts |

#### Profile fields

| Field | What it means |
|---|---|
| `followers_approx` | Always `false` - `followersCount` and `followsCount` are exact. Kept so existing integrations don't break |

#### Error values

| `error` value | Meaning |
|---|---|
| `private_or_not_found` | Account is private, deleted, or the username does not exist |
| `soft_blocked` | The Actor's proxy IP was temporarily blocked by Instagram - rerun the username |
| `unexpected: ...` | An unexpected HTTP error; the message includes the status code |

***

### Support

Questions or issues? Open a ticket in the **Issues** tab on the Actor page.

# Actor input Schema

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

Public Instagram handles to analyze (without @ prefix).

## `maxFeedPosts` (type: `integer`):

Maximum feed posts to fetch per username (up to 72).

## `maxReels` (type: `integer`):

Maximum Reels to fetch per username (up to 36).

## Actor input object example

```json
{
  "usernames": [
    "natgeo"
  ],
  "maxFeedPosts": 72,
  "maxReels": 36
}
```

# Actor output Schema

## `dataset` (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 = {
    "usernames": [
        "natgeo"
    ]
};

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

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

```

## MCP server setup

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