# Instagram Follower Count Checker: Exact Counts & Bio (`extractify-labs/instagram-com-follower-count-scraper`) Actor

Paste Instagram usernames or profile links and get the exact follower and following count of each account, plus bio, website, category and verified badge: up to 59 profile fields, no login. You pay only for profiles found. Unofficial, not affiliated with Instagram or Meta.

- **URL**: https://apify.com/extractify-labs/instagram-com-follower-count-scraper.md
- **Developed by:** [Extractify Labs](https://apify.com/extractify-labs) (community)
- **Categories:** Social media
- **Features:** Limited permissions
- **Stats:** 14 total users, 1 monthly users, 97.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.21 / 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 Follower Count Checker: Exact Counts & Bio

> Unofficial tool. Not affiliated with, endorsed by, or sponsored by Instagram or Meta Platforms, Inc.

**Instagram Follower Count Checker** takes a list of Instagram usernames or profile links and
returns, for each account, the **exact follower and following count** and up to 59 profile
fields such as bio, website, verified badge and category. No Instagram login, no cookies. You pay only for
profiles found.

### ✅ What it does

- **Exact counts.** `followerCount` and `followingCount` are the exact numbers (686,393,775, not
  "686M"), read at the moment of the lookup.
- **Up to 59 profile fields per account:** name, pronouns, bio and its @mentions and #hashtags, website and
  bio links, verified, private, category, Instagram's raw account-type number, business address when
  the account shows one, profile picture (also in HD), reels count, highlights, Threads badge and
  Instagram's account labels (memorialized, transparency, AI labels and more).
- **Messy lists welcome.** `nasa`, `@nasa` and `https://www.instagram.com/nasa/` are the same
  account: the actor cleans your list, looks each account up once and charges it once.
- **Pay only for profiles found.** Accounts that do not exist, lines that are not usernames,
  duplicates and failed lookups are not charged. Every line of your input gets a status in the
  free **Lookup status** output, so you see exactly what happened to each one.
- **Spending cap built in.** Set *Max profiles* and the run never charges for more than that.
- **Private accounts count too.** Their follower and following counts are public, so they come
  back as normal rows with `isPrivate: true`.

**Who uses it:** social-media and influencer marketers vetting creators, agencies reporting on
client and competitor accounts, brand-safety teams checking account labels, and analysts who
need clean follower numbers for a list of accounts.

### 🚀 Quick start

1. Paste usernames or profile links into **Instagram usernames or profile links**, one per line.
2. Press **Start**.
3. Open the **Overview** tab of the results, or download them as JSON, CSV or Excel.

The default input checks `nasa`, `natgeo` and `instagram` and finishes in a minute or two.

Only need the numbers? Switch off **Profile details** for the fastest counts-only lookup. The
price per profile is the same.

### 🔧 Input

| Field | What it does |
|---|---|
| **Instagram usernames or profile links** (`usernames`) | One account per line: `nasa`, `@nasa` or `https://www.instagram.com/nasa/`. Required. |
| **Max profiles** (`maxItems`) | Look up at most this many accounts, in your order, and stop. Default 100; 0 = no limit. |
| **Posts count (best effort)** (`includePostsCount`) | Tries to add `postsCount` and `postsCountIsExact`. Off by default: Instagram rarely shows the posts count to logged-out lookups, so it is usually `null`. Makes the run slower, not more expensive. |
| **Profile details** (`includeProfileDetails`) | Adds the website, category, account type and address, HD picture, reels count and Instagram's account labels (up to 36 more fields). On by default. |
| **Proxy** (`proxyConfiguration`) | Off by default. Switch to Apify Proxy (automatic datacenter group) if your runs are refused. Residential proxies and your own proxy URLs are not accepted. |

Example input:

```
{
  "usernames": ["nasa", "@natgeo", "https://www.instagram.com/instagram/"],
  "maxItems": 100,
  "includePostsCount": false,
  "includeProfileDetails": true
}
```

### 📊 Output

One item per account found. Example (abridged; values from 29 October 2026):

```
{
  "username": "instagram",
  "pk": "25025320",
  "fullName": "Instagram",
  "followerCount": 686393775,
  "followingCount": 159,
  "postsCount": null,
  "postsCountIsExact": null,
  "isVerified": true,
  "isPrivate": false,
  "biography": "Discover what's new on Instagram 🔎✨",
  "profileStatus": "ok",
  "profileUrl": "https://www.instagram.com/instagram/",
  "inputUsername": "https://www.instagram.com/instagram/",
  "scrapedAt": "2026-10-29T10:15:00Z",
  "statusDetail": null
}
```

Every item has the same set of fields. A field Instagram does not show for that account, or that an
option you switched off would have filled, is `null`. Many of Instagram's labels (AI labels,
transparency labels, live broadcast and so on) are `null` on most accounts: they are filled only
when the account carries them.

