# Instagram Profile Statistics Scraper (`automation-lab/instagram-profile-stats-scraper`) Actor

Check batches of public Instagram profiles and export identity, follower, following, post, verification, business, and recent engagement-summary metrics for creator qualification and monitoring.

- **URL**: https://apify.com/automation-lab/instagram-profile-stats-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 4 total users, 2 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.01 / 1,000 profile extracteds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Profile Statistics Scraper

Check batches of public Instagram accounts and export useful **Instagram profile statistics** without collecting full post histories. The Actor returns identity, followers, following, post count, verification, business status, and optional engagement summaries calculated from recent public post samples.

Use it to qualify creators, enrich lead lists, create account snapshots, or feed recurring profile-monitoring workflows. Inputs can be usernames, profile URLs, or both.

### What does this Instagram profile statistics scraper do?

For every successfully resolved public profile, the Actor:

1. normalizes usernames and `instagram.com` profile URLs;
2. removes duplicate profiles;
3. retrieves public profile identity and account counts;
4. optionally calculates average and median likes and comments;
5. calculates a sampled engagement rate and follower/following ratio;
6. evaluates optional creator-qualification filters;
7. saves a typed record to the default Apify dataset.

It does not download media, scrape comments, or require users to supply Instagram login cookies.

### Who is it for?

- **Influencer marketers** qualifying creators by audience, verification, and engagement.
- **Sales and partnerships teams** enriching Instagram lead lists.
- **Analysts** comparing account-level audience statistics.
- **Agencies** preparing repeatable profile snapshots for clients.
- **Developers and data teams** sending normalized profile records to spreadsheets, warehouses, or automation tools.

### Why use this focused Actor?

This Actor is intentionally narrower than a full Instagram content scraper.

- Batch usernames and profile URLs in one run.
- Get account statistics without collecting an entire post feed.
- Calculate engagement summaries from the recent post sample already returned with the profile.
- Apply the same qualification rules to username and URL inputs.
- Pay only for profiles that are successfully fetched and saved.
- Continue useful batch work when an individual profile is unavailable.

### What data can you extract?

| Field | Meaning |
| --- | --- |
| `profileId` | Instagram profile ID |
| `username`, `fullName` | Current handle and display name |
| `profileUrl` | Canonical public profile URL |
| `biography`, `externalUrl` | Public bio and external link |
| `followersCount` | Current follower count |
| `followingCount` | Current following count |
| `postsCount` | Profile post count reported by Instagram, or `null` when that count is temporarily unavailable |
| `isVerified` | Verification status |
| `isPrivate` | Whether the account is private |
| `isBusinessAccount` | Public business-account indicator |
| `businessCategoryName` | Public business/creator category when available |
| `profilePicUrl` | Public profile-picture URL when available |
| `recentPostsAnalyzed` | Recent post samples used for engagement calculations |
| `averageLikes`, `averageComments` | Mean engagement on the sample |
| `medianLikes`, `medianComments` | Median engagement on the sample |
| `engagementRate` | Average likes plus comments divided by followers, as a percentage |
| `followerFollowingRatio` | Followers divided by following count |
| `matchedFilters` | Whether all configured qualification filters matched |
| `scrapedAt` | UTC collection timestamp |

### Getting started

1. Open the Actor input page.
2. Add one or more values under **Instagram usernames**, or paste public profile URLs.
3. Keep **Calculate engagement summaries** enabled if you need engagement fields.
4. Optionally set follower, verification, or engagement filters.
5. Enable **Output matching profiles only** to save only qualified profiles.
6. Click **Start**.
7. Open the **Profile statistics** dataset view or export the dataset as JSON, CSV, Excel, XML, or RSS.

A useful first input is:

```json
{
  "usernames": ["instagram", "nasa", "nike"],
  "includeEngagementMetrics": true,
  "maxProfiles": 3
}
```

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `usernames` | string array | `instagram`, `nasa` | Usernames with or without `@` |
| `profileUrls` | request list | empty | Public `instagram.com/<username>/` URLs |
| `maxProfiles` | integer | `100` | Maximum unique profiles, from 1 to 1,000 |
| `includeEngagementMetrics` | boolean | `true` | Calculate sampled engagement summaries |
| `onlyVerified` | boolean | `false` | Require verification for a filter match |
| `minFollowers` | integer | empty | Minimum followers for a filter match |
| `maxFollowers` | integer | empty | Maximum followers for a filter match |
| `minEngagementRate` | number | empty | Minimum sampled engagement percentage |
| `filterMatchedOnly` | boolean | `false` | Save only records that match every filter |
| `maxRetries` | integer | `2` | Bounded attempts for transient upstream errors |

