# Instagram Profile Scraper: Bio, Followers & Posts Tracker (`themineworks/instagram-profile-scraper`) Actor

Scrape any public Instagram profile without login: followers, following, posts count, bio, verified/private flags, category, profile pic & external link, plus optional recent posts. Bulk usernames. Works in Claude, ChatGPT & any MCP AI agent.

- **URL**: https://apify.com/themineworks/instagram-profile-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Social media, Lead generation, MCP servers
- **Stats:** 14 total users, 10 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 profiles

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/platform/actors/running/actors-in-store#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 Scraper: Followers, Bio & Stats (No Login)

### Overview

Instagram Profile Scraper turns any public Instagram username into a clean, structured profile record in seconds. Feed it one handle or a bulk list and it returns follower count, following count, posts count, bio, verification and business flags, category, external website link, profile picture URL, and optional recent posts. No Business account, no OAuth app, no Graph API review, no cookies.

Instagram's official Graph API only surfaces data for accounts you already own or manage, and it demands a Business or Creator account plus an approved app for anything else. This scraper works from the same public HTML and public API that any logged out visitor already sees, so you can pull public profile data for any public account without registering an app or handing over credentials.

Reliability posture: blocked, empty, or failed runs are never charged. You only pay for a profile record that was actually delivered.

✅ No login required | ✅ No API key | ✅ Pay only for profiles returned | ✅ MCP-ready for AI agents

### Features

Bulk profile lookup. Paste one username or hundreds and get one structured JSON row per account.
Full profile snapshot. Followers, following, posts, bio, verified flag, business flag, category, and external link.
Recent posts add-on. Optional array of the latest posts with caption, like count, comment count, and media URL.
Multi-tier fetch. Tries the rich public API first, then falls back to public HTML, tagged in the `source` field.
No ban risk. Never authenticates with Instagram, never uses cookies, never touches a private account.

### How it works

The actor accepts either usernames (without the `@`) or full profile URLs. For each handle it first calls Instagram's public web API surface used by the site itself for logged out visitors, then falls back to parsing the public HTML if the API response is thin. Residential proxies keep requests looking like normal traffic so the actor stays under per IP limits.

Every record is normalised into a consistent schema regardless of which tier produced it. The `source` field records whether the record came from `api`, `html-og`, or `browser`. Blocked profiles and profiles that do not exist are never charged: you pay only for profiles actually delivered.

### 🧾 Input configuration

```json
{
  "usernames": ["nasa", "natgeo"],
  "includePosts": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### 📤 Output format

```json
{
  "username": "nasa",
  "full_name": "NASA",
  "biography": "Making the seemingly impossible, possible. ✨",
  "followers": 104306689,
  "following": 91,
  "posts_count": 4849,
  "is_verified": true,
  "is_private": false,
  "is_business": true,
  "profile_pic_url": "https://scontent-iad3-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg",
  "external_url": "https://www.nasa.gov/",
  "user_id": "528817151",
  "profile_url": "https://www.instagram.com/nasa/",
  "source": "api",
  "scraped_at": "2026-07-15T04:23:50.989Z",
  "recent_posts": [
    {
      "shortcode": "DayIkFmDwlb",
      "url": "https://www.instagram.com/p/DayIkFmDwlb/",
      "caption": "Meet our Nancy Grace Roman Space Telescope! Scheduled to launch this August, Roman is set to join orbiting telescopes like @NASAHubble and @NASAWebb in helping scientists study the cosmos.",
      "like_count": 99685,
      "comment_count": 469,
      "is_video": false,
      "display_url": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-15/746779742_18627224869049152_4483260127005954439_n.jpg",
      "video_url": null,
      "timestamp": "2026-07-14T18:27:48.000Z"
    }
  ]
}
```

Note: `category` is present only when the account has a business/creator category set on Instagram; it was not set on this run's source profile, so the key is omitted rather than returned as `null`.

Every profile record contains these fields:

| Field | Description |
| --- | --- |
| 👤 `username` | Public Instagram handle without the @ |
| 🏷️ `full_name` | Display name on the profile |
| 📝 `biography` | Bio text as shown on the profile |
| 👥 `followers` | Follower count at time of scrape |
| ➡️ `following` | Number of accounts the profile follows |
| 🖼️ `posts_count` | Total posts published |
| ✅ `is_verified` | True if the account has a verification badge |
| 🔒 `is_private` | True if the account is private |
| 💼 `is_business` | True if the account is a Business or Creator account |
| 🗂️ `category` | Business or creator category, when set |
| 🔗 `external_url` | Website link listed on the profile |
| 📷 `profile_pic_url` | Full resolution profile picture URL |
| 🆔 `user_id` | Internal numeric Instagram ID |
| 🌐 `profile_url` | Canonical public profile URL |
| 🧪 `source` | Which tier produced the record: `api`, `html-og`, or `browser` |
| 🕒 `scraped_at` | ISO timestamp when the record was captured |
| 🎞️ `recent_posts` | Optional array of latest posts with caption, likes, comments, media URL |

**One more row at the end of every run:** every run also ends with a final `_type: "info"` record — informational only, never billed — with a two-line nudge: how to put this actor on an automatic schedule (see "Run on a schedule" below), and a link to leave a Store review if it saved you time.

### 💼 Common use cases

**Influencer discovery and vetting**
Score creators on real follower size, verified status, and category before you reach out.
Pull bios and external links across hundreds of handles in one run.

**Competitor and creator tracking**
Snapshot rivals' follower counts and posting cadence on a weekly schedule.
Monitor business category changes and bio updates over time.

**Lead enrichment**
Append Instagram reach, website link, and category to a list of brands or prospects.
Turn a client's target account list into a contactable roster.

**Market research**
Profile a whole niche in one run to map who is big, who is a business account, and who is rising.
Build a clean roster of accounts to monitor for a campaign.

### 🚀 Getting started

1. Open the actor on Apify and click Try for free.
2. Paste one or more usernames into the Usernames field. Full profile URLs also work.
3. Toggle Include recent posts if you want each profile's latest posts attached.
4. Keep the default `RESIDENTIAL` proxy group. Instagram rate limits datacenter IPs.
5. Click Save & Start, then download the dataset as JSON, CSV, or Excel, or pull it via the Apify API or MCP.

### 🔁 Run on a schedule

Turn this from a one-off pull into a standing feed with Apify's built-in Schedules — no code, no cron server of your own.

1. Run the actor once with the input you want repeated, then click **Save as a task** (top of the run form) — this keeps your exact input attached for every future run.
2. In the Apify Console, go to **Schedules** (left sidebar) → **Create new**.
3. Name it, set your timezone, and pick a frequency — a preset (hourly / daily / weekly) or a custom cron expression (e.g. `0 6 * * *` for daily at 6am).
4. Under **Actors or tasks to run**, add the task you saved in step 1.
5. Save. From then on it runs unattended on your schedule, billed the same pay-per-profile way as a manual run — nothing is charged just for the schedule existing.

Prefer to automate the setup itself? Same thing via the API:

```bash
curl -X POST "https://api.apify.com/v2/schedules?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "instagram-profile-scraper-daily",
    "cronExpression": "0 6 * * *",
    "isEnabled": true,
    "actions": [{ "type": "RUN_ACTOR", "actorId": "themineworks/instagram-profile-scraper" }]
  }'