**Views in the results:** Overview, Follower counts, Profile, Business accounts, Account labels
and Input match.

#### Fields

Field names follow Instagram's own names in camelCase (`follower_count` becomes
`followerCount`). "Details" means the field is filled when **Profile details** is on, "Posts"
means it is filled only when **Posts count** is on, and even then it is usually `null`; the rest
are always filled when Instagram has them.

| Field | Instagram name | Filled | Meaning |
|---|---|---|---|
| `username` | username | always | The account's username as Instagram shows it. |
| `pk` | pk | always | Instagram's numeric account id. Stays the same when the username changes. |
| `fullName` | full_name | always | The display name. |
| `followerCount` | follower_count | always | Exact number of followers at the time of the lookup. |
| `followingCount` | following_count | always | Exact number of accounts it follows. |
| `postsCount` | — | Posts | Number of posts, when Instagram shows it (rarely); rounded above 10,000. |
| `postsCountIsExact` | — | Posts | `true` when `postsCount` is exact, `false` when Instagram rounded it. |
| `isVerified` | is_verified | always | Has the blue verified badge. |
| `isPrivate` | is_private | always | Private account. Counts are still exact; bio and posts are hidden. |
| `profileStatus` | — | always | `ok` or `private`. |
| `biography` | biography | always | The bio text. Empty for private accounts. |
| `biographyWithEntities` | biography_with_entities | Details | The @mentions and #hashtags in the bio. |
| `externalUrl` | external_url | Details | The website link on the profile. |
| `bioLinks` | bio_links | always | The links under the bio, with their titles. |
| `category` | category | Details | The business or creator category, for example "Science". |
| `shouldShowCategory` | should_show_category | Details | Whether the profile shows its category. |
| `isBusiness` | is_business | Details | Instagram's own business flag, passed through as it is returned to a logged-out visitor. Often `false` even on brand accounts: `category` is the better signal. |
| `isProfessionalAccount` | is_professional_account | Details | Instagram's own professional-account flag, passed through as it is returned to a logged-out visitor. Usually empty (`null`). |
| `accountType` | account_type | Details | Instagram's raw account-type number, passed through unmapped: Instagram does not document its values. Brand accounts we checked show `2`. |
| `addressStreet`, `cityName`, `zip` | address_street, city_name, zip | Details | The business address, when the account shows one. |
| `profilePicUrl` | profile_pic_url | always | Profile picture link. Expires within days. |
| `hdProfilePicUrlInfo` | hd_profile_pic_url_info | Details | The profile picture in high resolution. Expires within days. |
| `hasProfilePic` | has_profile_pic | Details | Has a profile picture. |
| `totalClipsCount` | total_clips_count | Details | Number of reels. |
| `hasAnyClips` | has_any_clips | always | Has reels. |
| `loxHighlightsConnection` | lox_highlights_connection | always | Story highlights: titles and covers. |
| `hasStoryArchive` | has_story_archive | Details | Has a story archive. |
| `textPostAppBadgeLabel`, `showTextPostAppBadge` | text_post_app_badge_label, show_text_post_app_badge | always | The Threads badge under the name. |
| `accountBadges` | account_badges | always | Badges shown on the profile. |
| `isMemorialized` | is_memorialized | always | Memorialized ("Remembering") account. |
| `pronouns` | pronouns | always | Pronouns shown on the profile, as Instagram lists them. Usually empty. |
| `isUnpublished` | is_unpublished | always | Unpublished account. |
| `transparencyLabel`, `transparencyProduct` | transparency_label, transparency_product | Details | Transparency label, for example state-controlled media. |
| `aigmAccountLabelInfo`, `aiAgentType`, `profilePicGenaiToolInfo` | aigm_account_label_info, ai_agent_type, profile_pic_genai_tool_info | Details | AI labels on the account and on its picture. |
| `gating` | gating | Details | Sensitive-content screen on the profile. |
| `regulatedNewsInLocations` | regulated_news_in_locations | Details | Countries where the account's news content is restricted. |
| `liveBroadcastVisibility`, `liveBroadcastId` | live_broadcast_visibility, live_broadcast_id | Details | Live broadcast in progress. |
| `isEmbedsDisabled` | is_embeds_disabled | Details | Posts cannot be embedded on other sites. |
| `metaVerifiedBenefitsInfo` | meta_verified_benefits_info | Details | Meta Verified benefits shown on the account. |
| `isRingCreator`, `showRingAward`, `ringCreatorMetadata` | is_ring_creator, show_ring_award, ring_creator_metadata | Details | Creator award flags. |
| `fbid` | fbid | always | Instagram's second account id (business id). |
| `allMediaCount`, `mediaCount`, `hasLongformMedia`, `hasRestylePresets`, `hasChaining`, `removeMessageEntrypoint`, `hideCreatorMarketplaceBadge`, `showAccountTransparencyDetails`, `isCannes` | all_media_count, media_count, has_longform_media, has_restyle_presets, has_chaining, remove_message_entrypoint, hide_creator_marketplace_badge, show_account_transparency_details, is_cannes | always or Details | Passed through exactly as Instagram reports them. Usually `null` or `false`. |
| `inputUsername` | — | always | The line of your input that gave this profile. |
| `profileUrl` | — | always | Link to the profile. |
| `scrapedAt` | — | always | When the profile was looked up (UTC). |
| `statusDetail` | — | always | `null`, or a sentence saying which part is missing (for example the posts count) and why. |