When `minEngagementRate` is set, keep `includeEngagementMetrics` enabled. Duplicate usernames across both input lists are processed once.

### Output example

The values below illustrate the current output shape; public account statistics change over time.

```json
{
  "profileId": "528817151",
  "username": "nasa",
  "fullName": "NASA",
  "profileUrl": "https://www.instagram.com/nasa/",
  "biography": "Public profile biography",
  "externalUrl": "https://www.nasa.gov/",
  "followersCount": 104262117,
  "followingCount": 92,
  "postsCount": 4873,
  "isVerified": true,
  "isPrivate": false,
  "isBusinessAccount": true,
  "businessCategoryName": "Government organization",
  "profilePicUrl": "https://scontent.example/profile.jpg",
  "recentPostsAnalyzed": 12,
  "averageLikes": 244654.58,
  "averageComments": 1351.25,
  "medianLikes": 219560,
  "medianComments": 1268.5,
  "engagementRate": 0.236,
  "followerFollowingRatio": 1133283.88,
  "matchedFilters": true,
  "scrapedAt": "2026-08-10T14:20:00.000Z"
}
```

Engagement fields are `null` and `recentPostsAnalyzed` is `0` when engagement summaries are disabled or no public recent-post sample is available. `postsCount` is `null` when Instagram's rate-limit fallback provides current profile statistics without a post total.

### Creator qualification workflow

Use filters to turn a mixed profile list into an immediately usable shortlist:

```json
{
  "usernames": ["instagram", "nasa"],
  "includeEngagementMetrics": true,
  "onlyVerified": true,
  "minFollowers": 1000000,
  "minEngagementRate": 0.01,
  "filterMatchedOnly": true
}
```

With `filterMatchedOnly: false`, every successfully fetched profile is saved and `matchedFilters` explains qualification. With it enabled, nonmatching profiles are omitted and not charged as profile results.

### Monitoring and integrations

A profile record is a current snapshot, not historical storage. For monitoring:

1. save this Actor as an Apify Task;
2. schedule the Task daily, weekly, or monthly;
3. send each dataset to your warehouse, Google Sheets, Make, Zapier, or a webhook;
4. compare `followersCount`, `postsCount`, and engagement fields with the preceding snapshot.

Apify integrations can also trigger downstream Actors after a successful run. Use `username` as the stable comparison key, while retaining `profileId` for account identity checks.

### How much does it cost to check Instagram profile statistics?

The Actor uses pay-per-event pricing:

- a one-time **$0.0001 run-start fee**;
- profile-result pricing with a **$0.00168 BRONZE price per successfully saved profile**, decreasing at higher platform tiers.

At the BRONZE tier, illustrative Actor charges are:

| Successfully saved profiles | BRONZE charge (USD) |
| ---: | ---: |
| 1 | 0.00178 |
| 10 | 0.01690 |
| 100 | 0.16810 |

Failed profiles and profiles omitted by `filterMatchedOnly` are not charged as profile results. Apify applies your active pricing tier and displays the maximum charge before a run. These examples will vary by tier.

### Run through the Apify API

