# Instagram Profile Scraper - Followers, Bio & Engagement (`topapi/instagram-profile-scraper`) Actor

Scrape public Instagram profiles in bulk by username, URL or user id: followers, following and posts count, bio and bio links, category, business flags, related profiles, emails and phones in the bio. Optional latest posts with engagement rate. Monitor mode tracks follower and post deltas. No login.

- **URL**: https://apify.com/topapi/instagram-profile-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

### What does Instagram Profile Scraper do?

**Instagram Profile Scraper** looks up public Instagram profiles in bulk and returns one structured row per account: exact follower, following and post counts, full name, bio, every link in bio with its label, category, business or creator status, verified and private flags, related accounts, and the emails and phone numbers an account writes in its bio. Built for influencer marketers, agencies, lead-generation teams and analysts who need Instagram account data for a list of handles without a login, cookies or an API key.

Instagram Profile API - Instagram Followers Count Scraper - Instagram Bio Scraper - Instagram Account Lookup

<a href="https://console.apify.com/actors/4PfitAVORLMT5JJfN"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/instagram-profile-scraper-source.png" alt="Instagram profile header that Instagram Profile Scraper turns into one row" style="width:70%"></a>

- **Bulk lookup:** paste usernames, @handles, profile URLs or numeric user ids, mixed; duplicates are read once and every row says which input line it answers.
- **Exact counts:** `followersCount`, `followsCount` and `postsCount` as plain numbers, not "104M", plus IGTV and highlight counts.
- **Who the account is:** business, creator or personal (`accountType`), category, verified badge, private flag, related accounts Instagram suggests next to it.
- **Contact signals:** website and every bio link with its label, emails and phone numbers written in the bio or in WhatsApp / `tel:` / `mailto:` links, business address when published.
- **One better:** optional latest posts with `engagementRate`, average likes, comments and video views and `postsPerWeek`; a tracking mode that adds follower, following and post deltas since the last run.
- **Filters before delivery:** follower range, account type, verified only, public only, must have a website / email / phone, bio keywords, posted within N days.
- **No login, cookies or Instagram API key:** the actor reads only what Instagram serves a signed-out visitor.
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets, Slack, the Apify API and MCP.

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

<table>
<tr>
<td>🆔 User id, username, profile URL</td>
<td>👤 Full name and bio</td>
<td>👥 Followers (`followersCount`)</td>
</tr>
<tr>
<td>➡️ Following (`followsCount`)</td>
<td>🖼️ Posts count (`postsCount`)</td>
<td>🎬 IGTV and highlight counts</td>
</tr>
<tr>
<td>🔗 Link in bio + every bio link with its label (`externalUrls`)</td>
<td>📧 Emails in the bio (`emails`)</td>
<td>📞 Phones in the bio or WhatsApp link (`phones`)</td>
</tr>
<tr>
<td>🏢 Business / creator / personal (`accountType`)</td>
<td>🏷️ Category and category code</td>
<td>📍 Business address, contact method</td>
</tr>
<tr>
<td>✅ Verified, 🔒 private flags</td>
<td>🧑‍🤝‍🧑 Related accounts (`relatedProfiles`)</td>
<td>📷 Profile picture, standard and HD</td>
</tr>
<tr>
<td>📅 Date of the newest post (`lastPostAt`)</td>
<td>📈 Add-on: latest posts + engagement rate</td>
<td>🔁 Tracking: follower and post deltas, what changed</td>
</tr>
</table>

On the first live run (20 input lines: brands, restaurants, creators, a private account, a handle that does not exist and a numeric id) all 18 delivered profiles had followers, following and posts counts, 94% a bio, 83% a website, 83% a category, 56% related accounts, 22% an email in the bio and 6% a phone; the not-found handle came back as a free status row and the numeric id was recognised as a duplicate of a username already in the list.

