Instagram Profile Scraper avatar

Instagram Profile Scraper

Pricing

from $10.00 / 1,000 profiles

Go to Apify Store
Instagram Profile Scraper

Instagram Profile Scraper

Scrape Instagram profiles at scale — followers and following lists, similar-account discovery, keyword and location search, and the accounts that engaged with a post. Every profile returns emails, bio links, engagement rate, business category and language. No login needed.

Pricing

from $10.00 / 1,000 profiles

Rating

4.2

(9)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

75

Bookmarked

2.7K

Total users

341

Monthly active users

3.7 hours

Issues response

an hour ago

Last modified

Share

Instagram Profile Scraper — 6-Mode All-in-One

Apify Actor

Analyze Instagram followers, following, or the accounts that engaged with a post 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.

Discover and enrich Instagram profiles that match your target audience — followers and following of any public account, accounts you specify, similar accounts via Instagram's "Suggested for You" graph, keyword and hashtag search, creators tagged at any city or place, and the people who liked or commented on a specific post. Six discovery modes in one actor, with 25+ post-fetch filters to narrow the result to your exact persona.

Instagram's official Graph API is locked to your own business accounts. This actor reads any public profile and returns up to 38 columns per row — bio, contacts (email + phone + website), engagement rate, business category, language, Reels analytics, recent post captions, and a Quality flag.

🎯 What it does

⚠️ Pick your mode first in the operationMode dropdown. Each mode reads only its own input fields. Example: you select Mode 3 (Network Expansion) but type your terms into Mode 4's search-queries field. The actor runs Mode 3 — which doesn't look at the search-queries field — and finds no startUsernames seeds to expand from, so the run returns zero rows. All 6 mode sections stay visible regardless of your choice — fill only the section labelled with your selected mode.

Six independent discovery modes — pick what matches the input you already have:

ModeInputWhat it returns
1: Analyze Followers / Following1+ competitor handlesTheir followers and/or following, enriched. Mutual Follow flag for warm leads (≥ 2 targets). Public accounts with visible lists only — private targets return nothing. Cost cap: maxCount.
2: Analyze a Specific ListList of usernamesFull enrichment of a known list — no discovery. Cost cap: maxCountList.
3: Network Expansion3–5 seed handlesHundreds of similar profiles via Instagram's «Suggested for You» graph. Cost cap: maxCountExpansion.
4: Keyword / Hashtag DiscoverySearch queries / hashtagsSearch-result authors + top-post hashtag authors, merged round-robin. Start with broad single-word terms — rare terms plus tight filters often return zero. Cost cap: maxCountDiscovery.
5: Location DiscoveryCity, Country seedsCreators tagging posts at specific places, with Tagged Location column. Cost cap: maxCountLocation.
6: Post Engagement DiscoveryPost / reel linksThe accounts that liked or commented on those posts, ranked by how much they engaged. Instagram serves likers as one capped sample, so a viral post returns part of its liker list; comments are read in full. Cost cap: maxCountEngagers.

Mode-specific columns (added per mode): Source (all modes — which mode + seed produced the row), Mutual Follow (Mode 1 ≥ 2 targets — warm-lead signal), Tagged Location (Mode 5 — Instagram place name), Liked Posts / Comments Left / Posts Engaged (Mode 6 — how much this account engaged), Matched By (any mode with keyword + category filters — which filter let the row through under OR).

For every profile that comes back you get:

  • Identity — Account URL, Full Name, Profile Picture, Verified flag.
  • Audience — Followers Count, Following Count, Posts Count, Mutual Follow flag.
  • Engagement — Median ER (%), Avg Likes, Avg Comments, Posts-per-Month, Quality (Excellent / Good / Average / Poor).
  • Reels analytics — Reels Count, Last Reel (Days Ago), Median Views, Views/Followers Ratio (%).
  • Bio + classification — Biography, Detected Language, Category (1090+ Instagram business categories).
  • Optional contacts + posts — Email, Phone, External URL, Address (parsed from bio + optionally from recent posts), plus captions of the 8 most-recent posts.

Then the actor applies your filters (follower band, ER, language, category, keyword in bio/name/posts, location keyword, contact-info presence, recency, verified-only, has-website, plus an AND/OR combinator with a Matched By column) so only profiles matching your target persona end up in the dataset.

📦 Output sample

Every analyzed profile is pushed to the dataset as one item — one row per profile, regardless of mode. Here's a real row from a recent run (Profile Picture URL and Post captions truncated for readability):