Set `APIFY_TOKEN` in your environment.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~instagram-profile-stats-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames":["instagram","nasa"],"includeEngagementMetrics":true}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/instagram-profile-stats-scraper').call({
    usernames: ['instagram', 'nasa'],
    includeEngagementMetrics: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/instagram-profile-stats-scraper').call(
    run_input={
        'usernames': ['instagram', 'nasa'],
        'includeEngagementMetrics': True,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/instagram-profile-stats-scraper"
```

#### Claude Desktop

Add this server in Claude Desktop settings:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/instagram-profile-stats-scraper"
    }
  }
}
```

#### Cursor

Use the same `mcpServers` JSON in Cursor's MCP settings.

#### VS Code

Add the same Apify MCP URL through VS Code's MCP server configuration.

Example prompts:

- “Check these Instagram usernames and return follower and engagement statistics.”
- “Keep only verified profiles above one million followers.”
- “Export these Instagram profile URLs as a creator qualification table.”

### Limits and failure behavior

- Only public Instagram profile data is supported.
- Instagram can restrict or change public data surfaces without notice.
- Some profiles can fail because they are unavailable, renamed, region-restricted, or affected by an upstream profile-schema error.
- A partial batch continues and preserves successful profiles. Failed profiles are logged and not charged as results.
- A run fails when none of the requested profiles returns usable data.
- Engagement is calculated from the recent posts included in the public profile response, not the account's complete history.
- Hidden likes, private profiles, or sparse recent samples can produce `null` or less representative engagement values.
- The Actor does not bypass login, private-account controls, or Instagram permissions.

For reliable batches, avoid repeatedly checking the same very large list within a short period. Use schedules appropriate to how often account-level metrics actually need to change.

### Responsible use and legality

Use this Actor only for lawful purposes and public data you are entitled to process. Follow Instagram's terms, privacy requirements, applicable data-protection laws, and your organization's retention policies. Do not use public account statistics for harassment, discrimination, invasive profiling, or attempts to access private content.

You are responsible for your inputs, downstream decisions, and compliance obligations. Consider aggregation and limited retention when individual-level data is unnecessary.

### Troubleshooting

#### Why is a requested username missing from the dataset?

Check the run log. The profile may not exist, may have been renamed, may be temporarily restricted, or may have returned an upstream schema error. Missing/failed profiles are not charged as profile results.

#### Why are engagement fields null?

Confirm `includeEngagementMetrics` is `true`. A private profile or a profile without a usable recent-post sample can still have account counts while engagement fields remain unavailable.

#### Why did filtering return zero rows?

Run once with `filterMatchedOnly: false`. Inspect `matchedFilters`, follower counts, verification, and engagement values, then adjust the thresholds. Zero rows can be a valid result when no fetched profile matches.

#### Can I scrape private profiles or provide login cookies?

No. This Actor is designed for autonomous public-profile statistics and does not accept Instagram credentials or session cookies.

### FAQ

#### Does it accept both usernames and URLs?

Yes. Combine `usernames` and `profileUrls`; duplicates are removed before processing.

#### Does it scrape all Instagram posts?

No. It returns profile-level data and uses only the recent public post sample for engagement summaries. Choose a dedicated Instagram posts Actor when you need post records.

#### Can I export results to a spreadsheet?

Yes. Download the default dataset as CSV or Excel, or connect an Apify integration to Google Sheets, Make, Zapier, or your own webhook.

#### Can I schedule recurring checks?

Yes. Save a Task and add a schedule. Store each run's dataset externally if you need historical comparisons.

#### Are counts guaranteed to stay identical?

No. Public profile metrics change continuously, and Instagram may round, hide, or temporarily withhold fields.

### Related automation-lab Actors

- [Instagram Scraper](https://apify.com/automation-lab/instagram-scraper) for broader profile and content workflows.
- [Instagram Profile Posts Scraper](https://apify.com/automation-lab/instagram-profile-posts-scraper) when you need individual post records.
- [Instagram Related Profiles Scraper](https://apify.com/automation-lab/instagram-related-profiles-scraper) for public related-account discovery.

Use this Actor when the buyer job is a focused, low-overhead profile-statistics snapshot rather than media or comment extraction.

# Actor input Schema

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

Public Instagram usernames, with or without the @ prefix. Duplicate usernames are removed.

## `profileUrls` (type: `array`):

Public instagram.com profile URLs. You can combine these with usernames.

## `maxProfiles` (type: `integer`):

Maximum number of unique profiles to check in this run.

## `includeEngagementMetrics` (type: `boolean`):

Calculate average and median likes/comments plus engagement rate from the recent posts returned with each public profile.

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

Mark only verified accounts as matching the qualification filters.

## `minFollowers` (type: `integer`):

Minimum follower count for a profile to match. Leave empty for no minimum.

## `maxFollowers` (type: `integer`):

Maximum follower count for a profile to match. Leave empty for no maximum.

## `minEngagementRate` (type: `number`):

Minimum recent-post engagement rate as a percentage. Requires engagement summaries.

## `filterMatchedOnly` (type: `boolean`):

When enabled, save and charge only profiles that satisfy every configured qualification filter.

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

Bounded attempts for transient Instagram rate limits or server errors.

## Actor input object example

```json
{
  "usernames": [
    "instagram",
    "nasa"
  ],
  "profileUrls": [
    {
      "url": "https://www.instagram.com/nasa/"
    }
  ],
  "maxProfiles": 100,
  "includeEngagementMetrics": true,
  "onlyVerified": false,
  "filterMatchedOnly": false,
  "maxRetries": 2
}
```

# Actor output Schema

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

Dataset containing the successfully checked public profiles.

# 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 = {
    "profileUrls": [
        {
            "url": "https://www.instagram.com/nasa/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/instagram-profile-stats-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 = { "profileUrls": [{ "url": "https://www.instagram.com/nasa/" }] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/instagram-profile-stats-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 '{
  "profileUrls": [
    {
      "url": "https://www.instagram.com/nasa/"
    }
  ]
}' |
apify call automation-lab/instagram-profile-stats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/instagram-profile-stats-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/xANbwM7SsrcYqaHc0/builds/wquo27CmaAsZoCfk5/openapi.json