```

Full options — time zones, run notifications, pausing a schedule — are in Apify's [Schedules documentation](https://docs.apify.com/platform/schedules).

### FAQ

**Do I need an Instagram login or API key?**
No. The scraper only reads public profile data that a logged out visitor can see. No account, no password, no cookies, and no Graph API app required.

**Can I scrape by profile URL or ID instead of username?**
Yes. Paste full profile URLs into the Usernames field. Usernames without the `@` are the simplest input and each profile is scraped independently.

**How am I charged?**
Pay per result. You are billed only for profiles that are actually delivered. Blocked or not found profiles are never charged.

**Why is a field sometimes empty?**
The actor tries the public API first and falls back to Instagram's public HTML when needed. The `source` field tells you which tier produced each record. On the HTML fallback, some fields (like `recent_posts`) may be empty.

**Is it legal to scrape Instagram profiles?**
The actor collects only publicly available data and never accesses private accounts. Some public data may still be personal data under regulations like GDPR, so only scrape what you have a legitimate reason to use.

**Can I use it inside an AI agent?**
Yes. It is exposed as an MCP tool. See below.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/instagram-profile-scraper
```

Or call it programmatically with the Apify client:

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/instagram-profile-scraper').call({
  usernames: ['nasa', 'natgeo'],
  includePosts: false,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### 🛠️ Complete your social intelligence pipeline

Profile data is the anchor. Round out the picture with the rest of the suite:

- **[Threads Scraper](https://apify.com/themineworks/threads-scraper)**: posts, profiles, hashtags, and search on Meta Threads.
- **[Twitter / X Scraper](https://apify.com/themineworks/twitter-x-scraper)**: tweets by keyword or handle with no paid API key.
- **[Pinterest Scraper](https://apify.com/themineworks/pinterest-profile-scraper)**: profiles, pins, boards, and related pin discovery.

Typical flow: profile scraper builds the roster, then Threads and Twitter scrapers watch what the same people are saying across networks.

Questions or need a custom field set? Reach out through the Apify profile.

# Actor input Schema

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

Instagram usernames to scrape (without the @). Each public profile is scraped independently. You can also paste full profile URLs.

## `username` (type: `string`):

Convenience field for scraping just one profile. If set, it is added to the Usernames list above.

## `includePosts` (type: `boolean`):

Include the most recent posts on the profile (caption, likes, comments, URL, timestamp). Posts come from the rich API surface; when only the SEO fallback succeeds, recent\_posts will be empty.

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

Residential proxy is required — Instagram rate-limits by IP. Leave as default.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "natgeo"
  ],
  "includePosts": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "usernames": [
        "nasa",
        "natgeo"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/instagram-profile-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",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/instagram-profile-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call themineworks/instagram-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=themineworks/instagram-profile-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/JZIQzIM7UXQQVxqps/builds/MyzxPvi9ichnYpc6Q/openapi.json