{
"Account": "https://instagram.com/chef.maria.recipes",
"Source": "Network Expansion of foodnetwork",
"Matched By": "category",
"Full Name": "Maria Rodriguez — Food Creator",
"Profile Picture": "https://scontent.cdninstagram.com/v/t51.../profile.jpg",
"Followers Count": 45300,
"Following Count": 1200,
"Total Posts": 487,
"Posts per Month": 18,
"Last Post Within (Days)": 1,
"Biography": "🍳 Chef & Recipe Developer | 📧 collabs@chefmaria.com | 📍 Los Angeles",
"Detected Language": "English",
"Category": "Chef",
"Email": "collabs@chefmaria.com",
"Email Source": "bio",
"Email from Posts": "N/A",
"Phone": "N/A",
"Phone from Posts": "N/A",
"External URL": "https://linktr.ee/chefmaria",
"Address": "Los Angeles, CA",
"Avg Likes": 1108,
"Avg Comments": 32,
"Median ER": "2.45%",
"Quality": "Good",
"Reels Count": 142,
"Last Reel (Days Ago)": 3,
"Median Views": 18500,
"Views/Followers Ratio": "40.85%",
"Post 1": "30-minute weeknight pasta — recipe in stories! Tested this twice...",
"Post 2": "Sourdough breakthrough: room temp + 20% rye for that perfect crumb...",
"Post 3": "Knife skills 101 — the 3 cuts every home cook should master...",
"Post 4": "Pantry challenge week 4: $40 grocery bill, 9 dinners. Spreadsheet in bio...",
"Post 5": "Fermentation Friday — kimchi day 7 update. Spice level: dialed up...",
"Post 6": "Behind the scenes: shooting the cookbook cover at 5am with natural light...",
"Post 7": "Reader question answered: gluten-free swaps that actually work in baking...",
"Post 8": "Weekend brunch board — 12 components, all made in under an hour..."
}

Missing optional values come back as the string "N/A" rather than null, so every key is always present and downstream code (Sheets, Airtable, CSV) can rely on a stable shape. The full per-column schema is in .actor/dataset_schema.json.

⚡ Quick start

  1. Choose Mode in the operation-mode dropdown — Mode 3 (Network Expansion) is the easiest first run. All 6 mode sections stay visible in the form, and the run reads only the section for the mode you picked — so fill that one and ignore the rest.
  2. Add seeds / targets — 1–5 Instagram usernames in your niche, or a hashtag / search query / City, Country / a post link.
  3. Set the mode's cap + filtersmaxCount* for budget, plus followers band / language / contact-info.
  4. Run — results stream into the dataset; download as CSV / JSON / Excel.

Minimal Mode 2 input (enrich a known list, no discovery):

{
"operationMode": "analyzeSpecificAccounts",
"specificUsernamesList": ["openai", "anthropic", "deepmind"],
"maxCountList": 5
}

🧭 When to use it

  • Lead generation — find businesses or creators in a niche by category, follower band, and contact-info presence.
  • Influencer marketing — surface ER + Quality + Reels-views/followers ratio across thousands of micro-influencers in one sweep.
  • Competitor research — audit a competitor's followers + following + commenters for partnership-ready accounts.
  • Niche audit — discover sub-niches (e.g. narrowing "wellness" → "recipe creators") via bio-keyword whitelists.
  • Audience expansion — start from 1–5 seed handles and expand via Instagram's similar-graph; pair with location for geo + thematic targeting.
  • Campaign audience reports — turn a post or reel into the list of accounts that actually liked or commented on it, enriched with contact details for follow-up.

🎯 Example tasks

Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):

🛠 Input

Inputs are grouped into 4 sections in the Apify Console UI; the in-band help text on each field explains the consequence of each setting.

SectionWhat it controls
🎯 Mode 1–6 inputsTargets / lists / seeds / queries / location seeds / post links + per-mode cost cap (maxCount / maxCountList / …)
⚙️ Data ExtractionEmail / phone / website / category / address / quality / posts / contacts-from-posts
🔬 Advanced FilteringFollower band, ER, language, category, keyword + location, contact-info, recency, Reels ratio, account type
▶️ Run & StorageclearSavedData (resume vs fresh)

