Instagram Followers Scraper avatar

Instagram Followers Scraper

Pricing

$10.00 / 1,000 profile analyzeds

Go to Apify Store
Instagram Followers Scraper

Instagram Followers Scraper

Analyze Instagram followers or following to find valuable profiles. Filter large accounts by engagement, contact info, and business category to discover influencers, leads, or ideal customers. Perfect for lead generation, market research, and influencer marketing.

Pricing

$10.00 / 1,000 profile analyzeds

Rating

0.0

(0)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

0

Bookmarked

80

Total users

27

Monthly active users

2 days ago

Last modified

Share

Instagram Followers & Following Extractor

Apify Actor

Turn any public Instagram audience into a qualified-lead list. Pull the full followers and/or following list of any account and get one fully enriched row per profile — emails, phones, engagement rate, business category, language, Reels activity. $0.01 per profile with 12 built-in filters so only profiles that match your target persona end up in the dataset.

Instagram's official Graph API only returns followers of business accounts you own. This actor reads any public profile's followers or following list and returns 20+ enrichment columns per row.

🎯 What it does

You give the actor one or more Instagram usernames you already know are relevant (a competitor, a creator, a customer). For each target it asks Instagram for the full followers and/or following list and returns one row per profile, fully enriched.

For every profile that comes back you get:

  • Identity — handle (Account URL), Full Name, Profile Picture, Source (which target list this came from), Mutual Follow flag (when both directions extracted).
  • Audience — Followers Count, Following Count.
  • Reels analytics — Reels Count, Last Reel age, Median Views, Views/Followers ratio.
  • Engagement — Median Engagement Rate, Quality flag (Excellent / Good / Average / Poor).
  • Contact — Email (from contact button or bio), Email Source, Phone, External URL, Physical Address.
  • Classification — Business Category, Detected Language.
  • Activity — Last Post age in days, optional «Posts in Last N days» counter.
  • Optional post sample — captions of the 8 most recent feed posts, plus contacts parsed from those captions.

Then the actor applies your filters (followers band, engagement floor, language, business category, contact-channel presence, posting cadence, verification, keywords) so only the profiles that match end up in the dataset.

⚡ Quick start

A minimal input that works on the free plan (5 profiles, no extra setup):

{
"usernames": ["nike"],
"extractFollowers": true,
"maxResults": 5
}

Run it once, open the Storage → Dataset tab, and you'll see 5 followers of @nike with a full row of metrics each. From there, layer filters in the input form to narrow to your target.

📦 What you get — output sample

Every analyzed profile is pushed to the dataset as one item. Here's a real row (truncated for readability):

{
"Account": "https://instagram.com/nataliaduraes",
"Source": "Follower of nike",
"Full Name": "Natália Durães • Design & Lettering",
"Followers Count": 1495,
"Following Count": 3808,
"Biography": "Design & Lettering • Based in England 🇬🇧\nI'm a graphic designer and I also create customised lettering products ❤️",
"Email": "natalia@example.com",
"Email Source": "bio",
"Phone": "N/A",
"External URL": "https://nataliaduraes.com",
"Address": "N/A",
"Category": "Graphic Designer",
"Profile Picture": "https://…cdninstagram.com/…/profile.jpg",
"Reels Count": 12,
"Last Reel (Days Ago)": 1972,
"Median Views": 151,
"Views/Followers Ratio": "10.10%",
"Detected Language": "English",
"Last Post Within (Days)": 10,
"Median ER": "2.04%",
"Quality": "Poor"
}

Missing optional values come back as the string "N/A" (not null), so every key is always present and downstream code can rely on a stable shape.

The full per-field schema (types, descriptions, examples) is published in .actor/dataset_schema.json — that's also what AI agents see when they call the actor through Apify's MCP server.

🧭 When to use it

  • Influencer outreach. Find creators in a niche by category / language / follower band, scraped from a competitor's followers — much higher quality than hashtag scraping.
  • Lead generation. Extract emails + phones from a competitor's followers (or following) for B2B / D2C outreach lists. Filter by contactInfoType: emailOrPhone to keep only contactable leads.
  • Competitor audience audit. See exactly who follows competitor X to understand market positioning, geo skew, and audience overlap.
  • Mutual-follow discovery. Find warm intros: extract both followers + following of a target → the Mutual Follow column flags accounts the target follows back (likely closer relationships).
  • Audience expansion. Find lookalikes by scraping followers of multiple seeds in the same niche; deduplicated downstream into a master list.
  • Verified-only campaigns. mustBeVerified: true + a min-followers gate for vetted-creator-only outreach (no fan accounts, no impersonators).
  • Engagement-quality screening. minEngagementRate: 3 to drop bot-followed mega-accounts with low real engagement.
  • Local-market discovery. profileLanguage: Spanish + keyword «Madrid» for geo+language targeted lists.

