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

Scrape public Instagram profiles from usernames or links. Get bio, followers, following, posts, verified status, emails and phones from the bio, engagement rate and latest posts with likes and comments. Bulk input, live results, no login needed.

- **URL**: https://apify.com/insights_data/instagram-profile-scraper.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### 📸 What is Instagram Profile Scraper?

**Instagram Profile Scraper** turns a list of Instagram usernames or profile links into one clean row per account, with followers, bio, engagement analytics and the latest posts. Marketers, agencies, sales teams and researchers just paste their profiles and click **Start**, with no code, no Instagram account and no cookies. On the Apify Free plan, results cost $2.00 per 1,000 profiles, paid from your $5 monthly credit.

Each row also has the posts count, verified and private status, bio links, any email or phone number written in the bio, and the latest posts with likes, comments and top comments.

- **Vet creators:** compare followers, engagement rate, average likes and posts per week before you reach out.
- **Find business contacts:** collect the emails, phone numbers and websites that businesses chose to write in their bio, for Instagram lead generation. Contact buttons are not read, and you are responsible for using personal data lawfully (see the FAQ).
- **Monitor competitors and brands:** track follower counts, posting frequency, content mix and top posts over time.
- **Research hashtags and mentions:** see which hashtags and accounts a group of profiles uses most.
- **Feed your tools:** send an Instagram profile dataset to Google Sheets, a CRM, a dashboard or an AI pipeline.

#### What can Instagram Profile Scraper do?

- 📋 **Bulk input:** paste usernames, @handles and profile links in one list. Formats can be mixed, and duplicates are removed.
- 📸 **Profile details:** name, bio, followers, following, posts count, verified, private, reels, highlights, pronouns and profile picture link.
- 📧 **Instagram contact scraper for bios:** emails, phone numbers and the domain of every bio link.
- 📈 **Instagram analytics per profile:** engagement rate, average and median likes, average comments, posts per week, days since the last post, content mix, top hashtags, top mentions and the top post.
- 🗂️ **Latest posts:** 10 posts per profile by default and up to 2,000, with likes, comments, exact time, video link, music, tagged users, collaborators, location and top comments.
- 🔓 **No login:** no Instagram account, password or cookies.
- ⚡ **Live results:** each profile and each post is saved while the run is still going.
- 🔌 **Apify platform:** start runs through the API, schedule them, monitor them and send the results to other apps.

***

### 📊 Instagram Profile Scraper data: what can you extract?

Each saved row holds the Instagram profile data below. Most people only need the first few fields; the rest are there for deeper analysis. The field names are the same in Apify Console, the API and every export format.

| Field | What you get |
|---|---|
| 👤 `username`, `fullName` | Username and display name |
| 🔗 `url`, `inputUrl` | Profile link, and the username or link exactly as you typed it |
| 📝 `biography` | Bio text |
| 👥 `followersCount` | Follower count as a full number (for example 268354129, not "268M") |
| 👣 `followsCount` | Number of accounts the profile follows |
| 🧮 `postsCount`, `postsCountApprox` | Number of posts, and a flag when Instagram shows that number rounded (see the FAQ) |
| 🎖️ `verified`, `private` | Verified badge and private-account flag |
| 📧 `contact` | `emails` and `phones` found in the bio text, plus `linkDomains` of the bio links |
| 🌐 `externalUrl`, `externalUrls` | First bio link, and every bio link with its title and domain |
| 🏷️ `bioHashtags`, `bioMentions` | Hashtags and accounts mentioned in the bio |
| 📈 `analytics` | `postsAnalyzed`, `avgLikes`, `medianLikes`, `avgComments`, `engagementRatePct`, `postsPerWeek`, `lastPostAt`, `daysSinceLastPost`, `contentMix`, `topHashtags`, `topMentions`, `topPost`, `collabPostsShare` |
| 🗂️ `latestPosts` | The collected posts (see the post fields below) |
| 🎬 `hasReels` | Whether the profile has published reels |
| 📌 `highlights`, `pronouns` | Story highlights (ID and title) and pronouns, when Instagram shows them |
| 🖼️ `profilePicUrl` | Profile picture link |
| 🆔 `id`, `fbid` | Instagram user ID and the linked Facebook-side account ID |
| 🗒️ `notes` | Anything that limited the row, such as a private account |
| 📅 `scrapedAt` | Time the row was collected (UTC) |
| 🚫 `error` | Only on rows of profiles that could not be collected (not billed) |