Highlight fields:

  • operationMode — required; selects which mode runs. Only that mode's input section is read — values typed into another mode's fields are ignored, which is the single most common cause of a zero-row run.
  • maxCount<Mode> — hard cost ceiling for the mode (each profile = $0.01).
  • analyzeQuality — set true for Median ER + Quality + Avg Likes/Comments + Posts-per-Month columns; costs an extra API call per profile.
  • categoryFilter — restrict to one of 1090+ Instagram business categories. MCP clients see only the first ~10 enum entries due to truncation; programmatic callers can pass any exact value.
  • filterCombinationAND (default) requires both keyword AND category; OR rescues niches where most accounts don't set a category but mention the keyword in bio.
  • clearSavedData — leave true for fresh runs; uncheck to resume from KVS checkpoint.

💰 How much will scraping Instagram cost?

You're billed per profile, not per API call. Charges only on successful extractions; failed requests don't count.

EventPriceTrigger
Profile Analyzed$0.01Each profile retrieved and analyzed, regardless of whether it passed filters
User List Fetched$0.10Full followers/following list pulled for one target account (Mode 1)

Math at a glance:

VolumeModeCost
50 profilesany$0.50
500 profilesMode 3 network expansion$5.00
1 000 followers of 1 targetMode 1 (1 list + 1 000 profiles)$10.10
5 000 profilesany$50.00

What filters do to your bill

Filters run after each profile is retrieved, because deciding whether a profile matches requires reading it first. So filters narrow your results, not your bill — a run with strict filters can retrieve 40 profiles, keep 3, and charge for all 40.

Three things follow from that, and all three work in your favour:

  • Your first run is free of filter mistakes. On your very first run with this Actor, profiles rejected by your filters are not charged until the run finds its first match (up to 100 of them). Set the filters you want and find out what they really do, without paying to learn it. Once a profile matches, your filters are working and the rest of the run bills normally.
  • Every profile you pay for is saved — including the rejected ones. Nothing you paid to retrieve is thrown away.
  • Re-filtering is free. Turn on Enable Offline Mode and run again: the Actor re-applies your new filter values to the profiles it already retrieved, makes no requests, and charges nothing. If a run comes back empty, this is the cheap way to fix it — and on the free plan it does not use up a monthly run.

Unreadable accounts are never billed at all: not-found, private, and errored retrievals release their charge.

🆓 Free vs paid plan

CapabilityFree planPaid plan
Profiles per run (Mode 1/2)up to 50unlimited (cap via maxCount*)
Profiles per run (Mode 3/4/5/6)up to 5unlimited
Runs per monthup to 15 (resets on the 1st)unlimited
Median ER + Quality + Avg Likes/Comments
Reels analytics (Median Views, Views/Followers Ratio, Last Reel)
All filters applied (engagement, Reels, posts-in-period, …)
Resume interrupted runs

The free plan returns the same data quality as paid — every column and every filter works; the difference is volume (profiles per run + runs per month). When a free run hits a ceiling, the run's USER_MESSAGE record says exactly what was held back (e.g., how large your targets' lists really are, or that discovery stopped at the cap). Free plan includes a $5 monthly platform credit; demo/test runs don't count against the monthly run allowance.

🧪 Filter recipes

Drop these straight into the input editor. Each one is sized for the maxCount* shown — every filter you stack cuts the share of candidates that survive, so if you lower the cap, drop a filter or two with it. A five-filter recipe over 2 000 candidates is comfortable; the same five over 10 candidates usually returns nothing.

Food / Restaurant micro-influencers (Mode 3):

{
"operationMode": "networkExpansion",
"startUsernames": ["foodnetwork", "tasty", "gordonramsay"],
"maxCountExpansion": 500,
"minFollowers": 10000, "maxFollowers": 250000,
"minEngagementRate": 2, "lastPostDays": 30,
"extractEmail": true, "analyzeQuality": true
}

Active English-speaking fitness creators (Mode 4):

{
"operationMode": "keywordDiscovery",
"searchQueries": ["fitness coach", "personal trainer"],
"searchHashtags": ["fitnessmotivation", "personaltrainer"],
"maxCountDiscovery": 200,
"profileLanguage": "English", "minFollowers": 10000,
"filterCombination": "OR", "extractEmail": true
}

Post-campaign audience report (Mode 6):

{
"operationMode": "postEngagementDiscovery",
"postUrls": [
"https://www.instagram.com/p/CA2aJYrg6cZ/",
"https://www.instagram.com/reel/CB3bKZsh7dY/"
],
"engagementType": "both",
"maxCountEngagers": 300,
"minFollowers": 1000,
"extractEmail": true
}