#### Lookup status (free)

The **Lookup status** output lists every line of your input with its result: `found`,
`private`, `not_found` (no such account, or deactivated), `invalid` (not an Instagram username),
`duplicate` (same account as an earlier line), `failed` (Instagram did not answer), or
`skipped_cap`, `skipped_charge_limit`, `skipped_timeout`, `skipped_aborted` (not looked up because
the run stopped first). Only `found` and `private` are charged.

### 💸 Pricing

You pay per profile found: **$0.21 per 1,000 profiles**, the same on every Apify plan.
Private accounts count as found, because their counts are exact.

Free of charge: accounts that do not exist, lines that are not usernames, duplicates, and lookups
Instagram did not answer. The price per profile is the same whatever options you switch on, with
or without Apify Proxy.

Set *Max profiles* or a spending limit on the run, and the actor stops cleanly when it is reached,
keeping everything it has collected.

### ⚡ Speed

| Options | Time per 1,000 accounts (approximate) |
|---|---|
| Profile details (the default) | about 10 minutes |
| Profile details and posts count | about 15 minutes |
| Counts only (both off) | about 5 minutes |

Accounts that do not exist take a fraction of that. Long lists run for hours: raise the run
timeout in **Run options** if needed. When the timeout comes first, the run ends cleanly and the
Lookup status lists the accounts it did not reach.

### ⚠️ Limitations

- **What a logged-out visitor sees, nothing more.** No followers or following lists, no posts,
  reels, stories or comments, and no email or phone number: Instagram does not show those without
  logging in.
- **The posts count is best effort, and off by default.** Instagram rarely shows it to
  logged-out lookups, so with **Posts count** on it is usually `null`, with or without a proxy.
  When it is shown, it is rounded above 10,000 (`postsCountIsExact` is then `false`).
- **Counts move.** The follower count is exact at the moment of the lookup; a big account can
  gain or lose a few followers a second later.
- **Profile picture links expire** within days. Download the pictures if you need to keep them.
- **No built-in history.** Each run is a snapshot. To follow an account over time, schedule the
  actor and compare runs by `pk` and `scrapedAt`.
- **Instagram may refuse some lookups.** They are retried, then listed as `failed` and not
  charged; run them again later. A row whose posts count or details could not be fetched is still
  saved with its exact counts, and `statusDetail` says what is missing.
- **A renamed account** is found under its new username only. Keep `pk` to recognise it.
- **A small cache store.** To keep later runs fast, the actor saves Instagram's current page
  settings (under 1 KB, no profile data) in a key-value store named
  `instagram-com-follower-count-scraper-cache` in your account. Deleting it is safe; the next run
  creates it again.
- **One maintenance request may use Apify Proxy.** When Instagram updates its website, the actor
  loads one profile page through Apify Proxy to adapt, even if your proxy is off. It is not
  charged to you.

### ❓ FAQ

