# $1/1K Instagram Profile Scraper – Fast & Bulk (`figue/instagram-profile-scraper`) Actor

Bulk-scrape Instagram profiles fast — $1/1K. Extract 50+ fields from any public profile: bio, followers, business email, bio links & enriched recent posts.

- **URL**: https://apify.com/figue/instagram-profile-scraper.md
- **Developed by:** [Figue](https://apify.com/figue) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 1,275 total users, 333 monthly users, 99.2% runs succeeded, 15 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.10 / 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.

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 Scraper — Bulk, Fast & Affordable · 50+ Fields · $1.1/1K

### 📌 Overview

The fastest and cheapest way to scrape Instagram profiles **in bulk**. Extract **50+ data points** from any public Instagram profile — bio, followers, business info, contact details, and bio links — plus **optional** recent posts (just enable `includeRecentPosts`) with hashtags, mentions, carousel images, and direct video URLs.

Just paste usernames, @handles, or profile URLs → get structured JSON output in seconds.

**📦 Built for bulk** · **⚡ Fast — ~490/min** 🚀 · **💰 $1.10 per 1,000 profiles** · **🗂️ 50+ fields**

***

### 🚀 Why This Scraper?

✅ **Full API data** — Returns the complete Instagram response. Every field, nothing stripped out. New fields Instagram adds appear automatically.

✅ **Engagement metrics on every post** — Enable `includeRecentPosts` and each post comes with likes, comments, video views, and reshare status. Calculate engagement rates at scale without extra API calls. Detects when creators hide their metrics (`hide_like_and_view_counts`, `comments_disabled`).

✅ **Enriched posts (optional)** — Turn on `includeRecentPosts` to add recent posts with parsed hashtags, mentions, carousel images with individual dimensions, direct video URLs, alt text, tagged users, coauthor detection, and pinned post flags. Not just captions and likes. Off by default — profile-only runs are faster and cheaper.

✅ **Bio links included** — Full `bio_links` array with resolved URLs and Instagram tracking links (`lynx_url`). Most scrapers skip this.

✅ **Related profiles** — Instagram's own suggested accounts come back as a clean `relatedProfiles` array (username, name, verified, profile picture). Scrape one competitor → discover all similar accounts → scrape those too. Perfect for prospection loops.

✅ **Cross-platform IDs** — Get `fbid` and `eimu_id` to link Instagram profiles to their Meta/Facebook identity. Perfect for cross-platform enrichment.

✅ **Direct video URLs** — Get actual `.mp4` video URLs for Reels and video posts, not just thumbnails. Multiple quality levels available via DASH manifests.

✅ **Account trust signals** — Spot fake or new accounts with `is_joined_recently`, check Meta Verified status, and detect Threads presence — all in one call.

✅ **Fast — ~490/min** 🚀 — Pure HTTP requests, no browser.

✅ **Cheapest on the Store** — $1.10 per 1,000 profiles. No hidden fees. No browser overhead.

***

### 🔧 How It Works

1. **Add profiles** — Paste usernames, @handles, or Instagram URLs
2. **Click Start** — The scraper fetches all public data via Instagram's API
3. **Download results** — Export in JSON, CSV, or Excel

No login required. No cookies. No Instagram account needed.

***

### ⚙️ Options

| Input | Default | Description |
|---|---|---|
| `profiles` | — | Usernames, @handles, or profile URLs to scrape |
| `includeRecentPosts` | `false` | Add each profile's latest posts (up to 12). **Off by default** for the fastest, cheapest profile-only runs — set to `true` to include posts. |

***

### 📤 What You Get

#### 🧑‍💼 Profile Data

| Field | Description |
|---|---|
| `username` | Instagram handle |
| `full_name` | Display name |
| `biography` | Bio text |
| `biography_with_entities` | Bio with detected mentions and hashtags |
| `bio_links` | All bio links with resolved URLs and tracking links |
| `external_url` | Primary link in bio |
| `profile_pic_url_hd` | HD profile picture |
| `followersCount` | Number of followers |
| `followsCount` | Number of accounts followed |
| `postsCount` | Total posts |
| `is_verified` | Verified badge |
| `is_private` | Private account flag |
| `is_business_account` | Business account flag |
| `is_professional_account` | Creator/professional flag |
| `category_name` | Business or creator category |
| `business_email` | Contact email (business accounts) |
| `business_phone_number` | Contact phone (business accounts) |
| `business_address_json` | Street address, city, zip (business accounts) |
| `business_contact_method` | Preferred contact method |
| `pronouns` | Pronouns if set |
| `highlight_reel_count` | Number of story highlights |
| `has_clips` | Has Reels |
| `has_guides` | Has Guides |
| `has_channel` | Has broadcast channel |
| `relatedProfiles` | Similar accounts suggested by Instagram — array of `{ id, username, full_name, is_verified, is_private, profile_pic_url }` |
| `fbid` | Facebook/Meta profile ID |
| `eimu_id` | Cross-platform Meta entity ID |
| `has_onboarded_to_text_post_app` | Whether the user is on Threads |
| `is_joined_recently` | New account flag — useful for fraud detection |
| `hide_like_and_view_counts` | Whether the profile hides engagement metrics |
| `scrapedAt` | Exact timestamp of when the data was collected |
| ...and more | Every field from Instagram's API is included |

#### 🖼️ Recent Posts (up to 12) — *optional*

> **Off by default.** Set `includeRecentPosts: true` to add each profile's latest posts (up to 12). When enabled, every post includes:

| Field | Description |
|---|---|
| `shortcode` | Post shortcode |
| `url` | Direct link to the post |
| `caption` | Full caption text |
| `hashtags` | Parsed hashtags from caption |
| `mentions` | Parsed @mentions from caption |
| `likesCount` | Number of likes |
| `commentsCount` | Number of comments |
| `comments_disabled` | Whether comments are turned off |
| `like_and_view_counts_disabled` | Whether engagement counts are hidden on this post |
| `timestamp` | Post date and time |
| `type` | Image, Video, or Sidecar (carousel) |
| `display_url` | Image/video preview URL |
| `video_url` | Direct `.mp4` video URL (videos/Reels) |
| `video_view_count` | View count (videos only) |
| `has_audio` | Whether the video has audio |
| `dimensions` | Width and height |
| `accessibility_caption` | Alt text / AI-generated image description |
| `images` | All carousel image URLs |
| `childPosts` | Individual slides with dimensions, URLs, and types |
| `coauthor_producers` | Collab post partners |
| `pinned_for_users` | Whether the post is pinned |
| `location` | Tagged location data |
| `tagged_users` | Users tagged in the media |

***

### 📦 Example Output

```json
{
    "username": "natgeo",
    "full_name": "National Geographic",
    "biography": "Experience the world through the eyes of National Geographic photographers.",
    "bio_links": [
        {
            "url": "https://www.nationalgeographic.com/",
            "title": "nationalgeographic.com",
            "link_type": "external"
        }
    ],
    "followersCount": 284000000,
    "followsCount": 150,
    "postsCount": 32000,
    "is_verified": true,
    "is_business_account": true,
    "category_name": "Media/News Company",
    "business_email": "contact@natgeo.com",
    "business_phone_number": "+1 202-857-7000",
    "fbid": "17841400229977610",
    "eimu_id": "100719121328287",
    "has_onboarded_to_text_post_app": true,
    "hide_like_and_view_counts": false,
    "is_joined_recently": false,
    "relatedProfiles": [
        {
            "id": "13460080",
            "username": "natgeotravel",
            "full_name": "National Geographic Travel",
            "is_verified": true,
            "is_private": false,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/...jpg"
        }
    ],
    "scrapedAt": "2026-02-13T16:25:31.312Z",
    "latestPosts": [
        {
            "shortcode": "ABC123",
            "type": "Sidecar",
            "caption": "A breathtaking view of the Northern Lights #NorthernLights #Iceland",
            "hashtags": ["NorthernLights", "Iceland"],
            "mentions": [],
            "likesCount": 1500000,
            "commentsCount": 3200,
            "comments_disabled": false,
            "timestamp": "2026-02-12T18:00:00.000Z",
            "images": ["https://scontent.cdninstagram.com/v/...1.jpg", "..."],
            "video_url": "https://scontent.cdninstagram.com/o1/v/...video.mp4",
            "video_view_count": 520000,
            "coauthor_producers": [],
            "pinned_for_users": []
        }
    ]
}
```

> The output includes **all fields** from the Instagram API. The example above shows common fields — additional fields may appear depending on account type and API changes.
>
> ℹ️ The `latestPosts` array only appears when you enable `includeRecentPosts` (off by default). Profile-only runs omit it.

***

### ⚠️ Reduced fields on some profiles

Instagram's own profile API currently answers with a server-side schema error
(`ig_business_category_subvertical has been deleted`) for a large share of accounts — mostly business
and creator profiles. This is a bug on Instagram's side, not a rate limit: the same account fails
identically from every IP and country.

This scraper detects that error and automatically re-fetches the profile through two further
Instagram endpoints, which recovers the great majority of affected accounts. Every row tells you
which one served it, via `dataSource`:

| `dataSource` | Fields |
|---|---|
| `web_profile_info` | Complete — this is the normal path |
| `web_profile_info_alt` | Everything **except** `postsCount`, `latestPosts` and `business_category_name`. `followsCount` and `external_url` are recovered from a second source. Business address, contact method and `relatedProfiles` are preserved. |
| `graphql_profile` | Core profile only: name, bio, bio links, followers, following, verified, private, category, profile pictures, Meta IDs. No `postsCount`, no `latestPosts`, no business contact fields. |

Measured over a real 875-profile run: `followersCount` 100%, `followsCount` 97%, `bio_links` 94%,
`biography` 98%, `external_url` 88%. Only `postsCount` and `latestPosts` are materially degraded —
Instagram serves neither to a logged-out client on the recovery paths.

Unavailable fields are always `null` (or an empty array), **never `0`** — so "unknown" never
masquerades as "this account follows nobody" or "has no posts". Counts that *are* returned are exact:
verified field by field against the normal endpoint.

Rows that could not be recovered at all carry a machine-readable `errorCode` (`SCHEMA_400`,
`NODETYPE_400`, `RATE_LIMITED`, `NOT_FOUND`, `EMPTY_PROFILE`) plus the `httpStatus` Instagram
returned, so you can tell "retry this later" from "this will not work until Instagram fixes it".

***

### ⚡ Performance

| | This Scraper | Browser-based scrapers |
|---|---|---|
| Speed | **Fast — ~490/min** 🚀 | ~1 profile/sec |
| Memory | **1 GB** | 2+ GB |
| Cost per 1,000 | **$1.10** | $3–10 |

***

### 🧠 Use Cases

- **Lead generation** — Find business emails and phone numbers from Instagram profiles at scale
- **Influencer marketing** — Analyze engagement rates, spot hidden metrics, flag suspicious accounts, and compare content categories
- **Competitor analysis** — Track competitor profiles, posting frequency, and bio changes
- **Account discovery** — Use `relatedProfiles` to snowball from one target profile into hundreds of similar accounts
- **Social media dashboards** — Feed profile data into your analytics tools
- **Market research** — Map businesses by category, location, and audience size
- **CRM enrichment** — Match Instagram handles to contact details and cross-platform Meta IDs
- **Collab tracking** — Detect partnership posts via `coauthor_producers`
- **Fraud detection** — Flag recently created accounts, hidden engagement metrics, and disabled comments

***

### 📬 Support

Questions? Need help? Contact us at **hello@figue.io**

***

🚀 **The most complete Instagram profile data at the best price. Start scraping now!**

# Actor input Schema

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

List of Instagram usernames or profile URLs to scrape. Accepts any format: 'natgeo', '@nike', 'https://www.instagram.com/leomessi/' — mix and match freely.

## `includeRecentPosts` (type: `boolean`):

Whether to extract each profile's latest posts. Off by default (faster, profile data only); enable to also return recent posts.

## Actor input object example

```json
{
  "profiles": [
    "natgeo",
    "nike",
    "leomessi",
    "cristiano",
    "kyliejenner",
    "therock",
    "selenagomez",
    "kimkardashian",
    "beyonce",
    "taylorswift"
  ],
  "includeRecentPosts": false
}
```

# Actor output Schema

## `overview` (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": [
        "natgeo",
        "nike",
        "leomessi",
        "cristiano",
        "kyliejenner",
        "therock",
        "selenagomez",
        "kimkardashian",
        "beyonce",
        "taylorswift"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("figue/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 = { "profiles": [
        "natgeo",
        "nike",
        "leomessi",
        "cristiano",
        "kyliejenner",
        "therock",
        "selenagomez",
        "kimkardashian",
        "beyonce",
        "taylorswift",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("figue/instagram-profile-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 '{
  "profiles": [
    "natgeo",
    "nike",
    "leomessi",
    "cristiano",
    "kyliejenner",
    "therock",
    "selenagomez",
    "kimkardashian",
    "beyonce",
    "taylorswift"
  ]
}' |
apify call figue/instagram-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,figue/instagram-profile-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/98ivcMaUAxs5pu9tV/builds/QHIrjOgZaInsDxeCs/openapi.json