Sort the result by Posts Engaged to put the people who engaged with more than one of your posts at the top — they are the warmest names in the list. Use "engagementType": "commenters" when you need a set you can verify is complete.

B2B partnership shortlist (Mode 1, mutual-follow surfaced automatically):

{
"operationMode": "analyzeFollowersFollowing",
"targetUsernames": ["competitor1", "competitor2", "competitor3"],
"analyzeFollowers": true, "maxCount": 2000,
"minFollowers": 1000, "maxFollowers": 100000,
"accountType": "business", "hasWebsite": true,
"contactInfoType": "emailOrPhone"
}

🔁 Resume / checkpoint

Long Mode 1 runs (10K+ followers) sometimes get interrupted by network blips or platform restarts. Click Resurrect in the Apify Console to continue.

The actor detects the resume from the run's resurrectCount AND on-disk checkpoint-* records, and skips the wipe regardless of network conditions. The run continues from the exact profile it stopped at — no re-fetching, no double-charging. To start fresh anyway, leave clearSavedData checked (default).

📡 Live status & storage records

The actor exposes a live progress page (Apify Console → Live View) and writes named records to the run's Key-Value Store:

RecordPurpose
RUN_SUMMARYEnd-of-run stats (status, profiles found/analyzed, cost, free-tier limits, and apiUsage). Fetch via Actor.getValue('RUN_SUMMARY').
API_USAGEPer-run count of upstream API requests, split into data fetches vs searches ({ totalRequests, byCategory: { fetch, search } }). Lets tools integrating this actor see how much upstream work each run performed. Fetch via Actor.getValue('API_USAGE').
USER_MESSAGEOnboarding tip on a paid user's 1st and 3rd paid run; absent on free runs and test runs.
FREE_LIMITS_APPLIEDStable id codes for free-plan caps applied this run. Empty/omitted on paid runs.
status.htmlAuto-refreshing HTML view of current run progress; also exposed as a live URL while the run is active.
SKIPPED_ACCOUNTSPer-account list of usernames skipped during the run, with reason and category (filter / not_found / private / error).
checkpoint-*Resume state for interrupted runs (internal — safe to ignore).

🤖 Programmatic / API use

REST — start a run:

curl -X POST "https://api.apify.com/v2/acts/afanasenko~instagram-profile-scraper/runs?token=<APIFY_TOKEN>" \
-H 'Content-Type: application/json' \
-d '{"operationMode":"analyzeSpecificAccounts","specificUsernamesList":["openai"],"maxCountList":1}'

Then poll GET /v2/actor-runs/{id} until status is SUCCEEDED, and read rows from GET /v2/datasets/{defaultDatasetId}/items?clean=1.

Run-level stats live in the RUN_SUMMARY record of the same run:

$curl "https://api.apify.com/v2/key-value-stores/<defaultKeyValueStoreId>/records/RUN_SUMMARY?token=<APIFY_TOKEN>"

MCP — connect Claude / your AI agent to https://mcp.apify.com and ask: "Find me 200 Spanish-speaking veterinarians on Instagram with ≥ 50K followers and email contact info." The agent picks this actor, fills the input, and streams results back.

❓ FAQ

How much does it cost to scrape Instagram? $0.01 per profile analyzed (regardless of filter pass/fail) + $0.10 per followers/following list pulled in Mode 1. Free plan includes a $5 monthly credit, caps Modes 3/4/5/6 at 5 profiles per run, and allows 15 runs per month.

My run returned 0 rows and my filters rejected everything. Do I have to pay again to fix it? No. The profiles are already saved, including the rejected ones. Open the run's Input tab, turn on Enable Offline Mode, loosen the filter the run's USER_MESSAGE record names, and start it again — re-filtering makes no requests and charges nothing. If that run was your first with this Actor, you were not charged for the rejected profiles in the first place.

Is it legal to scrape Instagram profiles, and do I need an Instagram account? Yes, it's legal — this actor reads only publicly available data (public profiles, public bios, public post captions, public business contact fields). No Instagram account or login required. Compliance with Instagram's ToS, GDPR, CCPA, and CAN-SPAM is the operator's responsibility.

How is engagement rate calculated? Average of likes + comments on the most recent ~12 posts, divided by follower count, formatted as "X.XX%". Set analyzeQuality: true to populate Median ER + Quality.