#### Post fields

Posts in `latestPosts` and rows of the separate Posts table use these fields. Several of them are only filled when **Full post details** is on (see the note below the table).

| Field | What you get |
|---|---|
| 🔗 `url`, `shortCode`, `id` | Post link and identifiers |
| 🎬 `mediaType`, `isReel`, `is_video`, `videoUrl` | Post type, reel and video flags, video link. `mediaType` is `GraphImage` for a photo, `GraphVideo` for a video and `GraphSidecar` for a carousel post |
| 📝 `caption`, `hashtags`, `mentions`, `alt` | Caption, its hashtags and mentions, and the image description |
| 🖼️ `displayUrl`, `childPosts` | Image link and the items of a carousel post |
| ❤️ `likesCount`, `likesHidden` | Likes, and a flag when the owner hides them |
| 💬 `commentsCount`, `commentsDisabled`, `topComments` | Comments count, comments-off flag, and the top comments with text, author, likes, replies and time |
| 📅 `timestamp`, `timestampApprox` | Exact post time with full details, or an approximate time without them |
| 📍 `locationId`, `locationName` | Tagged location |
| 🎵 `music` | Song title and artist, or "Original audio" |
| 🏷️ `tagged_users` | Accounts tagged in the post |
| 🤝 `coauthors`, `isCollab` | Collaborators on the post |
| 🤖 `isAiLabeled` | Whether the post carries Instagram's AI label |
| 🚧 `detailsMissing` | Present (true) when Instagram didn't return a post's details; the post keeps its basic fields |

> **Note:** `likesCount`, `likesHidden`, `commentsCount`, `commentsDisabled`, `topComments`, `timestamp`, `videoUrl`, `childPosts`, `locationId`, `locationName`, `music`, `tagged_users`, `coauthors`, `isCollab` and `isAiLabeled` are only filled when **Full post details** is on. Without it, posts have `timestampApprox` instead. `analytics` and `latestPosts` only appear when **Collect latest posts** is on. `fullName`, `biography` and `externalUrl` are empty when the profile doesn't have them.

#### What data can't Instagram Profile Scraper extract?

- Follower lists and following lists (you get the counts only)
- Posts of private accounts (you still get the profile details)
- Stories
- Emails or phone numbers that are not written in the bio text
- Reel or video view counts
- Full comment threads (you get the top comments shown with each post)
- More than 2,000 posts per profile
- Accounts found by keyword: this Instagram user scraper needs usernames or profile links and can't search for accounts

***

### 🚀 How to scrape Instagram profile data

Instagram Profile Scraper is built for an easy start, even if you have never extracted data from the web before. Here is how to scrape Instagram profiles in five steps:

1. [Create a free Apify account](https://console.apify.com/sign-up) with your email.
2. Open [Instagram Profile Scraper](https://apify.com/insights_data/instagram-profile-scraper) and click **Try for free**.
3. Paste usernames, @handles or profile links into **Instagram profiles**, one per line. For a first test, use 1 or 2 profiles.
4. Click **Start**. Profiles appear in the **Output** tab of the run one by one.
5. To download, go to **Storage → Datasets**, open the run's dataset and click **Export**. The Output section below explains the three tables.

You run this Instagram profile scraper online in Apify Console, so there is nothing to install.

***

### 💲 Instagram Profile Scraper pricing

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

Instagram Profile Scraper is an **Actor**, which is Apify's name for a program that runs in the cloud. It uses **pay-per-event** pricing: you pay a fixed price for specific events, here each saved profile row and each run start. Your bill has three parts:

1. **Results:** a fixed price for each profile row that is saved. The price depends on your Apify plan (see the table).
2. **Start fee:** $0.00005 (a small fraction of a cent) each time a run starts. This is the price at the default memory of 1 GB, which is the amount of computer memory the run gets.
3. **Platform usage:** the computing time and storage the run uses on Apify's servers. You pay it at your Apify plan's rates, and it grows with the amount of work the run does.

| Apify plan | Price per profile | Price per 1,000 profiles |
|---|---|---|
| 💲 Free | $0.002 | $2.00 |
| 💲 Starter | $0.0018 | $1.80 |
| 💲 Scale | $0.0016 | $1.60 |
| 💲 Business and higher | $0.0015 | $1.50 |

The plan discount applies to the result price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

**What is billed as a result:** only saved profile rows. Rows for profiles that could not be collected or were skipped are not billed, and the Posts and Top comments tables don't add result charges. A private account still gives a saved profile row (details, no posts), so it is billed like any other profile.

**Example:** 1,000 profiles on the Free plan cost $2.00 in result charges, plus the start fee and the platform usage of the run.

#### How to keep the cost low

- **Test first:** run 1 or 2 profiles with the default settings. When the run finishes, the run page shows what it cost, so you can scale up from there.
- **Lighter runs:** every post adds work, and full details add more for each post. Switching off **Full post details**, lowering **Posts per profile**, or switching off **Collect latest posts** means less work per profile and less platform usage.
- **Set a maximum charge limit:** you set it in the run options when you start a run. When the limit is reached, the run stops and keeps everything saved so far.

See the [pricing tab](https://apify.com/insights_data/instagram-profile-scraper/pricing) for the current prices.

#### Can I try Instagram Profile Scraper free?

Yes. Free-plan runs work the same way as paid runs; the Actor adds no extra cap. The [Apify Free plan](https://apify.com/pricing) gives you $5 of credit every month, and that credit pays for result charges and platform usage together, so your credit is what limits how much you can run. Start with a few profiles to see what a run costs you.

***

### ⬇️ Input

The only required field is **Instagram profiles**. Set the input in the Console form, or send it as JSON through the API.

#### Settings most people change

| Setting | What it does | Default |
|---|---|---|
| 📸 **Instagram profiles** (`urls`) | One profile per line: a username, an @handle or a profile link | Required |
| 🧮 **Posts per profile** (`maxPosts`) | How many of the latest posts to collect per profile. `0` = every post, up to 2,000 | 10 |
| 🗂️ **Collect latest posts** (`includePosts`) | Off = profile details only, the lightest run. **Posts per profile** is then ignored | On |
| 💎 **Full post details** (`postDetails`) | On = likes, comments count, exact time, video link, music, tagged users, collaborators, location and top comments for every post. Off = a lighter run, with caption, hashtags, media link and an approximate time | On |

The defaults (10 posts per profile with full details) are a good first test with 1 or 2 profiles. They give you the full analytics, including the engagement rate. For lighter runs, see [How to keep the cost low](#how-to-keep-the-cost-low).

**Proxy** (`proxyConfiguration`) is optional, so leave it as it is. A proxy is another route to the internet; the Actor chooses its connection on its own and uses Apify Proxy when it needs one.

Here's an example that collects one profile with its 10 latest posts and full details:

```json
{
  "urls": ["natgeo"],
  "maxPosts": 10,
  "includePosts": true,
  "postDetails": true
}
```

See the [input tab](https://apify.com/insights_data/instagram-profile-scraper/input-schema) for a full description of all fields.

#### Which profile links work?

Use usernames, @handles or links to a profile page. You can mix them in one list.

- ✅ Good: `natgeo`, `@nike`, `https://www.instagram.com/nike/`
- ❌ Bad: `https://www.instagram.com/p/DehZj9wggt0/` (a post link, not a profile)

> ⚠️ Links to posts, reels, stories or the explore page don't name a profile, so they are ignored and the log shows an input note.

#### Posts per profile: what does 0 mean?

`0` means every post, up to 2,000 per profile. It does not mean "no posts". A 2,000-post profile with full details is far more work than the default 10 posts, so it uses more platform usage.

- ✅ Good: `10` for a first look at recent activity
- ❌ Bad: `0` when you only want profile details

> ⚠️ Values above 2,000 are treated as 2,000. To get profile details only, switch off **Collect latest posts**.

***

### ⬆️ Output

Your results are saved in three tables. You can see all of them in the **Output** tab of the run while it is going:

| Table | What's in it | Billed? |
|---|---|---|
| 👤 **Profiles** | One row per profile with all the fields above. **Contact & links** and **Analytics** in the Output tab show the same rows with fewer columns | Yes, per saved profile row |
| 🗂️ **Posts** | One row per collected post, with the profile's username, name and link | No |
| 💬 **Top comments** | One row per top comment, with the post link and caption | No |

The Output tab also has a **Run summary**: the run totals (profiles requested, saved, billed, failed and skipped, posts and top comments saved) and the status of every profile.

#### Instagram profile data download (Excel, CSV, JSON)

Each table is saved as a dataset, which is Apify's name for a stored results table. To download one:

1. In Apify Console, go to **Storage → Datasets**.
2. Open the dataset of your run. The Profiles table is the run's default dataset; the Posts and Top comments tables are its two other datasets.
3. Click **Export**, choose Excel, CSV, JSON, XML or HTML, and pick only the fields you need if you like.

The run summary is saved as a record named `SUMMARY` in **Storage → Key-value stores**.

#### What do the row statuses mean?

- **Saved:** a full profile row (with posts and analytics when they are on). Billed.
- **Saved with notes:** the profile was saved, but something limited it. For example, a private account has no posts; when **Collect latest posts** is on, `notes` says so. Billed.
- **Failed:** the profile could not be collected, for example because it doesn't exist. You get a row with `username`, `inputUrl` and `error`. Not billed.
- **Skipped:** the run stopped before this profile. If Instagram kept refusing requests, the profile gets a row with `error`. If your maximum charge limit was reached, it gets no row. Not billed.

#### JSON example

Results for the input example above (shortened: only some `analytics` fields and one post are shown; numbers change over time). `"engagementRatePct": 0.038` means an engagement rate of 0.038%.

```json
{
  "id": "787132",
  "username": "natgeo",
  "fullName": "National Geographic",
  "url": "https://www.instagram.com/natgeo/",
  "inputUrl": "natgeo",
  "biography": "Step into wonder and find your inner explorer with National Geographic",
  "bioHashtags": [],
  "bioMentions": [],
  "externalUrl": "http://visitstore.bio/natgeo",
  "externalUrls": [{ "title": null, "url": "http://visitstore.bio/natgeo", "domain": "visitstore.bio" }],
  "followersCount": 268354129,
  "followsCount": 195,
  "postsCount": 32000,
  "postsCountApprox": true,
  "private": false,
  "verified": true,
  "hasReels": true,
  "contact": { "emails": [], "phones": [], "linkDomains": ["visitstore.bio"] },
  "analytics": {
    "postsAnalyzed": 10,
    "avgLikes": 101304.4,
    "engagementRatePct": 0.038
  },
  "latestPosts": [
    {
      "shortCode": "DehZj9wggt0",
      "url": "https://www.instagram.com/p/DehZj9wggt0/",
      "mediaType": "GraphVideo",
      "isReel": true,
      "caption": "Keeping up with a pack of hunting wolves...",
      "hashtags": ["wolvesupclose"],
      "likesCount": 47421,
      "commentsCount": 337,
      "timestamp": "2026-10-15T19:00:02Z",
      "music": { "title": "Original audio", "artist": "natgeo" },
      "tagged_users": [{ "username": "natgeoanimals", "is_verified": true }]
    }
  ],
  "scrapedAt": "2026-10-17T18:57:36Z"
}
```

***

### 💡 Tips and advanced usage

#### How many results can you scrape with Instagram Profile Scraper?

The Actor itself doesn't set a limit on the number of profiles per run; your maximum charge limit and your Apify credit do. Posts are limited to 2,000 per profile. Very long lists take longer, and if Instagram keeps refusing requests during a run, the run stops early and keeps what it saved. Start with a small batch, check the result and the cost, then run larger lists.

#### How to scrape Instagram posts from a profile

Set **Posts per profile** to the number you need (or `0` for every post up to 2,000) and keep **Full post details** on. Each post is saved in the profile row and as its own row in the Posts table, and its top comments go to the Top comments table.

#### Known issues

- Some posts can have `detailsMissing: true` when Instagram doesn't return their details. The post keeps its basic fields.
- When a profile row would be too large to save as one row, `latestPosts` is shortened and a note is added. Every post is still in the Posts table.
- Instagram changes its pages from time to time. If results look wrong, open an issue (see Support and feedback).

***

### 🔌 Instagram Profile Scraper integrations and API

#### Can I use it as an Instagram profile data API?

Yes. Every run can be started and read through the Instagram Profile Scraper API on Apify: you send usernames and get JSON rows back. See the [Apify API docs](https://docs.apify.com/api/v2) and the [API tab](https://apify.com/insights_data/instagram-profile-scraper/api) for ready-to-use code. For Node.js use the `apify-client` [NPM package](https://apify.com/insights_data/instagram-profile-scraper/api/javascript), and for Python the `apify-client` [PyPI package](https://apify.com/insights_data/instagram-profile-scraper/api/python).

#### Instagram Profile Scraper Python example

This starts a run with the input example above and prints each profile's username and follower count:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/instagram-profile-scraper").call(run_input={
    "urls": ["natgeo"],
    "maxPosts": 10,
    "includePosts": True,
    "postDetails": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["username"], item.get("followersCount"))
```

#### Can I call the Instagram scraper API from other languages?

Yes. Besides the Node.js and Python clients, you can call the Apify API over plain HTTP from any language. The API tab shows the request for each case.

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

Yes. Connect it with almost any cloud service through [Apify integrations](https://apify.com/integrations): **Make, Zapier, Slack, Google Sheets, Google Drive, Airbyte, GitHub, LangChain** and more. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes.

#### Can I schedule an Instagram profile data extractor to run every week?

Yes. Create a schedule in Apify Console for your list of accounts, for example every Monday, and send the Profiles table to Google Sheets through an integration. That gives you followers and engagement week by week.

#### Can I use Instagram Profile Scraper with AI agents (MCP)?

Yes. Connect it to Claude and other AI assistants through the Apify MCP server. Open the [MCP tab](https://apify.com/insights_data/instagram-profile-scraper/api/mcp) for setup steps.

***

### 🧩 Other social media scrapers

These Actors from the same developer pair well with this Instagram data scraper when your research covers more platforms:

- 📘 [Facebook Post Scraper](https://apify.com/insights_data/facebook-post-scraper): public Facebook posts from pages, profiles, groups and post links, with text, date, author, reactions by type, comments with replies, shares, photos, videos and views.
- 📱 [TikTok Profile Scraper](https://apify.com/insights_data/tiktok-profile-scraper): videos, reposts, stories and playlists of a TikTok profile with views, likes, comments, shares, music, hashtags and author stats.
- 💬 [TikTok Comments & Replies Scraper](https://apify.com/insights_data/tiktok-comments-replies-scraper): TikTok comments and replies from videos, photo posts and whole profiles, with likes, reply counts, dates and commenter details.
- 👔 [LinkedIn Profile Extractor & Enricher (No Login Required)](https://apify.com/insights_data/linkedin-profile-extractor-enricher): public LinkedIn profiles with name, headline, location, about, followers, current role, experience, education and skills.

***

### ❓ FAQ

#### Is it legal to scrape Instagram?

Web scraping is generally legal if you extract publicly available data. However, you should **respect personal data** (for example under GDPR) and intellectual property, and take Instagram's [Terms of Use](https://help.instagram.com/581066165581870) into account. Before you use any Instagram scraper, check what your use case allows. This is not legal advice. The Apify blog has a [guide to the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

#### Can I use an Instagram user data scraper under GDPR?

Only with care. Names, bios, emails and phone numbers of people are personal data. Collect them only when you have a legitimate reason, keep only what you need, and follow the rules for contacting people in your country.

#### How does Instagram Profile Scraper work?

It opens each public profile page without logging in and reads the profile details. If posts are on, it reads the latest posts and, with full details on, each post's details and top comments. It then computes the analytics from those posts and saves one row per profile, plus the post and comment rows.

#### Instagram scraper no login: do I need an account?

No. You don't need an Instagram account, password, cookies or an Instagram profile API key. The Actor reads only data that any visitor can see.

#### Does this Instagram profile extractor need a browser extension?

No. It runs in the cloud on Apify, so you don't install anything, and your own Instagram account is never used.

#### Can it scrape private Instagram profiles?

Only partly. It is an Instagram public profile scraper, so posts are read from public accounts only. For a private account you still get the public profile details (name, bio, counts, picture link). When **Collect latest posts** is on, `notes` also says that the posts are not visible.

#### Can I use it as an Instagram email scraper?

Yes, for emails that people write in their bio. Every saved profile row has a `contact` object with the emails found in the bio text, plus the domains of the bio links. Contact buttons on business profiles are not read, so a profile without an email in its bio has an empty list.

#### Is it an Instagram phone number extractor too?

Yes, in the same way: phone numbers written in the bio are saved in `contact.phones`.

#### What should I know before using it as an Instagram leads scraper?

Expect contact details only where people wrote them in their bio, so many rows will have empty `emails` and `phones`. Keep personal data rules in mind (see the GDPR question above).

#### Can I use it as an Instagram bio scraper only?

Yes. Switch off **Collect latest posts**, run your profiles, and open the **Contact & links** table in the Output tab. It shows the bio, emails, phones, link domains, every bio link, bio hashtags and mentions.

#### Can I use it as an Instagram followers count scraper?

Yes. Switch off **Collect latest posts**. Each saved row still has followers, following and posts count, and the run does the least work per profile.

#### Is there an Instagram profile post scraper mode?

There is no separate mode. Set **Posts per profile** and keep **Full post details** on: every collected post gets its own row in the Posts table, with the profile's username, name and link.

#### Does it work as an Instagram profile picture scraper?

Partly. Every saved profile row has the profile picture link in `profilePicUrl`. The Actor saves the link, not the image file.

#### How is the Instagram engagement rate calculated?

It is the average of likes plus comments per collected post, divided by the follower count, times 100. The result in `analytics.engagementRatePct` is already a percentage: `0.038` means 0.038%, and `2.5` means 2.5%. It needs **Full post details** on, because likes and comments counts come from the post details.

#### How many accounts can an Instagram account scraper handle in one run?

The Actor doesn't set a limit of its own; your maximum charge limit and Apify credit decide. Duplicates are removed, and each profile is saved as soon as it is done. For long lists, start with a small batch first (see the Tips section).

#### Why use an Instagram profile info scraper?

It saves you from copying profile details by hand, and it gives the same columns for every account. Common uses:

- **Bulk Instagram engagement rate checker:** add a list of creators and compare their engagement rate side by side in the Analytics table.
- **Creator shortlists:** an Instagram influencer scraper run over your candidates gives followers, posts per week and top posts in one table.
- **Competitor tracking:** schedule weekly runs and watch followers, posts per week and top posts.

#### How to scrape Instagram data without coding?

Follow the five steps in the tutorial above: create a free Apify account, paste the profiles, click **Start** and export the results. This Instagram profile scraper tool needs no code, and the same run can be scheduled to repeat.

#### Why am I getting fewer results than expected?

- **Private accounts** give profile details but no posts.
- **Profiles that don't exist** get a row with `error` instead of data.
- **Post or reel links** are not profile links, so they are ignored. Check the log for input notes.
- **Your maximum charge limit** was reached, so the run stopped early.
- **Instagram kept refusing requests**, so the run stopped early. The status message says so. Try again later.
- **Instagram returned no more posts** for a profile, or the profile has fewer posts than you asked for. You get at most 2,000 posts per profile.

A run that stops early still has platform usage for the work it did, but failed and skipped profiles are not billed as results. To retry them, check the Run summary for their status and start a new run with only those usernames.

#### Why is the posts count rounded for some profiles?

Instagram shows the post count of some large accounts rounded (for example 32K). Those rows have `postsCountApprox: true`.

***

### 🙋 Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/instagram-profile-scraper/issues/open). Your feedback helps us improve Instagram Profile Scraper.

Need a **custom solution** or more data? Contact us at hello.insights.data@gmail.com.

Built and maintained by [Insights Data](https://apify.com/insights_data).

# Actor input Schema

## `urls` (type: `array`):

One profile per line: a username (natgeo), an @handle (@nike) or a profile link (https://www.instagram.com/nike/). Paste as many as you like; duplicates are removed.

## `maxPosts` (type: `integer`):

How many of the latest posts to collect for each profile. 0 = every post (up to 2,000 per profile).

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

On: each profile row includes its latest posts and engagement analytics. Off: profile details only (fastest).

## `postDetails` (type: `boolean`):

On: every post gets likes, comments count, exact time, video link, music, tagged users, collaborators, location and top comments. Off: faster, with caption, hashtags, media link and an approximate time only.

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

Default is no proxy. If Instagram blocks the run, a datacenter proxy and then a residential proxy are added automatically and kept for the rest of the run.

## Actor input object example

```json
{
  "urls": [
    "natgeo"
  ],
  "maxPosts": 10,
  "includePosts": true,
  "postDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per profile with identity, counts, bio and links.

## `contact` (type: `string`):

Bio, emails and phones found in the bio, and every bio link.

## `analytics` (type: `string`):

Engagement rate, average likes and comments, posting cadence and top post per profile.

## `posts` (type: `string`):

One row per collected post.

## `comments` (type: `string`):

One row per top comment of each collected post.

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

Totals for the run and the status of every profile.

# 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 = {
    "urls": [
        "natgeo"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/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 = {
    "urls": ["natgeo"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/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 '{
  "urls": [
    "natgeo"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/instagram-profile-scraper --silent --output-dataset

```

## MCP server setup

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