# Instagram Profile Scraper: Followers, Bio Links, $1.8/1K (`transparent_meteorite/instagram-public-profile-scraper`) Actor

Instagram public profiles and latest posts without login: exact followers, following, posts, bio, all bio links, emails in bio, verified and private flags, plus each recent post's caption, likes, comments, date and media URLs. Engagement rate per profile.

- **URL**: https://apify.com/transparent_meteorite/instagram-public-profile-scraper.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.12 / 1,000 result rows

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: followers, bio links, emails and latest posts, no login

![Instagram Profile Scraper: features, price and a real output row](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-instagram-public-profile-scraper-banner-10141443.png)

[![Run it free on Apify](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-cta.png)](https://console.apify.com/actors/Ikcvv19a1kOddryty/input)

| Price per 1,000 profiles | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| **This Actor** | **$1.82** | **$1.61** | **$1.40** | **$1.12** |
| Most-used alternative | $2.60 | $2.30 | $2.00 | $1.60 |

<sub>Pay per event, no monthly rental. Prices read from each Actor's public Apify pricing on 2026-10-13; check the Pricing tab for the current figure.</sub>

![Instagram Profile Scraper sample output table from a real run](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-instagram-public-profile-scraper-output-10141443.png)

Get public Instagram profile data without logging in: exact followers, following, post count, bio, every link in bio, emails written in the bio, verified and private flags, profile picture and HD picture, business category, business flag, related profiles, plus the latest 12 posts with caption, likes, comments, date, type, image URLs and hashtags. Each profile row also carries average and median likes and an engagement rate, so you can vet influencers or benchmark competitors in one table.

- No Instagram account, cookies or session needed. Nothing is logged in, nothing is hidden behind a login.
- One row per profile (latest posts nested) or one row per post.
- Paste usernames, @handles, profile URLs, or post and reel URLs.
- Business fields without a login: `businessCategoryName`, `isBusinessAccount`, `fbid`, `profilePicUrlHD`, `igtvVideoCount`, `joinedRecently`, `relatedProfiles`, plus public business email, phone and address when the account shows them.
- Monitor mode returns only new posts on each scheduled run.
- From $0.0018 per profile on the free plan, less on paid plans. Accounts that do not exist and failed pages are never charged.

### Run in 30 seconds

1. Open the actor in [Apify Console](https://console.apify.com/actors?search=transparent_meteorite%2Finstagram-public-profile-scraper) (a free Apify account is enough).
2. Press **Start** with the prefilled input: @natgeo and @nasa, 2 profile rows with their latest posts, about $0.005.
3. Open the **Output** tab: the **Profiles** view is a table with followers, bio, link in bio and engagement. Download CSV, Excel or JSON.

```json
{
  "usernames": ["natgeo", "nasa"],
  "resultsType": "details",
  "resultsLimit": 12
}
```

### Why choose this over alternatives

- **Exact counts.** Followers and posts come from Instagram's official profile embed, so you get 104335933, not "104M".
- **All bio links,** not only the first one, with their titles. Emails, hashtags and mentions in the bio are pulled out into their own columns.
- **Engagement built in:** average likes, median likes, average comments and engagement rate per profile.
- **Business fields without an account:** business category, business flag, Facebook ID, HD profile picture, video count, related profiles, and the public business email, phone and address. No cookie, no risk to your own Instagram account.
- **Latest 12 posts per profile** with video URLs and carousel images.
- **Influencer filters:** minimum and maximum followers. Skipped profiles are not charged.
- **Monitor mode** for competitor tracking: only new posts, stored per watch list.
- **Priced below the best-known Instagram profile scraper on the Free, Bronze, Silver and Gold plans.**

### What it does and who it is for

The actor reads what Instagram serves to any logged-out visitor: the public profile information that Instagram's app loads, the official profile embed (the widget websites use to show an account's latest posts), the official post embed and, when needed, the public profile page. It combines them into clean rows.

- **Marketers and agencies:** vet influencers by followers, engagement rate and contact links before outreach.
- **Brands:** benchmark competitors' follower growth and post performance; schedule it daily with monitor mode.
- **Lead generation:** collect the website, link-in-bio and public bio email of local businesses from their Instagram handles.
- **Researchers and journalists:** snapshot public accounts with timestamps.

### What you get: output fields

Profile rows (`resultsType: details`):

| Field | Meaning |
|---|---|
| `username`, `fullName`, `id`, `url` | Handle, display name, Instagram user ID, profile URL |
| `followersCount`, `followsCount`, `postsCount` | Followers (exact), following, total posts |
| `countsExact` | True when followers and posts came from the exact embed counts |
| `biography`, `bioLinks`, `externalUrl` | Bio text, all links in bio `[{title, url}]`, first link |
| `emailsInBio`, `hashtagsInBio`, `mentionsInBio` | Pulled out of the bio text |
| `verified`, `isPrivate`, `hasPublicStory`, `threadsBadge` | Account flags |
| `profilePicUrl`, `profilePicUrlHD` | Profile picture URL, and the 320 px HD version |
| `businessCategoryName`, `categoryName` | Business category (for example Government Agencies, Publishers) |
| `isBusinessAccount`, `isProfessionalAccount` | Business and professional (creator or business) flags |
| `businessEmail`, `businessPhoneNumber`, `businessAddress`, `businessContactMethod` | Public business contact details, when the account shows them |
| `fbid`, `igtvVideoCount`, `joinedRecently`, `highlightReelCount`, `hasClips`, `pronouns` | Facebook-side ID, long-video count, new-account flag, story highlights, reels flag, pronouns |
| `relatedProfiles` | Accounts Instagram suggests as similar `[{id, username, full_name, is_private, is_verified, profile_pic_url}]` |
| `businessDetails` | `complete`, or `instagram-error` when Instagram's own server fails the business lookup for that account (see Limits) |
| `externalUrls`, `externalUrlShimmed` | Every bio link with its type, and Instagram's tracked redirect link |
| `avgLikes`, `medianLikes`, `avgComments`, `engagementRatePct` | Over the latest posts; engagement = (avg likes + avg comments) / followers |
| `latestPosts` | Latest posts (fields below) |
| `scrapedAt`, `inputUrl` | Snapshot time and the input it came from |

Post fields (nested in `latestPosts`, or one row each with `resultsType: posts`): `shortCode`, `url`, `type` (Image, Video, Sidecar), `caption`, `hashtags`, `mentions`, `likesCount`, `commentsCount`, `timestamp`, `isVideo`, `displayUrl`, `images`, `childCount`, `dimensions`, `isPinned`, `isPaidPartnership`, `locationName`, `ownerUsername`, `ownerId`, `videoUrl` and `productType` (feed, clips) for profile posts, and with owner data on: `ownerFullName`, `ownerFollowersCount`, `ownerVerified`, `ownerUrl`.

### Sample output

```json
{
  "id": "528817151",
  "username": "nasa",
  "fullName": "NASA",
  "biography": "Making the seemingly impossible, possible. ✨",
  "bioLinks": [
    { "title": "NASA.gov Homepage", "url": "https://www.nasa.gov" },
    { "title": "MAX POWER", "url": "https://www.nasa.gov/maxpower" }
  ],
  "externalUrl": "https://www.nasa.gov",
  "isPrivate": false,
  "verified": true,
  "followersCount": 104335933,
  "followsCount": 94,
  "postsCount": 4964,
  "countsExact": true,
  "emailsInBio": [],
  "businessCategoryName": "Government Agencies",
  "isBusinessAccount": true,
  "fbid": "17841401474538262",
  "igtvVideoCount": 171,
  "joinedRecently": false,
  "highlightReelCount": 6,
  "relatedProfiles": [{ "username": "nasaartemis", "full_name": "NASA Artemis", "is_verified": true }],
  "avgLikes": 311634,
  "medianLikes": 328217,
  "avgComments": 2115,
  "engagementRatePct": 0.301,
  "latestPosts": [
    {
      "shortCode": "DeclSZmF_7I",
      "url": "https://www.instagram.com/p/DeclSZmF_7I/",
      "type": "Sidecar",
      "caption": "Space jellyfish! 🪼 When our SpaceX CRS-35 cargo mission launched...",
      "hashtags": ["jellyfish", "launch", "nasa"],
      "likesCount": 337152,
      "commentsCount": 986,
      "timestamp": "2026-10-13T19:41:17Z",
      "isVideo": false,
      "childCount": 3,
      "isPinned": false,
      "ownerUsername": "nasa"
    }
  ],
  "latestPostsCount": 12,
  "url": "https://www.instagram.com/nasa/",
  "scrapedAt": "2026-10-14T00:13:14Z"
}
```

### Input options

| Option | What it does |
|---|---|
| `usernames` | Usernames, @handles, profile URLs, or post/reel URLs |
| `directUrls` | Same, for pasting a list of links (compatible with other Instagram scrapers' inputs) |
| `resultsType` | `details` (1 row per profile) or `posts` (1 row per post) |
| `resultsLimit` | Latest posts per profile, 0-12 (0 = profile only), default 12 |
| `includeLatestPosts` | Nest latest posts in profile rows (default on) |
| `addParentData` | Add owner name, followers and badge to post rows (default on) |
| `onlyPostsNewerThan` | A date (2025-01-31) or a span (7 days, 2 weeks) |
| `excludePinnedPosts` | Drop pinned posts |
| `minFollowers`, `maxFollowers` | Skip profiles outside the range (not charged) |
| `maxItems` | Stop after this many rows |
| `monitorMode`, `monitorStoreName` | Only new posts since the last run, per watch list |
| `maxConcurrency` | Profiles fetched in parallel (1-10) |
| `sessionCookie` | Optional and not needed. A `sessionid` from a spare account, tried only if Instagram rate-limits the logged-out lookup. Stored encrypted, never logged |
| `proxyConfiguration` | Apify Proxy by default; residential is used for profile pages automatically, cost included |

### Pricing

Pay per event. No subscription, no rental fee.

| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Result row (one profile with its latest posts, or one post) | $0.00182 | $0.00161 | $0.0014 | $0.00112 | $0.00112 | $0.00112 |

| Profiles | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| 100 | $0.20 | $0.18 | $0.16 | $0.13 |
| 1,000 | $2.00 | $1.80 | $1.60 | $1.30 |
| 10,000 | $20 | $18 | $16 | $13 |

Not charged: accounts that do not exist, pages that stay blocked after retries, profiles removed by a filter, and posts already delivered in monitor mode. Proxy costs are included. In posts mode each post is one row.

### How to run it

- **Console:** fill the form, press Start.
- **API:** `POST https://api.apify.com/v2/acts/transparent_meteorite~instagram-public-profile-scraper/run-sync-get-dataset-items?token=<TOKEN>` with the input JSON as the body.
- **Python:** `ApifyClient(token).actor("transparent_meteorite/instagram-public-profile-scraper").call(run_input={"usernames": ["nasa"]})`
- **Schedules and integrations:** run daily with monitor mode on and send new posts to Google Sheets, Slack, Make, Zapier or n8n.

### Reliability and blocking

Every request uses a real browser TLS fingerprint and is retried on a fresh proxy session. Profile lookups go through Apify residential proxy, because Instagram rate-limits datacenter IPs on them; embeds work from datacenter IPs. If the profile lookup fails, the actor falls back to the public profile page, and if that stays blocked too, the row still comes back with exact counts and the latest posts from the embed, and the log says what was unavailable. In our tests on 30 public profiles across 3 runs, every existing public account returned a full row.

### Limits and honest caveats

- **Latest 12 posts per profile.** That is what Instagram shows logged-out visitors. Full post history, comments, followers lists, stories, hashtag and location feeds need a signed-in session, which this actor does not use. A `resultsType` other than `details` or `posts` is accepted but falls back to details with a log message.
- **Business lookup error on some brand accounts.** For some business accounts (in our tests 7 of 16 large brands, for example natgeo and chipotle) Instagram's own server answers the business lookup with an error. Those rows still have the bio, links, exact counts and the latest 12 posts, `isBusinessAccount` is true (the error only happens for business accounts), `businessDetails` is `instagram-error`, and the category, Facebook ID and HD picture are null. Personal, creator and most business accounts return every field.
- **Private accounts** return the profile row (counts, bio, flags) but no posts.
- **Following** is read from the public page summary, so very large values may be rounded (for example 1.2K). Followers and posts are exact whenever the account has public posts.
- **Post rows from post URLs** have no `timestamp` (the post embed does not include it); profile posts do.
- Accounts that hide like counts return `likesCount: null`.
- Image URLs are signed by Instagram and expire after some days; download them promptly if you need the files.

### Use cases

- **Influencer shortlists.** Paste a list of handles and get followers, engagement rate and bio links for each. Set `minFollowers` and `maxFollowers` to keep only the size band you want, for example micro-creators between 10,000 and 100,000 followers. Profiles outside the range are skipped and not charged.
- **Contact discovery from public bios.** Many creators and small businesses write an email address or a booking link in the bio. `emailsInBio` and `bioLinks` collect them in one column each. Only what the account published is returned.
- **Competitor watching.** Schedule monitor mode daily on a fixed list of brand accounts and receive only the posts that were not delivered before, with captions, hashtags, likes and comments.
- **Brand and partnership checks.** `isPaidPartnership` on a post shows whether the account marked it as a paid partnership, which is useful when reviewing how a creator discloses sponsored content.
- **Social listing for agencies.** One table with followers, following, post count, verified badge and link in bio is the base of most creator or client audits.
- **Research and journalism.** Snapshot the public state of a set of accounts at a known time (`scrapedAt`) and compare snapshots later.

### Input guide

- **`usernames`** takes plain usernames, `@handles`, profile URLs, and also post or reel URLs. Profile entries give profile rows, post and reel entries give post rows.
- **`directUrls`** is the same list for tools that export links. Hashtag, explore and story pages need a login, so they are skipped with a log warning.
- **`resultsType`** is `details` (one row per profile with the latest posts nested) or `posts` (one row per post). Choose `details` for audits and shortlists, `posts` when each post should be its own table row for filtering or charts.
- **`resultsLimit`** goes from 0 to 12, default 12. Use 0 for profile data only.
- **`includeLatestPosts`** applies to `details`. Turn it off to get a compact profile row without nested posts.
- **`addParentData`** applies to `posts`. When on, each post row also carries the owner's name, followers, verified badge and profile URL, so the table can be used without a join.
- **`onlyPostsNewerThan`** accepts a date such as `2026-09-01` or a span such as `7 days`, `2 weeks`, `3 months`.
- **`excludePinnedPosts`** drops posts pinned to the top of the grid. Pinned posts are often old and can skew the engagement figures.
- **`minFollowers` and `maxFollowers`** filter profiles by size before they are delivered.
- **`maxItems`** is a hard cap on rows for the run, default 1000. Pair it with the run's maximum total charge for a firm budget.
- **`monitorMode`** and **`monitorStoreName`** keep a named key-value store of posts already delivered. Use a new store name for each watch list.
- **`maxConcurrency`** is the number of profiles fetched in parallel, 1 to 10, default 5.

### Worked examples

**Shortlist by follower range**

```json
{
  "usernames": ["natgeo", "nasa", "nike"],
  "resultsType": "details",
  "resultsLimit": 12,
  "minFollowers": 1000000,
  "maxFollowers": 200000000,
  "excludePinnedPosts": true
}
```

**One row per post for the last two weeks**

```json
{
  "usernames": ["nasa"],
  "resultsType": "posts",
  "onlyPostsNewerThan": "2 weeks",
  "addParentData": true
}
```

**Daily competitor monitor**

```json
{
  "usernames": ["nike", "adidas", "puma"],
  "resultsType": "posts",
  "monitorMode": true,
  "monitorStoreName": "sportswear-watch"
}
```

The first monitor run sets the baseline. Every later run returns only the posts that appeared since.

### Tips to reduce cost and runtime

- Use `resultsLimit: 0` for profile-only lists such as audience size checks. No post data is read.
- Apply `minFollowers` and `maxFollowers` instead of filtering in a spreadsheet: skipped profiles are not charged.
- Keep `maxConcurrency` near the default of 5; lower it if many profiles come back blocked.
- Use monitor mode for anything that repeats. Profiles with nothing new return no row and cost nothing for posts.
- Set `maxItems` while testing a new list, then raise it for the full run.
- Download image files soon after a run if you need them. Instagram image URLs are signed and expire after a few days.

### Post field details

- `type` is `Image`, `Video` or `Sidecar` (a carousel). For a carousel, `childCount` is the number of slides and `images` lists the slide image URLs.
- `videoViewCount` is filled for videos when Instagram publishes it.
- `likesCount` is `null` when the account hides like counts.
- `accessibilityCaption` is the image description Instagram generates, when available.
- `dimensions` holds the width and height of the media.
- `locationName` is the tagged place, when one is set.
- `isPinned` marks posts pinned to the grid, and `isPaidPartnership` marks posts flagged as paid partnerships.

### Calling it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/transparent_meteorite~instagram-public-profile-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames":["nasa","natgeo"],"resultsType":"details","resultsLimit":3}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("transparent_meteorite/instagram-public-profile-scraper").call(
    run_input={"usernames": ["nasa", "natgeo"], "resultsType": "details", "resultsLimit": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["username"], row["followersCount"], row.get("engagementRatePct"))
```

### More questions

**Can it scrape private accounts?** Only the public summary of a private account comes back (counts, bio, flags). Posts are not available.

**Does it return followers lists, comments or stories?** No. Those need a signed-in session, which this actor does not use.

**Can I scrape a hashtag or location page?** No. Hashtag and location pages require a login and are skipped with a warning.

**How current is the data?** Each row is a snapshot taken at `scrapedAt`. Run it again, or schedule it, to see changes.

**Is the follower count exact?** Followers and post counts are exact when the account has public posts, and `countsExact` says so. The following count is read from the public summary and large values may be rounded.

**How do I get posts from a specific date range?** Use `onlyPostsNewerThan` for the start. Because only the latest 12 posts are visible, older posts cannot be reached for busy accounts.

**What happens when an account is renamed?** The old username returns no row and is not charged. Use the new username.

**Can I use the output in a spreadsheet?** Yes. Export CSV or Excel from the Output tab. Choose `posts` as the output type when each post should be a row.

### FAQ

**Do I need an Instagram account or cookies?** No. Only public, logged-out data is read, business fields included. The optional `sessionCookie` is a fallback for rate limits only.

**How many posts per profile?** Up to 12, Instagram's logged-out limit. Set `resultsLimit` to 0 for profile data only.

**Can I get emails?** If the account wrote an email in its bio, it is in `emailsInBio`. Links in bio are in `bioLinks`. Business accounts that show a public email, phone or address have them in `businessEmail`, `businessPhoneNumber` and `businessAddress`. Nothing hidden is accessed.

**What is engagement rate?** (average likes + average comments) / followers, in percent, over the latest posts.

**How do I track competitors?** Turn on monitor mode, give the list a `monitorStoreName`, and schedule the actor daily. You get only new posts.

**Why did a profile return no row?** It does not exist, was renamed, or stayed blocked after retries. Check the log; those are not charged.

### Terms and responsible use

The actor reads only data Instagram shows publicly to logged-out visitors, the same as opening the page in a private browser window. You are responsible for using it lawfully (GDPR, CCPA, Instagram's terms) and for how you store and use personal data such as bio emails. Do not use it for spam, harassment or profiling private individuals.

### Use it from AI assistants (MCP)

Instagram Profile Scraper works as a tool for AI assistants through the official Apify MCP server. Add this URL to any MCP client (Claude Desktop, Claude Code, Cursor, ChatGPT connectors, VS Code):

```
https://mcp.apify.com/?actors=transparent_meteorite/instagram-public-profile-scraper
```

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?actors=transparent_meteorite/instagram-public-profile-scraper",
      "headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }
    }
  }
}
```

Then ask, for example: "Compare the engagement rate of @nike, @adidas and @puma on Instagram."

### Changelog

- 0.1 (2026-10-13): first release. Profiles with exact counts, all bio links, bio emails, latest posts, post URLs, engagement, follower filters, monitor mode.

### Support

Found a bug or need a field? Open an issue on the Issues tab with the run URL and we reply there.

New to Apify? [Create a free account](https://console.apify.com/sign-up?fpr=rnmakg) and run this Actor in under a minute. Some links are affiliate links.

# Actor input Schema

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

Public Instagram accounts: a username (nasa), an @handle or a profile URL (https://www.instagram.com/nasa/). Post or reel URLs work too (one row per post).

## `directUrls` (type: `array`):

Same as usernames, for pasting a list of links. Profile URLs give a profile row; post and reel URLs give a post row. Hashtag, explore and story pages need a login and are skipped with a warning.

## `resultsType` (type: `string`):

details = one row per profile with its latest posts nested (counts, bio, links, engagement). posts = one row per post (with the owner's name and followers when 'Add owner data' is on).

## `resultsLimit` (type: `integer`):

How many of the latest posts to return per profile (up to 12). 0 = profile only.

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

Profile details only: nest the latest posts (caption, likes, comments, date, media URLs, hashtags) in each profile row.

## `addParentData` (type: `boolean`):

Posts output only: add the owner's full name, followers, verified badge and profile URL to every post row.

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

Skip older posts. A date (2025-01-31) or a span (7 days, 2 weeks, 3 months).

## `excludePinnedPosts` (type: `boolean`):

Drop posts the account pinned to the top of its grid (they are often old).

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

Skip (and do not charge for) profiles with fewer followers. Handy for influencer lists.

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

Skip (and do not charge for) profiles with more followers, e.g. to find micro-influencers.

## `maxItems` (type: `integer`):

Stop after this many rows. You are also never charged past your run's max total charge.

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

Remember which posts you already got (in a named key-value store) and return only new ones on the next run. Schedule it daily to track competitors. Profiles with nothing new give no row and no charge.

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

Name of the key-value store that remembers seen posts. Use a different name per watch list.

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

Profiles fetched at the same time (1-10).

## `sessionCookie` (type: `string`):

Leave empty: business category, business flag, HD picture, related profiles and the other business fields are read without a login. Only if Instagram rate-limits the logged-out lookup, a sessionid cookie from a spare account you own is tried as a fallback. It is stored encrypted and never written to the log or output. Use a throwaway account, never your main one.

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

Apify Proxy is used by default. Profile pages are fetched through Apify RESIDENTIAL proxy automatically (Instagram rate-limits datacenter IPs); the proxy cost is included in the price.

## Actor input object example

```json
{
  "usernames": [
    "natgeo",
    "nasa"
  ],
  "resultsType": "details",
  "resultsLimit": 12,
  "includeLatestPosts": true,
  "addParentData": true,
  "excludePinnedPosts": false,
  "maxItems": 1000,
  "monitorMode": false,
  "monitorStoreName": "instagram-profile-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

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

No description

## `summary` (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",
        "nasa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/instagram-public-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",
        "nasa",
    ] }

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

```

## MCP server setup

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