**How do I check an Instagram account's follower count?** Paste the username into the input and
press Start. `followerCount` in the result is the exact number.

**Is the follower count exact?** Yes. Instagram's page rounds it ("686M followers"); this actor
returns the exact figure, for example 686,393,775 for @instagram on 29 October 2026.

**Can I check many Instagram accounts at once?** Yes. Paste as many as you need, one per line;
use *Max profiles* to cap a run.

**Do I need an Instagram account or to log in?** No. The actor never logs in and never asks for
your password.

**Do I pay for accounts that don't exist?** No. Only accounts found (public or private) are
charged. The Lookup status shows every other line and why.

**Can I get the posts count?** Only sometimes. Switch on **Posts count**: Instagram rarely shows
the number to logged-out lookups, so it is usually `null`. When it is shown, it is exact below
10,000 and rounded above ("32K"), and `postsCountIsExact` says which.

**Can I track follower growth?** Schedule the actor (daily, for example) and compare
`followerCount` across runs by `pk`.

**Do I need a proxy?** The proxy is off by default. If your runs are refused, switch to Apify
Proxy; the price per profile does not change.

**Is it legal to scrape Instagram profiles?** The actor reads only what a logged-out visitor can
see. See the legal note below.

### ⚖️ Legal and personal data

This actor reads public Instagram profiles only, logged out, without cookies. Profiles belong to
people and organisations, and names, bios, pictures and links are personal data under the GDPR
and similar laws. You are responsible for having a lawful basis for collecting and using them,
and for respecting Instagram's terms where they apply to you.

Unofficial tool. Not affiliated with, endorsed by, or sponsored by Instagram or Meta Platforms,
Inc. "Instagram" is a trademark of Meta Platforms, Inc., used here only to identify the website
the data comes from.

### 📝 Changelog

See the **Changelog** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/extractify-labs/instagram-com-follower-count-scraper/changelog.md

# Actor input Schema

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

One account per line: a username (nasa), a handle (@nasa) or a profile link (https://www.instagram.com/nasa/). The same account written twice is looked up and charged once. Lines that are not Instagram usernames are listed as invalid in the Lookup status and never charged.

## `maxItems` (type: `integer`):

Look up at most this many accounts, in the order you listed them, then stop. You are never charged for more profiles than this. Default 100; set 0 for no limit. Accounts past the limit are listed as skipped in the Lookup status.

## `includePostsCount` (type: `boolean`):

Off by default. Tries to add the number of posts (postsCount) and whether it is exact (postsCountIsExact). Best effort: Instagram rarely shows the posts count to logged-out lookups, so it is usually empty, with or without a proxy. When it is shown, it is exact below 10,000 posts and rounded above, for example 32K. Makes the run slower; the price per profile stays the same.

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

Adds the website, category, account type and address, HD profile picture, reels count and Instagram's account labels: up to 36 more fields. Makes the run a little slower; the price per profile stays the same.

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

Off by default. If Instagram refuses your runs, switch to Apify Proxy and keep the automatic (datacenter) group. Residential proxies and your own proxy URLs are not accepted. The price per profile is the same either way.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "natgeo",
    "instagram"
  ],
  "maxItems": 100,
  "includePostsCount": false,
  "includeProfileDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every profile found, one item per account, with its counts and profile fields.

## `lookupStatus` (type: `string`):

Every line of your input and what happened to it: found, private, not found, invalid, duplicate, failed or skipped. Free of charge.

## `overview` (type: `string`):

The profiles found as a compact table: username, name, followers, following, verified and private.

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

What this run did: inputs received, profiles found, not found and failed, partial rows and why it stopped.

# 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": [
        "nasa",
        "natgeo",
        "instagram"
    ],
    "maxItems": 100,
    "includePostsCount": false,
    "includeProfileDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("extractify-labs/instagram-com-follower-count-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": [
        "nasa",
        "natgeo",
        "instagram",
    ],
    "maxItems": 100,
    "includePostsCount": False,
    "includeProfileDetails": True,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("extractify-labs/instagram-com-follower-count-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": [
    "nasa",
    "natgeo",
    "instagram"
  ],
  "maxItems": 100,
  "includePostsCount": false,
  "includeProfileDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call extractify-labs/instagram-com-follower-count-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,extractify-labs/instagram-com-follower-count-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/odmgbVbe53dEKAsKt/builds/S4nTFkU70prZRmcFm/openapi.json