🛠 Input

The input form is grouped into two sections:

SectionPurpose
🎯 Target AccountsSeed handles + which list (followers, following, both) to extract.
🔍 Filters12 filters that drop non-matching profiles before they're billed.

Highlights of the most useful fields (full reference in the input form):

  • usernames — one or more target handles or profile URLs (one per line). Free plan allows 1 target; paid is unlimited.
  • extractFollowers / extractFollowing — at least one must be true; combine both on a target to derive the Mutual Follow column.
  • maxResults — hard cost ceiling, in profiles. Set to your spend budget × 100 (e.g. 1000 = $10).
  • minFollowers / maxFollowers — the most-used filter, set as a band (e.g. 5 000–100 000 for nano / micro-influencers).
  • minEngagementRate — common B2B floor: 1–3 %.
  • contactInfoType — only keep profiles with the contact channel you'll actually use (emailOnly, phoneOnly, emailOrPhone, emailAndPhone, any).
  • profileLanguage — restrict to one of 60 detected languages (any = no filter).

💰 Pricing

The actor uses Apify's Pay Per Event model with one single primary event:

EventPriceTriggered
Profile Analyzed$0.01Once per discovered profile that's successfully retrieved (live or from cache) and analyzed, regardless of whether it passes your filters.

You're billed per profile, not per API call. The cost ceiling maxResults translates directly to your maximum spend.

Pricing math

You set maxResultsPlanApprox cost
5Free$0.05 (free-plan ceiling)
100Paid$1.00
500Paid$5.00
1 000Paid$10.00
5 000Paid$50.00

Tighter filters mean more profiles are retrieved and analyzed before you find matches, so be conservative with maxResults when stacking many filters.

🆓 Free vs paid plan

Free planPaid plan
Target accounts per run1unlimited
Profiles per run50unlimited
Filters (followers, language, engagement, etc.)
Reels analytics (Median Views, Views/Followers)
Resume from checkpoint
Single PPE event ($0.01 / profile)free up to ceilingyes

Upgrade to a paid plan to remove the 50-profile cap and run multiple targets in one run.

🧪 Filter recipes

Common stacks that work well together:

Nano-influencer outreach (B2C beauty / fitness)

{
"usernames": ["sephora"],
"extractFollowers": true,
"maxResults": 500,
"minFollowers": 1000,
"maxFollowers": 10000,
"minEngagementRate": 3,
"lastPostDays": 30
}

Active English-speaking creators (audience expansion)

{
"usernames": ["zara"],
"extractFollowing": true,
"maxResults": 1000,
"profileLanguage": "English",
"lastPostDays": 14,
"minFollowers": 10000,
"maxFollowers": 500000
}

B2B partnership shortlist (business + verified contacts)

{
"usernames": ["microsoft"],
"extractFollowers": true,
"maxResults": 200,
"accountType": "business",
"mustBeVerified": true,
"contactInfoType": "emailOrPhone",
"keywords": ["agency", "consulting", "saas"],
"keywordLocation": "bio_or_name"
}

🔁 Resume / checkpoint

Long runs can be interrupted (timeout, manual stop, abort). The actor writes a checkpoint to its key-value store after every batch. To resume, simply run the actor again with clearSavedData unchecked — already-analyzed profiles are not re-billed.

📡 Live status & storage records

While the run is in progress, the actor exposes:

Storage keyTypeWhat it holds
status.htmlHTML pageLive progress, costs, ETA. Open it from the run's Storage tab.
RUN_SUMMARYJSONAggregate run statistics — counts, plan, pricing, timings. Available after the run finishes.
SKIPPED_ACCOUNTSJSONPer-username list of profiles skipped during the run, with reason and category (filter / not_found / private / error). Re-run the error cohort separately if needed.
FREE_LIMITS_APPLIEDJSONStable id codes for free-plan caps applied this run. Empty / omitted on paid runs.
USER_MESSAGEJSONOnboarding banner shown on a paying user's 1st and 3rd paid run. Empty otherwise.
checkpoint-*JSONInternal resume state — safe to ignore.

