Instagram Profile Scraper
Pricing
Pay per event
Instagram Profile 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
Pay per event
Rating
4.6
(9)
Developer
Andrey Afanasenko
Actor stats
59
Bookmarked
1.5K
Total users
119
Monthly active users
8.9 hours
Issues response
an hour ago
Last modified
Categories
Share
Instagram Profile Scraper — 5-Mode All-in-One
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, and creators tagged at any city or place. $0.01 per profile, $0.10 per followers/following list.
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
Input — pick one of 5 modes and feed it whatever you have: target usernames (Mode 1), a list of accounts to enrich (Mode 2), 1–5 seed handles to expand from (Mode 3), search queries / hashtags (Mode 4), or City, Country seeds (Mode 5).
Output — one row per profile, regardless of mode, with up to 38+ columns: bio, language, follower/following counts, business category, contacts (email + phone + website + address), Reels metrics (count, last reel age, median views, views/followers ratio), posting cadence, an Excellent/Good/Average/Poor quality flag, recent post captions, and contacts parsed from those captions.
Filters narrow the result set before paid analysis runs: follower band (min/max), engagement rate, language, account type (business/personal), business category (1090+ values), keyword (in bio / name / posts), location keyword, contact-info presence, recency (last post / last reel), Reels-views/followers ratio band, posts-in-period frequency, verified-only, has-website, plus a category↔keyword AND/OR combinator with a Matched By column showing which filter let each row through.
Discovery workflows — combine 2–3 modes in parallel for niche audience curation: Mode 4 seeds the funnel from zero, Mode 3 rides Instagram's suggested-graph from your size-matched seeds, Mode 1 (analyzeFollowing=true) digs deeper from any thematic micro-seed Round 1 surfaced. Dedup datasets by Account URL across runs to avoid re-paying for known handles.
📦 What you get — output sample
Every row has the same shape across modes; columns appear/disappear based on the mode + extraction flags you set. Missing optional values come back as the string "N/A" rather than null. See .actor/dataset_schema.json for the full per-column declaration.
Mode 3 — Network Expansion (food creator):
{"Account": "https://instagram.com/chef.maria.recipes","Source": "Network Expansion of foodnetwork","Full Name": "Maria Rodriguez — Food Creator","Followers Count": 45300,"Following Count": 1200,"Biography": "🍳 Chef & Recipe Developer | 📧 collabs@chefmaria.com | 📍 Los Angeles","Email": "collabs@chefmaria.com","Email Source": "bio","External URL": "https://linktr.ee/chefmaria","Category": "Chef","Detected Language": "English","Reels Count": 142,"Median Views": 18500,"Views/Followers Ratio": "40.85%","Median ER": "2.45%","Quality": "Good","Last Post Within (Days)": 1,"Last Reel (Days Ago)": 3}
Mode 1 — Multi-target with Mutual Follow:
{"Account": "https://instagram.com/marketing.pro.sarah","Source": "competitor1 followers","Mutual Follow": "Yes","Full Name": "Sarah Chen — Marketing Consultant","Followers Count": 23400,"Email": "sarah@marketingpro.com","Category": "Business Consultant","Median ER": "1.85%","Quality": "Good"}
Mode 5 — Location Discovery (UK creator):
{"Account": "https://instagram.com/londonfoodie","Source": "Location: London, UK","Tagged Location": "London, England","Full Name": "London Foodie","Followers Count": 78400,"Category": "Food & Beverage","Detected Language": "English","Median Views": 28500,"Views/Followers Ratio": "36.35%","Quality": "Excellent"}
⚡ Quick start
- Choose Mode in the operation-mode dropdown (Mode 3 — Network Expansion is the easiest first run)
- Add seeds / targets — 1–5 Instagram usernames in your niche
- Set a cap — start small (
maxCountExpansion: 100) to validate filters - Add filters — minimum followers, language, contact-info type
- 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}
🧭 How to use it (in one screen)
- Choose Operation Mode: Followers/Following · Specific List · Network Expansion (Similar) · Keyword Discovery · Location Discovery.
- Inside Selected Mode: enter an Instagram handle (e.g.,
claudeai) or your seed list, hashtag/keyword/City, Countryas the mode requires → set the mode'smaxCount*cap. - Tuning: ⚙️ Data Extraction (post fetch · contact deep search · language detection) + 🔬 Advanced Filtering (followers · engagement · contact info · recency).
→ 💡 Tips & Best Practices for cost, performance, and data-quality patterns.
⭐ Choose your mode
The actor is one Docker container that runs five independent discovery modes. Pick the one that matches what you already have:
👥 Mode 1 — Analyze Followers/Following
Best for: auditing one or several competitors' audiences.
Input : 1+ competitor handles → analyzeFollowers / analyzeFollowingOutput : their followers and/or following, enrichedMutual : pass several handles to surface profiles that follow ≥ 2 of themTime : 20–90 min depending on follower countsStrategy : best as Round 2 — feed 5–10 thematic micro-seeds from a Round 1 sweep with analyzeFollowing=true; their following lists are curated peer experts (followers list alone is too noisy).
When more than one target is supplied, the Mutual Follow column flags the warm-lead segment.
📋 Mode 2 — Analyze a Specific List
Best for: enriching a known list of accounts.
Input : list of usernames (no discovery)Output : full profile data + contactsTime : 5–15 min for 200 prospects
🔍 Mode 3 — Network Expansion
Best for: finding hundreds of similar profiles automatically.
Input : 3–5 seed handlesOutput : Instagram's «Suggested for You» graph expanded into a listTime : ~5 min for 400 profilesStrategy : seeds must be your target size or smaller — the suggested-graph leans larger than the seed. Capping maxFollowers low + seeding from large accounts returns 0 valid items.
🔎 Mode 4 — Discover by Keyword / Hashtag Search
Best for: entering a niche or language without seed accounts.
Input : search queries and/or hashtagsOutput : authors of search-result accounts + top-post hashtag authorsNotes : two sources merged round-robin so neither is starvedTime : 2–5 min for 100–200 candidatesStrategy : highest-yield Round 1 channel from zero. Tighten the bio `keywords` whitelist between runs to narrow a category ("wellness") to a sub-niche ("recipe creators") — drop role-nouns (coach/trainer/nutritionist), keep object-nouns (recipe/kitchen/homemade).
📍 Mode 5 — Discover by Location
Best for: finding creators who tag posts at specific places.
Input : "City, Country" seeds (e.g. "London, UK") or raw Instagram place IDsOutput : authors of recent + top-tagged media at the resolved placeNotes : country hint disambiguates same-named citiesTime : 3–7 min for 100–300 candidatesStrategy : pair with the bio `keywords` whitelist when your niche is geographic AND thematic ("Brooklyn vegan recipe creators") — location alone returns generalists.
The Tagged Location column shows which place seed surfaced each profile. Pair with niche keyword/category filters to narrow by industry.
🛠 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.
| Section | What it controls |
|---|---|
| 🎯 Mode 1–5 inputs | Targets / lists / seeds / queries / location seeds + per-mode cost cap (maxCount / maxCountList / …) |
| ⚙️ Data Extraction | Email / phone / website / category / address / quality / posts / contacts-from-posts |
| 🔬 Advanced Filtering | Follower band, ER, language, category, keyword + location, contact-info, recency, Reels ratio, account type |
| ▶️ Run & Storage | clearSavedData (resume vs fresh), enableOfflineMode |
Highlight fields:
operationMode— required; selects which mode runs.maxCount<Mode>— hard cost ceiling for the mode (each profile = $0.01).analyzeQuality— set true for the 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.filterCombination—AND(default) requires both keyword AND category to match;ORrescues 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.
💰 Pricing
Pay-per-event. Charges only on successful extractions; failed requests don't count.
| Event | Price | Trigger |
|---|---|---|
| Profile Analyzed | $0.01 | Each profile retrieved (API or cache) and analyzed, regardless of whether it passed filters |
| User List Fetched | $0.10 | Full followers/following list pulled for one target account (Mode 1) |
Math at a glance:
| Volume | Mode | Cost |
|---|---|---|
| 50 profiles | any | $0.50 |
| 500 profiles (Mode 3) | network expansion | $5.00 |
| 1 000 followers of 1 target (Mode 1) | 1 list + 1 000 profiles | $10.10 |
| 5 000 profiles | any | $50.00 |
Free plan: $5 monthly credit; up to 50 profiles per run on Mode 1/2 and up to 5 on Modes 3/4/5. Reels-derived metrics (median views, view/follower ratio) require a paid plan.
🆓 Free vs paid plan
| Capability | Free plan | Paid plan |
|---|---|---|
| Profiles per run (Mode 1/2) | up to 50 | unlimited (cap via maxCount*) |
| Profiles per run (Mode 3/4/5) | up to 5 | unlimited |
| Median ER + Quality + Avg Likes/Comments | ✅ | ✅ |
| Reels analytics (Median Views, Views/Followers Ratio, Last Reel) | ❌ | ✅ |
| Offline mode (re-filter cached data) | ✅ free | ✅ free |
| Resume interrupted runs | ✅ | ✅ |
🧪 Filter recipes
Drop these straight into the input editor:
Food / Restaurant micro-influencers (Mode 3):
{"operationMode": "networkExpansion","startUsernames": ["foodnetwork", "tasty", "gordonramsay"],"maxCountExpansion": 500,"minFollowers": 10000,"maxFollowers": 250000,"minEngagementRate": 2,"lastPostDays": 30,"extractEmail": true,"extractWebsiteUrl": 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,"lastPostDays": 14,"filterCombination": "OR","extractEmail": true,"analyzeQuality": true}
Multi-channel union pattern (end-to-end niche discovery): run the recipe above in parallel with a Mode 3 call — same filters, swap operationMode to networkExpansion and add startUsernames=[3 seeds your target size or smaller]. After both finish, merge datasets and dedup by Account URL. For Round 2, swap Mode 3 to analyzeFollowersFollowing with analyzeFollowing=true, targetUsernames = top thematic finds from Round 1.
B2B partnership shortlist (Mode 1, multi-target with mutual-follow):
{"operationMode": "analyzeFollowersFollowing","targetUsernames": ["competitor1", "competitor2", "competitor3"],"analyzeFollowers": true,"analyzeFollowing": false,"maxCount": 2000,"minFollowers": 1000,"maxFollowers": 100000,"accountType": "business","contactInfoType": "emailOrPhone","hasWebsite": true,"lastPostDays": 30}
Local creators in UK cities (Mode 5):
{"operationMode": "locationDiscovery","locationSeeds": ["London, UK", "Manchester, UK", "Bristol, UK"],"maxCountLocation": 200,"minFollowers": 20000,"viewFollowerRatioMin": 5,"viewFollowerRatioMax": 30,"extractEmail": true,"analyzeQuality": true}
🔁 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 two independent signals — the run's resurrectCount from the Apify API and prior checkpoint-* records on disk — 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) — it wipes the KVS cache and the checkpoint records.
🧊 Offline mode
Re-filter previously extracted data with no API cost: enable enableOfflineMode and re-run. The actor reads cached profile records from KVS and applies your current filters.
Step 1 — broad extraction Settings: Mode 3, 400 profiles, minimal filters → cost ~$4Step 2 — offline filter pass #1 Filter: emails only → 230 results, $0.00Step 3 — offline filter pass #2 Filter: + ER ≥ 2% → 180 results, $0.00Step 4 — offline filter pass #3 Filter: + last post ≤ 7 days → 95 results, $0.00
Useful for A/B testing audience criteria without burning credits.
📡 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:
| Record | Purpose |
|---|---|
RUN_SUMMARY | End-of-run stats (status, profiles found/analyzed, cost, free-tier limits applied). Fetch via Actor.getValue('RUN_SUMMARY'). |
USER_MESSAGE | Onboarding tip on a paid user's 1st and 3rd paid run; absent on free runs and test runs. |
FREE_LIMITS_APPLIED | Stable id codes for free-plan caps applied this run. Empty/omitted on paid runs. |
status.html | Auto-refreshing HTML view of current run progress; also exposed as a live URL while the run is active. |
SKIPPED_ACCOUNTS | Per-account list of usernames skipped during the run, with reason and category (filter / not_found / private / error). Useful for re-running the error cohort. |
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.
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
Do I need an Instagram account to use this? No. Public data only — no login.
How is engagement rate calculated?
Average of likes + comments on recent ~12 posts, divided by follower count, expressed as "X.XX%". Set analyzeQuality: true to populate the Median ER + Quality columns.
What does the Quality flag mean? A coarse classification per follower band — Excellent / Good / Average / Poor — based on the engagement rate vs. industry benchmarks for the size cohort.
Why are some Reels metrics blank ("N/A")? Either the profile has no recent Reels, or you're on a free plan (Reels analytics require a paid plan).
Why "N/A" instead of null for missing values?
Consistency — every always-emitted column key is present on every row, so consumers don't need null-checks. Conditional columns (e.g. Email when extractEmail: false) are omitted entirely.
Can I scrape stories, posts, or DMs?
Stories — no. Recent post captions — yes (extractPosts: true populates Post 1..8). DMs — no, never.
Can I resume an interrupted run? Yes — click Resurrect in the Apify Console. The actor reuses the checkpoint records in KVS and continues from the exact profile it stopped at, with no re-fetching and no double-charging.
What if a target account is private or doesn't exist?
Skipped + logged in SKIPPED_ACCOUNTS KVS, no charge.
When should I use AND vs OR for category + keyword filters?
AND (default) — both filters must match (strict, fewer false positives). OR — either passes (rescues niches where most accounts don't set a business category but mention the keyword in bio). The Matched By column tells you which filter rescued each profile.
How fast is it?
~150–300 profiles/min depending on enrichment flags. Quality analysis (analyzeQuality: true) and post extraction (extractPosts: true) each add an extra API call per profile.
Discovering micro-creators in a niche from scratch — which mode?
Start with Mode 4 + a maxFollowers cap (highest-yield Round 1 channel from zero). Once you have 5–10 thematic finds, fire Mode 3 seeded from those AND/OR Mode 1 analyzeFollowing on them — see the multi-channel pattern in Filter recipes.
Mode 3 returns 0 valid items when I cap maxFollowers low — why?
Instagram's similar-account graph leans larger than the seed. Re-seed from accounts your target size or smaller (use Round 1 output as input).
How do I narrow from "wellness" to "recipes only" between sweeps?
Tighten the bio keywords whitelist: drop role-nouns (coach, trainer, nutritionist, dietitian), keep object-nouns (recipe, kitchen, homemade, cookbook). Bio match runs server-side before any paid event.
Do filters charge before or after the paid event?
maxFollowers, minFollowers, lastPostDays, profileLanguage, bio keywords, categoryFilter all run server-side before the $0.01 event — over-cap, off-language, or off-keyword candidates cost nothing. Set caps to budget ÷ $0.01.
🔗 Other Instagram scrapers (same author)
| You start with… | You want to find… | Use this actor |
|---|---|---|
| Anything: handles / locations / hashtags / keywords | Profiles via 5 discovery modes in one tool | This actor — 5-mode all-in-one |
| One known account | The full list of its followers and/or following | Instagram Followers & Following Extractor |
| 1–5 seed handles | Similar profiles via «Suggested for You» | Instagram Related Profiles 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.
When opening an issue please include:
- Run ID
- Input configuration (redact sensitive values)
- Expected vs. actual behaviour
- Any error messages from the run log
Store page: https://apify.com/afanasenko/instagram-profile-scraper.
💡 Tips & Best Practices
🎯 Getting Maximum Results
Start Smart & Scale Gradually:
- Begin with 50-100 profiles to test filters and validate results
- Use Network Expansion with diverse starting accounts for broader discovery
- Monitor first runs closely to optimize settings before scaling up
- Test different seed account combinations to discover new audience segments
Optimize Your Filtering Strategy:
- Layer multiple criteria: follower count + engagement + contact info + recent activity
- Use engagement filters to identify authentic audiences vs. purchased followers
- Enable post extraction for better contact discovery and language detection
- Set realistic ranges — avoid overly broad or narrow follower requirements
💰 Cost Optimization Strategies
Smart Budget Management:
- Set the mode's max-count cap (
maxCount,maxCountList,maxCountExpansion,maxCountDiscovery, ormaxCountLocation) to control costs upfront - Server-side filters run before the $0.01 paid event —
maxFollowers,lastPostDays,profileLanguage, biokeywords,categoryFilterall gate for free; set them aggressively - Apply strategic filters to reduce processed profile count
- Use Network Expansion instead of multiple follower extractions (more efficient)
- Test with small batches before committing to large extractions
Maximize Your Investment:
- Cache benefits — rerun with different filters using stored data via offline mode (no extra cost)
- Focus extraction on only needed data fields to optimize processing time
- Use higher-tier Apify plans for volume discounts on large projects
⚡ Performance Optimization
Sizing & Pacing:
- Allow 1–2 hours for large follower extractions (5 000+ accounts)
- Use appropriate batch sizes: 500–2 000 profiles for optimal speed
Technical Best Practices:
- Monitor memory usage in logs during long runs
- Resume is automatic on Resurrect — use it instead of restarting from scratch
- Don't set
maxCounttoo high for follower scraping (recommend 1 000–5 000 per target) - Use proxy configuration for improved reliability on large volumes
🔍 Data Quality & Validation
Ensure Accuracy:
- Spot-check 5–10 results manually against actual Instagram profiles
- Cross-reference extracted emails with profile content for validity
- Use Deep Search (
deepSearchContacts: true) to find additional contacts in post captions - Validate engagement rates by manually checking recent posts on sample profiles
Contact Data Best Practices:
- Verify email formats before using in outreach campaigns
- Cross-check multiple sources (profile emails vs. post-extracted contacts)
- Respect contact preferences and include unsubscribe options
- Use double opt-in processes for email-marketing compliance
⚖️ Disclaimer
This actor collects only publicly available Instagram data (public profiles, public bios, public post captions, public business contact fields). It does not log in to Instagram, does not access private accounts, does not read DMs, and does not 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.
