# Instagram Profile Scraper - Followers, Bio, Posts & Reels (`socialscrapers/instagram-profile-scraper`) Actor

Instagram profile scraper for any username or profile URL: followers, following, posts count, bio, links, verified badge, account type, profile picture, plus each account's latest posts and reels with likes, comments, plays and hashtags. No login or cookies. API, JSON, CSV. $0.50 per 1,000 profiles.

- **URL**: https://apify.com/socialscrapers/instagram-profile-scraper.md
- **Developed by:** [Social Scrapers](https://apify.com/socialscrapers) (community)
- **Categories:** Social media, Lead generation, Marketing
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 96.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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/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 Scraper** gets public Instagram profile data for any list of usernames or profile URLs, with no Instagram account, login or cookies. For every profile you get the followers, following and posts counts, bio, bio links, verified badge, account type and profile picture, plus the profile's latest posts and reels with their likes, comments, plays, captions and hashtags, as JSON, CSV or Excel. It costs **$0.50 per 1,000 profiles**, plus $0.05 per 1,000 posts included.

### What does Instagram Profile Scraper do?

Instagram Profile Scraper reads what Instagram shows a visitor who opens a profile without logging in. You can:

- 👤 **Scrape Instagram profiles in bulk**: usernames (`nasa`, `@nasa`) or profile URLs, as many as you like; messy lists (`NASA — @nasa`) are read too.
- 📊 **Get audience data**: followers, following, exact posts count, story highlights, verified badge and account type (business, creator or personal).
- 🔗 **Collect bios and links**: bio text, every link in the bio with its title, full name and profile picture in two sizes.
- 🖼️ **Include the latest posts and reels**: as many as you want per profile, with no upper limit, pinned posts first as on the profile, each with likes, comments, reel plays, caption, hashtags, mentions, date and media URLs.
- 🗓️ **Filter posts by date**: keep only posts newer than a date or an age such as `30 days`.
- 💸 **Pay only for results**: private profiles and usernames that don't exist cost nothing.

Everything the Apify platform gives you comes with it: the Apify API, scheduled runs, webhooks, integrations with Make, Zapier, n8n and Google Sheets, and datasets you can download in any format.

### What data can you extract from Instagram profiles?

#### Profile fields

| Field | Description |
|---|---|
| `inputUrl` | The username or URL as given in the input. |
| `id` | Numeric account id. Stays the same when the username changes. |
| `username` | Username, without the @. |
| `url` | Profile URL. |
| `fullName` | Display name. |
| `biography` | Bio text. |
| `externalUrl` | The first link in the bio. |
| `externalUrls` | Every link in the bio, with its title. |
| `followersCount` | Followers. |
| `followsCount` | Accounts the profile follows. |
| `postsCount` | Posts on the profile. |
| `highlightReelCount` | Story highlights on the profile. |
| `hasReels` | `true` when the profile has posted reels. |
| `verified` | `true` when the profile shows the verified badge. |
| `isBusinessAccount` | `true` for a business account. |
| `accountType` | `business`, `creator` or `personal`. |
| `profilePicUrl` | Profile picture, 150 × 150. |
| `profilePicUrlHD` | Profile picture, full size. |
| `fbid` | The account's Meta-wide id. |
| `pronouns` | Pronouns shown on the profile. |
| `latestPosts` | The most recent posts and reels, pinned posts first. |
| `scrapedAt` | When the profile was read, ISO 8601. |

#### Post fields (in `latestPosts`)

| Field | Description |
|---|---|
| `id` | Numeric media id. |
| `type` | `Image`, `Video` (reels included) or `Sidecar` (a carousel). |
| `productType` | `feed`, `clips` (a reel), `carousel_container` or `igtv`. |
| `shortCode` | The code in the post URL. |
| `url` | Post URL. |
| `caption` | Caption text. |
| `hashtags` | Hashtags in the caption, without #. |
| `mentions` | Accounts mentioned in the caption, without @. |
| `likesCount` | Likes. |
| `commentsCount` | Comments. |
| `videoPlayCount` | Plays of a reel or video. |
| `videoDuration` | Video length in seconds. |
| `timestamp` | When it was posted, ISO 8601 in UTC. |
| `displayUrl` | Main image (a video's cover, a carousel's first slide). |
| `images` | Image URLs of every carousel slide. |
| `videoUrl` | Video file URL. |
| `dimensionsHeight`, `dimensionsWidth` | Size in pixels. |
| `alt` | Instagram's automatic image description. |
| `childPosts` | The slides of a carousel, each with its own image or video URL, size and tags. |
| `ownerId`, `ownerUsername`, `ownerFullName` | The account that posted it. |
| `taggedUsers` | Accounts tagged in the post. |
| `coauthorProducers` | Collaborators shown as co-authors. |
| `isPaidPartnership` | `true` for a paid partnership. |
| `isCommentsDisabled` | `true` when comments are turned off. |
| `isPinned` | `true` when the post is pinned to the top of the profile. |

Every field is always present. A field is `null` (or an empty list) when the profile or post leaves it empty or Instagram does not show it. The **Posts** view of the dataset shows one row per post.

### How to scrape Instagram profiles

1. Open Instagram Profile Scraper and click **Try for free**.
2. Add usernames or profile URLs to **Usernames or profile URLs**, one per line. Share links from the app (`instagram.com/share/…`) and post or reel links work too: the scraper reads the profile they belong to.
3. Choose how many **Recent posts per profile** to include, or `0` for profile details only.
4. Optionally set **Only posts newer than** to keep recent posts only.
5. Click **Start**. Profiles appear in the dataset as they are read.
6. Download the results as JSON, CSV, Excel or HTML, or read them with the Apify API.

### How much does it cost to scrape Instagram profiles?

You pay per profile saved, **$0.50 per 1,000 profiles**, plus **$0.05 per 1,000 posts** included in `latestPosts`. Platform usage and proxies are included. On Apify's Silver plan prices are 10% lower, and on Gold 20% lower.

- 1,000 profiles with their 12 latest posts (the default) → $0.50 + $0.60 = **$1.10**
- 1,000 profiles, details only (Recent posts per profile set to 0) → **$0.50**
- 100 profiles with their 500 latest posts each → $0.05 + $2.50 = **$2.55**

Private profiles and usernames that don't exist are free. To cap the cost of a run, set **Maximum cost per run** in the run options: the scraper saves profiles until the next one would go over it, then stops cleanly. Apify's free plan includes monthly platform credit, enough to try the scraper on thousands of profiles.

### Input example

```json
{
  "usernames": ["nasa", "@natgeo", "https://www.instagram.com/nike/"],
  "maxPostsPerProfile": 12,
  "onlyPostsNewerThan": "30 days"
}
```

| Field | Type | Description |
|---|---|---|
| `usernames` | array of strings | Usernames or profile URLs. Accepts `nasa`, `@nasa` and `https://www.instagram.com/nasa/`, and picks the handle out of messy entries such as `NASA — @nasa`, `@ nasa`, `nasa (NASA)` or links with `?igsh=…`. An entry with no username in it is skipped with a warning. Duplicates are read once. |
| `maxPostsPerProfile` | integer | Recent posts to include per profile. No upper limit; `0` for profile details only. Default: 12. |
| `onlyPostsNewerThan` | string | Leave out older posts: a date (`2026-01-31`, `2026/1/31`, `31/01/2026`, `Jan 31 2026`), a date-time (`2026-01-31T18:00:00Z`) or an age (`7 days`, `2w`, `3 months`, `yesterday`). Optional. |
| `proxyConfiguration` | object | The scraper picks Apify Proxy's tier itself: datacenter first, residential only when Instagram refuses a request. Your own proxy URLs are used as given. |

### Output example

One dataset item per profile, with its posts in `latestPosts` (shortened to one post; image and video URLs abbreviated):

```json
{
  "inputUrl": "nasa",
  "id": "528817151",
  "username": "nasa",
  "url": "https://www.instagram.com/nasa/",
  "fullName": "NASA",
  "biography": "Making the seemingly impossible, possible. ✨",
  "externalUrl": "https://www.nasa.gov",
  "externalUrls": [
    { "title": "NASA.gov Homepage", "url": "https://www.nasa.gov" },
    { "title": "Become a NASA Astronaut", "url": "https://www.nasa.gov/news-release/nasa-seeks-next-generation-of-explorers-to-join-astronaut-corps/" }
  ],
  "followersCount": 104394096,
  "followsCount": 90,
  "postsCount": 5000,
  "highlightReelCount": 6,
  "hasReels": true,
  "verified": true,
  "isBusinessAccount": true,
  "accountType": "business",
  "profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/29090066_...s150x150...n.jpg",
  "profilePicUrlHD": "https://scontent.cdninstagram.com/v/t51.2885-19/29090066_...n.jpg",
  "fbid": "17841401474538262",
  "pronouns": [],
  "latestPosts": [
    {
      "id": "4025327901360909266",
      "type": "Video",
      "productType": "clips",
      "shortCode": "Dfc1mYxFevS",
      "url": "https://www.instagram.com/p/Dfc1mYxFevS/",
      "caption": "Apply to become an astronaut! ... #NASA #Astronaut #JobSearch",
      "hashtags": ["NASA", "Astronaut", "JobSearch"],
      "mentions": [],
      "likesCount": 43443,
      "commentsCount": 542,
      "videoPlayCount": 1673629,
      "videoDuration": 63.467,
      "timestamp": "2026-11-07T18:35:41.000Z",
      "displayUrl": "https://instagram.fna.fbcdn.net/v/t51.82787-15/892262107_...n.jpg",
      "images": [],
      "videoUrl": "https://instagram.fna.fbcdn.net/o1/v/t2/f2/m86/AQOaFZ...mp4",
      "dimensionsHeight": 1920,
      "dimensionsWidth": 1080,
      "alt": "Video by NASA on November 07, 2026. May be an image of poster and text.",
      "childPosts": [],
      "ownerId": "528817151",
      "ownerUsername": "nasa",
      "ownerFullName": "NASA",
      "taggedUsers": [],
      "coauthorProducers": [],
      "isPaidPartnership": false,
      "isCommentsDisabled": false,
      "isPinned": true
    }
  ],
  "scrapedAt": "2026-11-08T02:19:19.152Z"
}
```

### Use cases

- **Influencer research**: compare reach, posting frequency and engagement across a list of creators.
- **Brand and competitor monitoring**: track follower growth and the performance of recent posts and reels.
- **Lead enrichment**: add bios, links and audience size to a list of Instagram usernames.
- **Content analysis**: collect recent captions, hashtags and mentions of a set of accounts.
- **Academic and market research**: build datasets of public profile and post attributes.

### Use it via API, Python, JavaScript and integrations

Run Instagram Profile Scraper from your own code with the Apify API or the Apify clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("socialscrapers/instagram-profile-scraper").call(
    run_input={"usernames": ["nasa", "natgeo"], "maxPostsPerProfile": 12}
)
for profile in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(profile["username"], profile["followersCount"], len(profile["latestPosts"]))
```

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('socialscrapers/instagram-profile-scraper').call({ usernames: ['nasa'], maxPostsPerProfile: 12 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

You can also schedule runs (for example every morning to track follower counts), get a webhook when a run finishes, send results to Google Sheets, Slack or a database with [Apify integrations](https://docs.apify.com/integrations), connect it to Make, Zapier or n8n, or let AI agents run it through the [Apify MCP server](https://docs.apify.com/mcp).

### Limits

- **Public profiles only.** Instagram Profile Scraper never logs in, so it sees what a logged-out visitor sees. Private profiles are skipped and cost nothing.
- **Shown to logged-in users only, so not included:** the business category and contact details, follower and following lists, and stories. The account type (business, creator or personal) is included.
- **Posts per profile:** no upper limit. A profile's posts travel inside its one dataset item, which Apify caps at about 9 MB, so a single profile holds about 2,000 to 3,000 posts (fewer when they are carousels). The run log says when a profile reached it.
- **Comments and post locations** are not part of the profile output: use [Instagram Post Scraper](https://apify.com/socialscrapers/instagram-post-scraper) for the comments and location of specific posts.
- Age-restricted profiles (for example, some alcohol brands) are not shown to logged-out visitors and are reported as not found.
- **Share links and post links.** A share link from the app (`https://www.instagram.com/share/…`) is followed to the post, reel or profile it opens, and a post or reel link stands for its owner's profile. Following a link is never charged.
- **A run with 0 results still succeeds when your input was fine.** When every profile is private, does not exist or is hidden from logged-out visitors, the run ends as Succeeded with a status message naming each entry and why, and nothing is charged. A run fails only when no entry holds a username or link at all, or when Instagram refuses every one of 3 or more profiles.

### FAQ

**Is it legal to scrape Instagram profiles?**
Instagram Profile Scraper collects only public data that anyone can see without logging in. You are responsible for how you use it: personal data is protected by laws such as the GDPR, so have a legitimate reason to collect it and follow Instagram's terms and the laws that apply to you.

**Do I need an Instagram account or cookies?**
No. You only need a list of usernames or profile URLs. The scraper never logs in, so no account of yours is ever at risk.

**How many posts can I get per profile?**
As many as you ask for: there is no upper limit. Pinned posts come first, as on the profile, and are marked with `isPinned`. A single profile item holds up to about 2,000 to 3,000 posts (Apify's 9 MB item size).

**Why did I get fewer posts than I asked for?**
The profile has fewer posts, the date filter left the rest out, the profile reached the item size, or the run reached its maximum cost. The run log says which, for each profile.

**Can I get only new posts?**
Yes. Set **Only posts newer than** to a date or an age such as `7 days`, and schedule the run to repeat.

**What happens with private profiles and usernames that don't exist?**
They are skipped, logged and not charged. The `SUMMARY` record in the run's key-value store lists them under `private` and `notFound`. A run in which every profile was private or missing still ends as Succeeded, with a status message that names each one.

**Can I paste share links or post links?**
Yes. Links such as `https://www.instagram.com/share/BAKjZPdWBo` are followed to what they open, and a post or reel link (`/p/…`, `/reel/…`) is read as its owner's profile. Following them costs nothing.

**Can I get one row per post?**
Yes: open the **Posts** view of the dataset, or export with the dataset's `unwind=latestPosts` option.

### Other scrapers by Social Scrapers

| Scraper | What it does |
|---|---|
| [Instagram Post Scraper](https://apify.com/socialscrapers/instagram-post-scraper) | Posts and reels by URL, with comments |
| [Facebook Groups Scraper](https://apify.com/socialscrapers/facebook-groups-scraper) | Posts from public Facebook groups |
| [Facebook Profile Scraper](https://apify.com/socialscrapers/facebook-profile-scraper) | Public details of Facebook profiles and Pages |
| [Facebook Profile Posts Scraper](https://apify.com/socialscrapers/facebook-profile-posts-scraper) | Recent posts of Facebook profiles and Pages |
| [Facebook Ads Library Scraper](https://apify.com/socialscrapers/facebook-ads-library-scraper) | Ads from Meta's Ad Library |
| [Threads Scraper](https://apify.com/socialscrapers/threads-scraper) | Threads profiles, posts, replies and search |
| [X (Twitter) Profile Scraper](https://apify.com/socialscrapers/x-profile-scraper) | X profiles: bio, followers and counts |
| [YouTube Scraper](https://apify.com/socialscrapers/youtube-scraper) | YouTube videos, channels, search and comments |
| [YouTube Transcript Scraper](https://apify.com/socialscrapers/youtube-transcript-scraper) | Transcripts of YouTube videos |
| [Reddit Scraper](https://apify.com/socialscrapers/reddit-scraper) | Reddit posts, comments, users and search |
| [Quora Scraper](https://apify.com/socialscrapers/quora-scraper) | Quora questions, answers and profiles |
| [LinkedIn Jobs Scraper](https://apify.com/socialscrapers/linkedin-jobs-scraper) | LinkedIn job listings |

# Actor input Schema

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

Profiles to scrape: usernames (<code>nasa</code> or <code>@nasa</code>) or profile URLs (<code>https://www.instagram.com/nasa/</code>), one per line. Messy entries are fine: the handle is picked out of text such as <code>NASA — @nasa</code>, <code>@ nasa</code> or <code>nasa (NASA)</code>, and out of links with extra parameters such as <code>?igsh=…</code>. Share links from the app (<code>instagram.com/share/…</code>) and post or reel links work too: the profile they belong to is read. An entry with no username or link in it is skipped with a warning. Duplicates are read once. Private profiles and usernames that do not exist are skipped and never charged.

## `maxPostsPerProfile` (type: `integer`):

How many of each profile's most recent posts to include in its <code>latestPosts</code> list (pinned posts come first, as on the profile). No upper limit: enter a large number such as <code>5000</code> for every post Instagram shows, up to what one dataset item can hold (about 3,000 posts). Set <code>0</code> for profile details only.

## `onlyPostsNewerThan` (type: `string`):

Leave out posts older than this. Pick a date or an age, or type one: a date (<code>2026-01-31</code>, <code>31/01/2026</code>, <code>Jan 31 2026</code>; a UTC day), an ISO date-time through the API (<code>2026-01-31T18:00:00Z</code>), or an age such as <code>7 days</code>, <code>2w</code>, <code>3 months</code> or <code>yesterday</code>. Leave empty for no limit.

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

The scraper picks Apify Proxy's tier itself: datacenter first, residential only when Instagram refuses a request (a country you choose applies to the residential retries). Your own proxy URLs are used exactly as given.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "natgeo",
    "https://www.instagram.com/nike/"
  ],
  "maxPostsPerProfile": 12,
  "proxyConfiguration": {
    "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 = {
    "usernames": [
        "nasa",
        "natgeo",
        "https://www.instagram.com/nike/"
    ],
    "maxPostsPerProfile": 12,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialscrapers/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",
        "https://www.instagram.com/nike/",
    ],
    "maxPostsPerProfile": 12,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("socialscrapers/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 '{
  "usernames": [
    "nasa",
    "natgeo",
    "https://www.instagram.com/nike/"
  ],
  "maxPostsPerProfile": 12,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call socialscrapers/instagram-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialscrapers/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/WK1ii8knN2Mkbq6y4/builds/U8Wb855CHmDSKCWiq/openapi.json