These are stable, machine-readable surfaces — pull them via the Apify API for dashboards or post-processing.

🤖 Programmatic / API use

Run the actor from your own code or AI agent:

REST API (start a run, poll for completion):

curl -X POST "https://api.apify.com/v2/acts/afanasenko~instagram-followers-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"usernames": ["nike"],
"extractFollowers": true,
"maxResults": 100
}'

MCP / agentic clients (Claude, ChatGPT, Cursor, LangGraph, OpenAI Agents SDK, Mastra, …):

The actor is automatically exposed as a tool through Apify's MCP server at mcp.apify.com. Once your MCP-enabled client is connected to your Apify token, an LLM can search, inspect input + output schemas, and run the actor with natural-language instructions like "find me 50 followers of @nike that have email contact and 5–10k followers".

❓ FAQ

Q: How does the actor know which accounts are followers vs following? A: It pulls Instagram's own follower / following lists for each target you provide. The Source column on every output row tells you exactly which target's list (followers or following) the profile came from.

Q: Can I scrape a private Instagram account's followers? A: No. The target accounts must be public, and only public profile data is returned.

Q: How is engagement rate calculated? A: For each of the most recent feed posts, (likes + comments) / followers, then median across the sample. The median is more robust to viral outliers than the mean.

Q: What does the Quality flag mean? A: A heuristic combining engagement rate and posting recency. Excellent / Good = recommend reaching out. Average / Poor = likely low-engagement or inflated audience. Treat it as a quick filter, not a verdict.

Q: Why are my Reels metrics blank? A: Either the profile has no Reels at all (column shows "N/A"), or the Reels list was not exposed by Instagram for this account. Reels view-count data depends on profile-side visibility.

Q: Why do I see «N/A» instead of null for missing values? A: It's a deliberate choice — every output key is always present so Google Sheets, Airtable, and CSV consumers don't have to special-case missing fields. If you need null, it's a one-line transform in your post-processing.

Q: Can the actor scrape stories, posts, or DMs? A: This actor focuses on profile-level data and the 8 most recent post captions. For full post / Reel / story analytics, see the Instagram Profile Scraper linked below.

Q: Can I resume an interrupted run? A: Yes — uncheck Start a Fresh Run (or set clearSavedData: false) and the actor resumes from the last checkpoint. Already-analyzed profiles are not re-billed.

Q: How fast is it? A: Roughly 150–300 profiles per minute, depending on which enrichments are turned on and how many targets you stack. A 100-profile run finishes in ~30 seconds; a 1 000-profile run in ~5–7 minutes.

Q: What if a target account is private or doesn't exist? A: It's skipped and logged in the SKIPPED_ACCOUNTS storage record with category private or not_found. You're not charged for the failed retrieval. Re-run the error cohort separately to retry transient failures.

🔗 Other Instagram scrapers (same author)

This actor is part of a family of focused Instagram tools — pick the one that matches your discovery model:

You start with…You want to find…Use this actor
One known accountThe full list of its followers and / or following with 20+ enrichment fieldsThis actor — Followers & Following Extractor
1–5 seed handles you likeSimilar / suggested profiles in the same niche (Instagram's "Suggested for You")Instagram Related Profiles Scraper
Anything else (handles, locations, hashtags, keywords)All of the above + 4 other discovery modes in one toolInstagram Profile Scraper — 5-mode all-in-one

The single-mode actors are simpler to configure and cheaper to run for one specific job; the all-in-one Profile Scraper is right when one project needs multiple discovery flows.

🛟 Support & feedback

  • Open an issue on the actor's Issues tab in Apify Console — fastest way to get a fix shipped.
  • Feature requests in the same tab; we read every one.
  • Ratings & reviews on the Apify Store page help other users find the actor.

⚖️ Disclaimer

This actor scrapes publicly available profile data from Instagram. It does not bypass authentication, scrape private profiles, or interact with content on your behalf. Use it in compliance with Instagram's Terms of Service and applicable privacy laws (GDPR, CCPA) — for outreach lists, ensure you have a legitimate interest and a clear unsubscribe path. The contact information returned (emails, phone numbers) is what the profile owner has chosen to make public on Instagram.