# Instagram Profile Stats Scraper (Followers, Bio, Posts) (`juliob.rangel/instagram-profile-stats`) Actor

Get public Instagram profile data in bulk without login: followers, following, posts count, bio, external link, category, verified and business status, plus the latest posts with likes and comments.

- **URL**: https://apify.com/juliob.rangel/instagram-profile-stats.md
- **Developed by:** [Julio Barcellos Rangel](https://apify.com/juliob.rangel) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 profile scrapeds

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 Profile Stats Scraper (Followers, Bio, Posts)

Instagram Profile Stats Scraper gets public data for any list of Instagram accounts in bulk, without logging in: followers, following, number of posts, bio, external link, category, verified and business status, plus the 12 latest posts with likes and comments and an engagement rate. It is an Instagram profile scraper for agencies, brands and analysts who vet influencers or track accounts over time. Use it as an Instagram follower count checker or to export Instagram profile data to Excel, CSV or JSON.

### What does Instagram Profile Stats Scraper do?

You give it a list of Instagram accounts. For each one, the scraper loads the public profile data that Instagram shows to a logged-out visitor and saves one row per profile in a dataset.

It accepts any of these forms, mixed in the same list:

| Input form | Example |
|---|---|
| Username | `nasa` |
| Username with @ | `@nike` |
| Profile URL | `https://www.instagram.com/nasa/` |

Every line is turned into a lowercase username and duplicates are removed, so `NASA`, `@nasa` and `https://www.instagram.com/nasa/` count as one profile.

Each row holds the account's numbers (followers, following, posts), its identity (username, full name, user ID, profile picture), its bio, external link and category, and flags for verified, business, professional and private accounts. By default it also includes the latest posts shown on the profile, each with caption, likes, comments, video views, date and image, and an engagement rate computed from them. You do not need an Instagram account, cookies or an API key.

### What data can you extract?

| Field | What it means | Example |
|---|---|---|
| `input` | The username the scraper read from your line | `nasa` |
| `username` | Instagram handle | `nasa` |
| `fullName` | Display name | `NASA` |
| `userId` | Instagram's numeric user ID | `528817151` |
| `url` | Profile link | `https://www.instagram.com/nasa/` |
| `followers` | Number of followers | `104261826` |
| `following` | Number of accounts the profile follows | `90` |
| `posts` | Total number of posts on the profile | `4958` |
| `biography` | Bio text | `Making the seemingly impossible, possible. ✨` |
| `externalUrl` | Link in the bio, if any | `https://www.nasa.gov/` |
| `category` | Category shown on professional accounts | `Government Agencies` |
| `isVerified` | Has the verified badge | `true` |
| `isBusiness` | Is a business account | `true` |
| `isProfessional` | Is a professional (business or creator) account | `true` |
| `isPrivate` | The account is private | `false` |
| `profilePic` | Profile picture link (HD when available) | `https://scontent-ord5-1.cdninstagram.com/v/…` |
| `engagementRate` | Average likes plus comments per latest post, divided by followers, in percent | `0.16` |
| `latestPosts` | List of the latest posts (see the fields below) | `[{…}]` |
| `latestPosts.shortcode` | Short code of the post | `DeJ28eTxo4s` |
| `latestPosts.url` | Link to the post | `https://www.instagram.com/p/DeJ28eTxo4s/` |
| `latestPosts.type` | `GraphImage` (photo), `GraphVideo` (video or reel) or `GraphSidecar` (carousel) | `GraphImage` |
| `latestPosts.caption` | Caption text | `Brewing up new stars 🪄…` |
| `latestPosts.likes` | Number of likes | `195309` |
| `latestPosts.comments` | Number of comments | `477` |
| `latestPosts.views` | Video views (videos only) | `1232330` |
| `latestPosts.takenAt` | When the post was published (ISO 8601) | `2026-10-06T13:10:11.000Z` |
| `latestPosts.displayUrl` | Image link of the post | `https://scontent-ord5-1.cdninstagram.com/v/…` |
| `scrapedAt` | When the row was collected | `2026-10-08T20:13:05.389Z` |
| `error` | Only on error rows: why the profile was not returned | `Profile not found` |

All counts are real numbers (for example `104261826`, not "104M"), so you can sort, filter and compute ratios directly in Excel or Google Sheets. Empty values come as `null`.

### How to use Instagram Profile Stats Scraper

1. Open Instagram Profile Stats Scraper in Apify Console (sign in or create a free Apify account).
2. In **Profiles**, paste usernames (with or without @) or profile URLs, one per line. Hundreds of lines are fine.
3. Keep **Include latest posts** on to get the 12 latest posts and the engagement rate data, or turn it off for a lighter table.
4. Leave **Proxy** on the default Apify Proxy unless you have a reason to change it.
5. Click **Start**. The log shows how many profiles were returned.
6. Open the **Output** tab to see the table, then click **Export** to download the data as JSON, CSV, Excel or HTML.
7. Optional: save the input as a task and add a schedule (for example weekly) to track how the same profiles grow.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `profiles` | array of strings | `["@nike", "https://www.instagram.com/nasa/"]` | Instagram usernames (with or without @) or profile URLs. |
| `includeLatestPosts` | boolean | `true` | Adds the latest posts (up to 12) with likes, comments and captions. |
| `proxy` | object | `{"useApifyProxy": true}` | Apify Proxy settings. |

There is no "max results" setting: each profile in the list returns exactly one row (the profile, or an error row). A plain username can be up to 30 characters of letters, numbers, underscores and dots. Lines that are not a username or an `instagram.com/` link produce no row.

Example input:

```json
{
  "profiles": [
    "@nike",
    "natgeo",
    "https://www.instagram.com/nasa/"
  ],
  "includeLatestPosts": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

### Output example

A real row from the latest run (links and the caption are shortened, and only 2 of the 12 latest posts are shown):

```json
{
  "input": "nasa",
  "username": "nasa",
  "fullName": "NASA",
  "userId": "528817151",
  "url": "https://www.instagram.com/nasa/",
  "followers": 104261826,
  "following": 90,
  "posts": 4958,
  "biography": "Making the seemingly impossible, possible. ✨",
  "externalUrl": "https://www.nasa.gov/",
  "category": "Government Agencies",
  "isVerified": true,
  "isBusiness": true,
  "isProfessional": true,
  "isPrivate": false,
  "profilePic": "https://scontent-ord5-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?…",
  "engagementRate": 0.16,
  "latestPosts": [
    {
      "shortcode": "DeJ28eTxo4s",
      "url": "https://www.instagram.com/p/DeJ28eTxo4s/",
      "type": "GraphImage",
      "caption": "Brewing up new stars 🪄\n \n@NASAWebb’s unique view of the stellar nursery known as NGC 7129 reveals numerous stars…",
      "likes": 195309,
      "comments": 477,
      "views": null,
      "takenAt": "2026-10-06T13:10:11.000Z",
      "displayUrl": "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/838879752_18633093571001809_7013098794556155636_n.jpg?…"
    },
    {
      "shortcode": "DeCPVhERA8e",
      "url": "https://www.instagram.com/p/DeCPVhERA8e/",
      "type": "GraphVideo",
      "caption": "Room with a view. Check out my new digs as I camp out in Dragon until our departure…",
      "likes": 190759,
      "comments": 1957,
      "views": 1232330,
      "takenAt": "2026-10-03T14:10:18.000Z",
      "displayUrl": "https://scontent-ord5-1.cdninstagram.com/v/…"
    }
  ],
  "scrapedAt": "2026-10-08T20:13:05.389Z"
}
```

An error row looks like this and is not charged:

```json
{
  "input": "this.profile.does.not.exist",
  "error": "Profile not found",
  "scrapedAt": "2026-10-08T20:13:10.000Z"
}
```

### How much does it cost?

Instagram Profile Stats Scraper uses pay per event pricing. You pay **$1.50 per 1,000 profiles** returned ($0.0015 per profile, latest posts included) on the Free plan. Platform usage (compute and proxy) is included in that price.

| Apify plan | Price per 1,000 profiles |
|---|---|
| Free | $1.50 |
| Bronze (10% off) | $1.35 |
| Silver (20% off) | $1.20 |
| Gold and higher (30% off) | $1.05 |

Worked examples on the Free plan:

- 200 influencer profiles to vet for a campaign = **$0.30**
- 10,000 profiles from a creator database = **$15.00**
- 500 profiles tracked every week for a year = 26,000 profiles = **$39.00** ($27.30 on Gold)

What you are **not** charged for:

- Error rows ("Profile not found" or "Could not load profile").
- Retries. A profile that needs several tries is charged once, only if it is returned.
- Duplicate lines and lines that are not valid usernames or profile URLs.
- The latest posts. They come inside the profile row at no extra cost.

### Use cases

- **Influencer vetting.** Check followers, the verified badge and the engagement rate before you contact a creator. Low engagement on a big audience is a warning sign.
- **Growth tracking.** Run the same list on a schedule and chart followers and posts over time using `scrapedAt`.
- **Competitor benchmarking.** Compare brand accounts in your niche by audience size, posting volume and engagement on their latest posts.
- **Lead list enrichment.** Add Instagram audience size, bio link and category to a list of brands or creators you already have.
- **Business account checks.** See which accounts are business or professional accounts and which category they chose.
- **List cleaning.** Find usernames that no longer exist; they come back as "Profile not found".
- **Content snapshot.** Get the captions, dates and numbers of each account's latest posts in the same run.

### Tips and limits

- **One row per profile.** The latest posts are capped at what the profile page shows (up to 12). For more posts per profile, with date filter and reels views, use Instagram Posts Scraper.
- **Pinned posts count.** The latest posts are the first posts Instagram shows on the profile, pinned posts included, so `engagementRate` includes them too.
- **How engagement rate works.** It is the sum of likes and comments of the latest posts, divided by the number of those posts, divided by followers, times 100, rounded to 2 decimals. It is `null` when there are no posts or no followers. It is still filled when `includeLatestPosts` is off.
- **Private profiles.** A private account is not an error: you get the public header data (counts, bio) with `isPrivate` set to `true`. Instagram does not show its posts to logged-out visitors, so expect `latestPosts` to be empty and `engagementRate` to be `null`.
- **Retries.** Each profile gets up to 8 tries with a 30-second timeout. Instagram refuses some profiles from datacenter IPs, so after a few fresh IPs the scraper switches to residential IPs when they are available. "Could not load profile" means all tries failed; run those usernames again later.
- **Profiles are processed one at a time.** A long list simply takes longer. You can split a very large list into several runs.
- **Image links expire.** `profilePic` and `displayUrl` are temporary Instagram CDN links. Download the pictures soon if you need to keep them.
- **No emails or phone numbers.** There are no contact fields. If a creator wrote an email in the bio, you will see it in `biography`.

### Use it from the API, Python or JavaScript

JavaScript (Node.js) with the official `apify-client` package:

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const input = { profiles: ['@nike', 'https://www.instagram.com/nasa/'], includeLatestPosts: true };

(async () => {
    const run = await client.actor('juliob.rangel/instagram-profile-stats').call(input);
    const { items } = await client.dataset(run.defaultDatasetId).listItems();
    console.log(items);
})();
```

Python with the official `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
run_input = {'profiles': ['nasa', 'natgeo'], 'includeLatestPosts': False}

run = client.actor('juliob.rangel/instagram-profile-stats').call(run_input=run_input)
items = client.dataset(run['defaultDatasetId']).list_items().items
for item in items:
    print(item.get('username'), item.get('followers'), item.get('engagementRate'))
```

The scraper also works with Make, Zapier and n8n, can export results to Google Sheets, can call your webhook when a run finishes, and can be used by AI agents through the Apify MCP server.

### FAQ

#### Do I need an Instagram login, cookies or an API key?

No. The scraper reads public profile data without logging in. You only need an Apify account to run it.

#### Can I export Instagram profile stats to Excel or CSV?

Yes. After the run, open the Output tab and export the dataset as Excel, CSV, JSON or HTML, or read it through the API.

#### How many profiles can I scrape in one run?

There is no fixed cap in the scraper. Each line in `profiles` returns one row, and profiles are fetched one after another, so bigger lists take longer.

#### Is it legal to scrape Instagram profiles?

The scraper only collects publicly available data. You are responsible for complying with Instagram's terms and with privacy laws such as GDPR and LGPD. Profiles of private individuals are personal data, so you need a legitimate reason to collect and use them.

#### Why did I get a row with an `error` field?

"Profile not found" means Instagram reported that the account does not exist (deleted, renamed or misspelled). "Could not load profile" means Instagram did not return the profile after 8 tries. Error rows are not charged.

#### How is the engagement rate calculated?

Average of likes plus comments over the latest posts, divided by followers, in percent. For example, `0.16` means each recent post gets interactions equal to 0.16% of the follower count.

#### Can I get followers lists or stories?

No. The scraper returns profile stats and the latest posts only. It does not list followers, following accounts, stories or highlights.

### Related scrapers

- [Instagram Posts Scraper (Reels, Likes, Views, Captions)](https://apify.com/juliob.rangel/instagram-posts-scraper-fast)
- [TikTok Profile Stats Scraper (Followers, Likes, Bio)](https://apify.com/juliob.rangel/tiktok-profile-stats)
- [YouTube Channel Info Scraper (Subscribers, Views, Links)](https://apify.com/juliob.rangel/youtube-channel-info)
- [Snapchat Profile Scraper (Subscribers, Spotlight Views, Bio)](https://apify.com/juliob.rangel/snapchat-profile-scraper-fast)
- [Threads Scraper (Profiles, Posts, Search)](https://apify.com/juliob.rangel/threads-scraper-fast)
- [Twitch Channel Scraper (Followers, Viewers, Emails)](https://apify.com/juliob.rangel/twitch-channel-scraper-fast)

***

## Estatísticas de Perfis do Instagram

Seguidores, posts, bio, link, categoria, selo de verificado e os 12 últimos posts com curtidas e comentários, além da taxa de engajamento, de perfis públicos e sem login. Para avaliar influenciadores e acompanhar concorrentes.

# Actor input Schema

## `profiles` (type: `array`):

Instagram usernames (with or without @) or profile URLs.

## `includeLatestPosts` (type: `boolean`):

Add the 12 most recent posts with likes, comments and captions.

## `proxy` (type: `object`):

Apify Proxy settings.

## Actor input object example

```json
{
  "profiles": [
    "@nike",
    "https://www.instagram.com/nasa/"
  ],
  "includeLatestPosts": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "profiles": [
        "@nike",
        "https://www.instagram.com/nasa/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("juliob.rangel/instagram-profile-stats").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 = { "profiles": [
        "@nike",
        "https://www.instagram.com/nasa/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("juliob.rangel/instagram-profile-stats").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 '{
  "profiles": [
    "@nike",
    "https://www.instagram.com/nasa/"
  ]
}' |
apify call juliob.rangel/instagram-profile-stats --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,juliob.rangel/instagram-profile-stats"
        }
    }
}
```

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/MlJsswNUPGsdGlMgZ/builds/n11QSfThGYwPWQgx8/openapi.json