### How to scrape Instagram profiles with Instagram Profile Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - $5 of monthly credit, no card needed.
2. Open [Instagram Profile Scraper](https://apify.com/topapi/instagram-profile-scraper) and click **Try for free**.
3. Paste your handles into **Profiles** (one per line) or upload a file under **Profile URLs from a file**, and set **Max profiles**.
4. Optionally set filters, turn on **Latest posts + engagement rate**, or turn on **Track changes between runs** for a watchlist.
5. Click **Start**. Rows stream into the dataset; the 20-line test list finished in 33 seconds.
6. Open the **Storage** tab and **Export** as JSON, CSV or Excel, or let a schedule run it for you.

### ⬇️ Instagram Profile Scraper input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `usernames` | List | **Required** (or `startUrls`). Usernames, @handles, profile URLs or user ids, e.g. `nasa`, `@natgeo`, `https://www.instagram.com/nike/`, `528817151`. With nothing given, the actor runs the sample profile `nasa`. |
| `startUrls` | File / URL list | Profile URLs from an uploaded file or a remote list, merged with `usernames`. |
| **✂️ Refine results** | | |
| `minFollowers` / `maxFollowers` | Integer | Follower range, e.g. 10,000-100,000 for micro-influencers. Default: no limit. |
| `accountType` | Select | Any, professional (business or creator), business, creator or personal. Default: any. |
| `verifiedOnly` | Boolean | Only accounts with the verified badge. Default: `false` |
| `excludePrivate` | Boolean | Leave out private accounts. Default: `false` |
| `requireContact` | Select | Must have a website, an email, a phone, an email or phone, or any of the three. Default: no requirement. |
| `bioKeywords` | Text | Keep accounts whose bio, name, category or bio links contain one of these words, e.g. `bakery, cafe`. |
| `activeWithinDays` | Integer | Keep accounts whose newest post is at most N days old. Default: `0` (off). |
| **➕ Extra data** | | |
| `includeLatestPosts` | Boolean | Adds up to 12 latest posts plus engagement metrics, charged as **latest-posts** per profile that gets posts. Default: `false` |
| **🔁 Monitoring** | | |
| `monitorMode` | Boolean | Adds `changeType`, `followersDelta`, `followsDelta`, `postsDelta`, `followersGrowthPct` and `changedFields` against the last run. Pair with a daily schedule. |
| `monitorStoreName` | Text | Named key-value store holding the snapshots. Default: `instagram-profiles-monitor` |
| `monitorOnlyChanges` | Boolean | With tracking on, deliver only new or changed profiles. Default: `false` |
| **📦 Output** | | |
| `maxResults` | Integer | Cap on delivered profiles; `0` = the whole list. Default: `0` (the form suggests 100). |
| `includeUnavailable` | Boolean | Add a free status row for each input that returned no profile (not found, unreadable, invalid). |
| `compact` | Boolean | Core fields only, sized for AI agents and MCP clients. |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | Proxy | Default: Apify proxy (datacenter first, residential only as a fallback). |
| `maxConcurrency` | Integer | Profiles read at once, 1-10. Default: `4` |

#### Input JSON

```json
{
  "usernames": ["nasa", "@natgeo", "https://www.instagram.com/nike/", "528817151"],
  "minFollowers": 10000,
  "accountType": "professional",
  "includeLatestPosts": true,
  "maxResults": 100
}
```

#### Paste usernames, profile URLs or user ids in the same list

Every form of a handle is read once. **Do:** `nasa`, `@nasa`, `https://www.instagram.com/nasa/`, `instagram.com/nasa/reels/`. **Don't:** a post or reel link such as `https://www.instagram.com/p/DNQuxufAih9/` - it is not a profile, so it is skipped and named in the log (and as a status row with `includeUnavailable`).

#### Use the filters to keep only the profiles you can work with

Filters run on each profile after it is read and before it is written: a list of 1,000 handles with `minFollowers: 10000` and `requireContact: "email"` returns only the accounts that pass. The run summary (`RUN_SUMMARY` in the key-value store) counts how many each filter removed.

#### Turn on tracking for a daily watchlist

With `monitorMode` on, the first run stores a snapshot of every profile and marks it `NEW`; each later run of the same list adds the change since then (`followersDelta`, `postsDelta`, `changedFields` such as `biography`, `links`, `verified`). Give each watchlist its own `monitorStoreName`. Add `monitorOnlyChanges` when you only want the accounts that moved: new posts, an edited bio or links, a new category, or followers up or down by 1% or more since the profile was last delivered.

### ⬆️ Instagram Profile Scraper output

Every profile becomes one dataset item. Here is the table view of the first live run (latest-posts add-on on):

<a href="https://console.apify.com/actors/4PfitAVORLMT5JJfN"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/instagram-profile-scraper-output.png" alt="Instagram Profile Scraper output: followers, posts, category, website and engagement per profile" style="width:70%"></a>

And one row as JSON (shortened; `relatedProfiles`, `externalUrls` and `latestPosts` are arrays of objects):

```json
{
  "id": "528817151",
  "username": "nasa",
  "fullName": "NASA",
  "biography": "Making the seemingly impossible, possible. ✨",
  "externalUrl": "https://www.nasa.gov/",
  "followersCount": 104294180,
  "followsCount": 90,
  "postsCount": 4945,
  "igtvVideoCount": 171,
  "highlightReelCount": 6,
  "verified": true,
  "private": false,
  "accountType": "business",
  "businessCategoryName": "Government Agencies",
  "categoryEnum": "GOVERNMENT_ORGANIZATION",
  "businessContactMethod": "CALL",
  "relatedProfiles": [{ "username": "sciencechannel", "full_name": "Science Channel", "is_verified": true }],
  "lastPostAt": "2026-10-04T16:09:22.000Z",
  "engagementRate": 0.192,
  "avgLikes": 198829,
  "avgComments": 1006,
  "postsPerWeek": 11.26,
  "status": "ok"
}
```

#### Instagram profile fields

Fill measured on the 18 profiles of the first live run.

| Field | Type | What it is | Fill |
|---|---|---|---|
| `id`, `username`, `url`, `fullName` | string | Who the account is | 100%, name 94% |
| `followersCount`, `followsCount`, `postsCount` | number | Exact counts | 100% |
| `biography` | string | Bio text | 94% |
| `externalUrl`, `externalUrls` | string, array | Link in bio and every bio link with its label | 83% |
| `businessCategoryName` | string | Category shown under the name | 83% |
| `accountType`, `isBusinessAccount`, `isProfessionalAccount` | string, boolean | business / creator / personal | 100% |
| `verified`, `private` | boolean | Badges | 100% |
| `highlightReelCount` | number | Story highlights | 94% |
| `igtvVideoCount`, `categoryEnum`, `businessContactMethod` | number, string | From Instagram's app answer (see Limits) | 67%, 44%, 44% |
| `relatedProfiles` | array | Accounts Instagram suggests next to this one | 56% |
| `emails`, `phones` | array | Written in the bio or bio links | 22%, 6% |
| `businessAddress` | object | Street, city, zip, coordinates when published | 11% |
| `profilePicUrl`, `profilePicUrlHD`, `fbid` | string | Avatar and Meta account id | 100% |
| `lastPostAt` | ISO date | Newest visible post | 94% |
| `latestPosts`, `engagementRate`, `avgLikes`, `avgComments`, `postsPerWeek` | add-on | Latest posts and engagement | 94% |
| `changeType`, `followersDelta`, `postsDelta`, `changedFields` | tracking | Change since the last run | every row in tracking mode |
| `status`, `source`, `inputUrl`, `scrapedAt` | string | ok / private; which Instagram surface served it; the input line | 100% |

### How can I use Instagram profile data?

- 🎯 **Influencer marketers** - size a creator list by followers, engagement rate and posting frequency before outreach.
- 📇 **Lead-generation teams** - turn a list of business handles into rows with website, category, address and any email or phone they publish.
- 🏷️ **Agencies** - check a client's competitors weekly: follower growth, new posts, bio and link changes.
- 🧑‍🤝‍🧑 **Researchers** - expand a seed list through `relatedProfiles` and classify accounts by type and category.
- 🤖 **AI and data teams** - feed `compact` rows to an LLM or a warehouse; counts are numbers, never "1.2M".
- 📈 **Brand monitoring** - schedule tracking mode daily and alert on accounts whose `changedFields` is not empty.

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

Instagram Profile Scraper is pay-per-result: **$0.95 per 1,000 profiles**, no start fee. One result is one profile written to the dataset. The optional latest posts + engagement block is **$1.00 per 1,000 profiles** that get it.

| Profiles | Profiles only | With latest posts + engagement |
|---:|---:|---:|
| 10 | $0.0095 | $0.0195 |
| 100 | $0.095 | $0.195 |
| 1,000 | $0.95 | $1.95 |
| 10,000 | $9.50 | $19.50 |

Status rows for unavailable profiles (`includeUnavailable`) are free. Apify platform usage is included in these prices. The actor runs on 256 MB with no browser: 18 profiles took 33 seconds and peaked at 59 MB; 100 profiles took 157 seconds.

### Integrations, API, scheduling & MCP

- **Schedules:** run the same list hourly, daily or weekly from the **Schedules** tab; with `monitorMode` each run carries the change since the previous one.
- **Webhooks:** call a URL when a run finishes and push the rows to your CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable and Slack through [Apify integrations](https://docs.apify.com/integrations).
- **API:** start runs and read datasets from Node.js or Python with `apify-client`; code is on the [API tab](https://apify.com/topapi/instagram-profile-scraper/api/python).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/instagram-profile-scraper/api/mcp) and ask for profiles in plain language; `compact` keeps rows small.

### More TopApi scrapers

<table>
<tr>
<td>📸 <a href="https://apify.com/topapi/instagram-scraper">Instagram Scraper</a> - posts, reels and carousels by profile, hashtag or URL</td>
<td>𝕏 <a href="https://apify.com/topapi/x-profile-scraper">X Profile Scraper</a> - X (Twitter) accounts with followers and bio</td>
<td>🎵 <a href="https://apify.com/topapi/tiktok-scraper">TikTok Scraper</a> - videos by profile, hashtag or URL</td>
</tr>
<tr>
<td>🎬 <a href="https://apify.com/topapi/tiktok-video-scraper">TikTok Video Scraper</a> - single TikTok videos by URL</td>
<td>▶️ <a href="https://apify.com/topapi/youtube-shorts-scraper">YouTube Shorts Scraper</a> - Shorts with views and channel data</td>
<td>🔎 <a href="https://apify.com/topapi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a> - public posts by keyword</td>
</tr>
<tr>
<td>⭐ <a href="https://apify.com/topapi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a> - reviews with owner replies</td>
<td>📊 <a href="https://apify.com/topapi/similarweb-scraper">Similarweb Scraper</a> - website traffic and rank</td>
<td>🧭 <a href="https://apify.com/topapi">All TopApi actors</a> - social, reviews and lead-gen scrapers built for scheduled runs</td>
</tr>
</table>

### Instagram profile limits & empty runs

- **Results per run:** no Instagram-side cap on how many profiles one run looks up; `maxResults` caps what you pay for. About one profile per second at the default 4 at a time.
- **Two Instagram surfaces:** most profiles come from the answer Instagram's own apps use (`source: "mobile"`). For some business accounts Instagram returns an error on that surface, and those are read from the web profile and its embed page instead (`source: "web"`): same counts, bio, links, category and related accounts, but no IGTV count, category code or contact method, and the add-on carries the 6 latest posts instead of 12. On the first live run 6 of 18 profiles came from the web surface; on a 40-account list of small food brands and restaurants it was 29 of 40.
- **Business email and phone:** Instagram withholds the business contact block from signed-out visitors (null on every one of 44 profiles checked), so `emails` and `phones` come from what the account writes in its bio and bio links.
- **Private accounts:** the public header only (counts, name, bio), `status: "private"`, no posts.
- **Empty dataset:** every handle was not found, invalid, filtered out, or (with `monitorOnlyChanges`) unchanged - the status message and `RUN_SUMMARY` say which.

### FAQ

#### How much does Instagram Profile Scraper cost?

$0.95 per 1,000 profiles delivered, plus $1.00 per 1,000 for the optional latest posts + engagement block. No start fee, and status rows for unavailable handles are free.

#### How many Instagram profiles can Instagram Profile Scraper look up in one run?

As many as you paste; the 100-profile test took 157 seconds at the default settings. Raise **Parallel profiles** to 6-8 for lists of thousands, and split very large lists into several runs if you want results sooner.

#### Can I track Instagram follower growth with Instagram Profile Scraper?

Yes. Turn on **Track changes between runs**, save the input as a task and schedule it daily. Each row then carries `followersDelta`, `followsDelta`, `postsDelta`, `followersGrowthPct` and `changedFields` against the previous run of the same list.

#### Does Instagram Profile Scraper return the posts count?

Yes, `postsCount` is an exact number for every public profile, on both Instagram surfaces the actor reads. The latest posts themselves are the optional add-on.

#### Can I get emails and phone numbers from Instagram profiles?

The actor returns emails and phone numbers that an account writes in its bio or puts in WhatsApp, `tel:` or `mailto:` bio links. Instagram does not show the business contact button's email or phone to signed-out visitors, so those are not available.

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

No. Instagram Profile Scraper reads only what Instagram serves a signed-out visitor; you pass usernames, URLs or ids and nothing else.

#### Can I use Instagram Profile Scraper with the Apify API?

Yes. Start runs, fetch datasets and manage schedules with `apify-client` for [Node.js](https://apify.com/topapi/instagram-profile-scraper/api/javascript) or [Python](https://apify.com/topapi/instagram-profile-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Instagram Profile Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/topapi/instagram-profile-scraper/api/mcp), connect your MCP client (Claude Desktop, Cursor, LibreChat) and ask for profiles in plain language; turn on `compact` to keep rows small.

#### Can I integrate Instagram Profile Scraper with other apps?

Yes - Make, Zapier, n8n, Google Sheets, Slack and more through [Apify integrations](https://docs.apify.com/integrations), or [webhooks](https://docs.apify.com/integrations/webhooks) that fire when a run finishes.

#### Why did my Instagram Profile Scraper run return no results?

In testing the causes were: handles that do not exist (turn on `includeUnavailable` to see them as rows), post links pasted instead of profile links, filters that removed everything (the status message lists how many each filter removed), and tracking runs where nothing changed with `monitorOnlyChanges` on.

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

Instagram Profile Scraper extracts only publicly available profile data; it does not log in or collect private data. Results can still contain personal data, which is protected by regulations such as the GDPR, so make sure you have a legitimate reason to process it.

#### Your feedback

Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/instagram-profile-scraper/issues/open) and we will look at it.

# Actor input Schema

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

Instagram usernames, profile URLs or user ids, e.g. "nasa", "@natgeo", "https://www.instagram.com/nike/", "528817151". Duplicates are read once. Post and reel URLs are not profiles and are skipped.

## `startUrls` (type: `array`):

Optional: upload a text/CSV file or link a remote list of profile URLs (one per line), e.g. an export from a CRM. Merged with the list above.

## `minFollowers` (type: `integer`):

Keep only accounts with at least this many followers, e.g. 10000 for micro-influencers and up. 0 = no minimum.

## `maxFollowers` (type: `integer`):

Keep only accounts with at most this many followers, e.g. 100000 to leave out celebrities. 0 = no maximum.

## `accountType` (type: `string`):

Keep only one kind of account, as Instagram classifies it (accountType in the output).

## `verifiedOnly` (type: `boolean`):

Keep only accounts with the blue verified badge.

## `excludePrivate` (type: `boolean`):

Leave out private accounts. Private accounts otherwise come back with their public header (counts, name, bio) and status "private".

## `requireContact` (type: `string`):

Keep only accounts that publish a way to reach them. Emails and phones are read from the bio text and link-in-bio (WhatsApp, tel:, mailto:) links.

## `bioKeywords` (type: `string`):

Keep only accounts whose bio, name, username, category or bio links contain one of these words, comma-separated and case-insensitive, e.g. "bakery, cafe, coffee".

## `activeWithinDays` (type: `integer`):

Keep only accounts whose newest post is at most this many days old, e.g. 30 to drop dormant accounts. 0 = no check. Private accounts have no visible posts and are dropped when this is set.

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

Adds the account's latest posts (up to 12: caption, likes, comments, views, date, media URL, location, tagged users) plus avgLikes, avgComments, avgVideoViews, engagementRate and postsPerWeek. Charged as the latest-posts event once per profile that gets posts.

## `monitorMode` (type: `boolean`):

Remembers each profile (in the named key-value store below) and adds changeType (NEW / UPDATED / UNCHANGED), followersDelta, followsDelta, postsDelta, followersGrowthPct and changedFields (bio, name, links, category, verified, private, account type, new posts) to every row.

## `monitorStoreName` (type: `string`):

Name of the key-value store that keeps the per-profile snapshots. Give each watchlist (a client, a campaign) its own name. Letters, digits and hyphens.

## `monitorOnlyChanges` (type: `boolean`):

With tracking on, deliver only profiles that are new to the list or changed: bio, name, links, category, verified/private status, a new post, or followers moved by 1% or more since the profile was last delivered. A run where nothing changed delivers nothing.

## `maxResults` (type: `integer`):

Cap on delivered profiles (after your filters) - your main cost control. 0 = every profile in the list. There is no Instagram-side limit on how many profiles one run can look up.

## `includeUnavailable` (type: `boolean`):

Also write a free status row (status not_found / blocked / error, with the reason) for every input that returned no profile, so the output lines up 1:1 with your list.

## `compact` (type: `boolean`):

Core fields only (id, username, name, bio, website, followers, following, posts, verified, private, account type, category, emails, phones, last post date, engagement and change fields when on): small rows sized for AI agents and MCP clients.

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

Apify datacenter proxies serve this actor (measured). It keeps each working proxy session busy, rotates away from an IP Instagram refuses, and falls back to residential proxies only if the datacenter group keeps being refused.

## `maxConcurrency` (type: `integer`):

How many profiles are read at once. 4 is a safe default; 6-8 suits lists of thousands.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "natgeo",
    "nike"
  ],
  "startUrls": [],
  "minFollowers": 0,
  "maxFollowers": 0,
  "accountType": "any",
  "verifiedOnly": false,
  "excludePrivate": false,
  "requireContact": "none",
  "bioKeywords": "",
  "activeWithinDays": 0,
  "includeLatestPosts": false,
  "monitorMode": false,
  "monitorStoreName": "instagram-profiles-monitor",
  "monitorOnlyChanges": false,
  "maxResults": 100,
  "includeUnavailable": false,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

## `profiles` (type: `string`):

The dataset of Instagram profiles (one item per account).

## `summary` (type: `string`):

Per-profile outcome (delivered, private, filtered, unchanged, not found, unreadable), which Instagram surface served each one, requests made and bytes transferred.

# 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",
        "nike"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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",
        "nike",
    ],
    "maxResults": 100,
}

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

```

## MCP server setup

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