Why "N/A" instead of null for missing values? Consistency — every always-emitted column key is present on every row, so Google Sheets / Airtable / CSV consumers don't need null-checks. Conditional columns (e.g. Email when extractEmail: false) are omitted entirely.

How fast is it, and what if a target account is private or doesn't exist? ~150–300 profiles/min depending on enrichment flags. Private or non-existent accounts are skipped and logged in SKIPPED_ACCOUNTS KVS, with no charge.

Can I resume an interrupted run? Yes — click Resurrect in the Apify Console. The actor reuses the on-disk checkpoint records and continues from the exact profile it stopped at, with no re-fetching and no double-charging.

Do I need to log in or provide session cookies? No. The actor never asks for your Instagram login, password, or session cookies — it reads public data only. There is no account of yours involved, so there is nothing to get flagged or banned.

Can I analyze thousands of profiles in bulk? Yes — Mode 2 takes a pasted list of any size and enriches every profile in one run (paid plans; the free plan analyzes up to 50 per run). Set maxCountList as a hard cost ceiling, and use Resurrect to continue an interrupted batch from where it stopped.

I selected one mode but the run returned zero rows — why? Almost always because the input went into a different mode's section. All 6 mode sections stay visible in the Apify Console form, and the run reads only the section belonging to the mode in the operationMode dropdown. Pick Mode 6 but paste your handles into Mode 2's list, and Mode 6 runs with no post links and returns nothing. Check that the section labelled with your selected mode is the one you filled; the run's USER_MESSAGE record names the field it expected.

Why did a post with 90 000 likes return only ~1 500 likers? Instagram serves a post's likers as a single ranked sample and provides no way to page past it, so on a high-engagement post you get part of the list, not all of it. Every row you do get is real — a capped sample leaves accounts out, it never invents them. The run writes an ENGAGEMENT_COVERAGE record stating, per post, how many likers came back against the post's like count. Comments behave differently: they are read page by page, so setting Engagement Type to Commenters only gives you a set you can verify is complete. Private accounts are also skipped before analysis — Instagram publishes no profile data for them, so they are never fetched and never billed.

Can I run it on a schedule? Yes — create an Apify Schedule on this actor (Console → Schedules) to refresh a niche list daily or weekly. Schedules work on the free plan too; each scheduled run bills and counts like a normal run.

How do I get more results per run? Three levers, in order: (1) make sure you filled the input section of the mode you selected — each mode reads only its own fields; (2) loosen filters — they run after profiles are fetched, so tight combinations reject most of the harvest (the run's USER_MESSAGE record names the exact filters that rejected the most); (3) in Mode 4, raise maxSearchPagesPerQuery and add broader terms. On the free plan, runs stop at 50 profiles (Modes 1–2) or 5 (Modes 3–6) — a paid plan lifts those ceilings.

🔗 Other Instagram scrapers (same author)

You start with…You want to find…Use this actor
Handles / post links / locations / hashtags / keywordsProfiles via 6 discovery modes in one toolThis actor — 6-mode all-in-one
One known accountThe full list of its followers and/or followingInstagram Followers & Following Extractor
One known accountTrack who follows / unfollows it over time (scheduled change tracking)Instagram Follower Tracker
1–5 seed handlesSimilar profiles via «Suggested for You»Instagram Related Profiles Scraper
A reel link or a creator handleWhat their reels say and show — spoken transcript, on-screen text, hookInstagram Reel Script Extractor
An AI agent (Claude, Cursor, ChatGPT)The same Instagram data from inside your agent — MCP tools it picks by intentInstagram Profile MCP Server
TikTok creators instead of InstagramThe same discover-and-enrich workflow on TikTok — followers, engagement, emailsTikTok Profile Scraper

🛟 Support & feedback

Use the Issues tab on this actor's Apify Console page to report a bug or request a feature: https://console.apify.com/actors/r4hZOdD5FiHYo1bYa/issues. Please include Run ID, input configuration (redact sensitive values), expected vs. actual behaviour, and any error messages from the run log.

Store page: https://apify.com/afanasenko/instagram-profile-scraper.

Yes — the actor scrapes only publicly available Instagram data (public profiles, public bios, public post captions, public business contact fields). It does not log in to Instagram, access private accounts, read DMs, or bypass any access controls.

Compliance with Instagram's Terms of Service, GDPR, CCPA, CAN-SPAM and any other applicable laws is the operator's responsibility. Data is volatile — Instagram schemas, categories, and pricing change without notice; verify critical fields against the live profile before acting on them. No legal advice provided.