# Instagram Profile Scraper (`calm_builder/instagram-profile-scraper`) Actor

Scrape Instagram profiles by username, handle, link or ID. Get bio, followers, following, website and bio links, business category, verified status, profile pictures, highlights, related accounts and latest posts. Built for lead generation, influencer research and competitor tracking.

- **URL**: https://apify.com/calm\_builder/instagram-profile-scraper.md
- **Developed by:** [Coder](https://apify.com/calm_builder) (community)
- **Stats:** 3 total users, 2 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/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

Collect public Instagram profile data by username, handle, profile link or ID: bio, follower and following counts, website and bio links, verified and business status, category, profile pictures, highlights, related accounts and the latest posts, in a clean, structured format.

Add a list of profiles, run it, and export the results as JSON, CSV or Excel, or pull them through the Apify API.

### What This Actor Does

- Collects Instagram profiles by username, @handle, profile link or numeric profile ID
- Supports many profiles in one run and returns each one as soon as it is ready
- Returns name, bio, follower and following counts, verified status and profile pictures in HD
- Includes the website and every bio link, including link-in-bio services
- Identifies **business and creator accounts** and their category
- Counts story highlights
- Optionally adds **related profiles**: the accounts Instagram suggests as similar
- Optionally adds the **latest posts** of each profile, with captions, media, likes, comments and hashtags
- Includes private profiles, with the details Instagram shows publicly

### Best For

- Lead generation: find business accounts, their category and website
- Influencer discovery and vetting by audience size and account type
- Competitor and brand research
- Finding look-alike accounts in a niche through related profiles
- Enriching CRM or spreadsheet lists of Instagram handles
- Building datasets for dashboards, BI or AI workflows

### Input

Add one or more Instagram profiles and choose the extras you need.

#### Main input fields

- `usernames`
  One profile per row. Accepts usernames (`natgeo`), handles (`@natgeo`), profile links (`https://www.instagram.com/natgeo/`) and numeric profile IDs (`787132`). Duplicates are returned once.
- `includeRelatedProfiles`
  Adds the accounts Instagram suggests as similar to each profile, in `relatedProfiles`.
- `includeLatestPosts`
  Adds up to 12 of each profile's most recent posts, in `latestPosts`. Private profiles have no public posts.

#### Example input

```json
{
  "usernames": ["natgeo", "@nike", "https://www.instagram.com/starbucks/"],
  "includeRelatedProfiles": true,
  "includeLatestPosts": false
}
```

### Output

Each dataset item is one Instagram profile.

#### Fields

| Field                               | Description                                                                                  |
| ----------------------------------- | -------------------------------------------------------------------------------------------- |
| `username`, `id`, `url`, `fbid`     | Profile handle, identifiers and link                                                         |
| `fullName`, `biography`, `pronouns` | Display name, bio text and pronouns                                                          |
| `followersCount`, `followsCount`    | Followers and following                                                                      |
| `verified`, `private`               | Verified badge and private account flag                                                      |
| `isBusinessAccount`, `accountType`  | Whether it is a professional account: `personal`, `business` or `creator`                    |
| `businessCategoryName`              | Category shown on the profile, such as `Brand` or `Artist`                                   |
| `externalUrl`, `externalUrlShimmed` | Main website link, direct and as Instagram's redirect link                                   |
| `externalUrls`                      | Every bio link with its title                                                                |
| `highlightReelCount`                | Number of story highlights                                                                   |
| `profilePicUrl`, `profilePicUrlHD`  | Profile picture, standard and high resolution                                                |
| `relatedProfiles`                   | Similar accounts with username, name, ID, verified and private flags (when enabled)          |
| `latestPosts`                       | Up to 12 recent posts with caption, media, likes, comments, hashtags and more (when enabled) |
| `inputUrl`                          | The entry from your input that produced this profile                                         |

#### Example output

```json
{
  "inputUrl": "https://www.instagram.com/starbucks/",
  "id": "1034466",
  "username": "starbucks",
  "url": "https://www.instagram.com/starbucks/",
  "fullName": "Starbucks",
  "biography": "you (pe)can do anything 💚",
  "externalUrl": "http://starbucks.app.link/featuredmenu",
  "externalUrlShimmed": "https://l.instagram.com/?u=http%3A%2F%2Fstarbucks.app.link%2Ffeaturedmenu&e=...",
  "externalUrls": [
    {
      "title": "Featured Menu",
      "url": "http://starbucks.app.link/featuredmenu",
      "lynx_url": "https://l.instagram.com/?u=...",
      "link_type": "external"
    }
  ],
  "followersCount": 17559115,
  "followsCount": 5308,
  "highlightReelCount": 0,
  "isBusinessAccount": true,
  "accountType": "business",
  "businessCategoryName": "Brand",
  "private": false,
  "verified": true,
  "pronouns": [],
  "profilePicUrl": "https://scontent.cdninstagram.com/v/t51.82787-19/...",
  "profilePicUrlHD": "https://scontent.cdninstagram.com/v/t51.82787-19/...",
  "fbid": "17841400313980016",
  "relatedProfiles": [
    {
      "id": "13936153",
      "username": "buildabear",
      "full_name": "Build-A-Bear Workshop",
      "is_private": false,
      "is_verified": true,
      "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.82787-19/..."
    }
  ],
  "latestPosts": []
}
```

Each item in `latestPosts` has the same fields as a post from Instagram Post Scraper, including `shortCode`, `url`, `type`, `caption`, `hashtags`, `mentions`, `likesCount`, `commentsCount`, `videoPlayCount`, `timestamp`, `displayUrl`, `images`, `videoUrl` and `childPosts`.

Picture and media links are provided by Instagram and expire after a while, so download any files you need soon after the run.

### How To Use

1. Add Instagram usernames, handles, profile links or IDs to `usernames`, one per row.
2. Leave `includeRelatedProfiles` on if you want similar accounts for each profile.
3. Turn on `includeLatestPosts` if you also need each profile's recent posts.
4. Run the actor and open the dataset, export it as JSON, CSV or Excel, or read it through the Apify API.

### Pricing

This actor uses pay-per-event pricing, so you only pay for results you receive. Profiles that cannot be collected are never charged, and related profiles are included at no extra cost.

Current prices for each Apify plan are shown on the actor's Pricing tab.

#### Free plan

On the Apify free plan, each run collects a limited number of profiles. Upgrade to a paid Apify plan to remove this limit.

### Best Practices

- Start with a few profiles to check the output quickly.
- Turn on latest posts only when you need them; profile-only runs are faster.
- Use related profiles to grow a list: run the accounts you find through the actor again.
- Use JSON export when you need nested data such as bio links, related profiles and posts.
- For more than 12 posts per profile, use Instagram Post Scraper.

### FAQ

#### Why is a profile missing from my results?

It was not found or is not publicly available: it may have been renamed, deleted, deactivated or restricted. The run log names every profile that could not be collected.

#### Can I scrape private profiles?

Yes, with the details Instagram shows publicly: name, bio, follower and following counts, profile picture, verified status and more. Their posts are not public, so `latestPosts` is empty for private profiles.

#### Why are related profiles empty for some accounts?

Instagram does not suggest similar accounts for every profile. Some large brands have none.

#### Does the actor return email addresses or phone numbers?

No. Instagram does not show contact details publicly on the web. Use `externalUrl` and `externalUrls` to reach the profile's website and link-in-bio pages.

#### Can I use a numeric profile ID?

Yes. Numeric IDs work like usernames. If the same profile is entered both ways, it is returned once.

#### How long does a run take?

Most profiles take a few seconds each, and many are collected in parallel. A few hundred profiles typically finish within a few minutes.

### Responsible Use

Use this actor only for publicly available data, and make sure your use complies with applicable laws (including data protection rules such as GDPR) and Instagram's terms. Avoid collecting personal data you don't need.

### Troubleshooting

- Open the profile in a logged-out browser window to confirm it exists and is public.
- Check the run log: it names any profile that was skipped and why.
- If a profile could not be collected right now, run it again a little later.
- Test with a few profiles before large runs.

# Actor input Schema

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

Enter one Instagram profile per row.

Supported formats:

- Username — `natgeo`
- Handle — `@natgeo`
- Profile link — `https://www.instagram.com/natgeo/`
- Numeric profile ID — `787132`

Private profiles are included with the details Instagram shows publicly. Duplicate entries are returned once.

## `includeRelatedProfiles` (type: `boolean`):

Add the accounts Instagram suggests as similar to each profile (up to about 50), in the `relatedProfiles` field. Useful for finding competitors, look-alike brands and more creators in the same niche.

This option is free.

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

Add up to 12 of each profile's most recent posts, with captions, media, likes, comments and hashtags, in the `latestPosts` field.

Latest posts are an optional add-on with their own price, charged only for profiles that return posts. Private profiles have no public posts. For more than 12 posts per profile, use Instagram Post Scraper.

## Actor input object example

```json
{
  "usernames": [
    "natgeo",
    "https://www.instagram.com/nike/"
  ],
  "includeRelatedProfiles": true,
  "includeLatestPosts": false
}
```

# 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": [
        "natgeo",
        "https://www.instagram.com/nike/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("calm_builder/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": [
        "natgeo",
        "https://www.instagram.com/nike/",
    ] }

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

```

## MCP server setup

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