Instagram Profile Scraper avatar

Instagram Profile Scraper

Pricing

Pay per event

Go to Apify Store
Instagram Profile Scraper

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

Andrey Afanasenko

Maintained by Community

Actor stats

59

Bookmarked

1.5K

Total users

119

Monthly active users

8.9 hours

Issues response

an hour ago

Last modified

Share

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

Apify Actor

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

  1. Choose Mode in the operation-mode dropdown (Mode 3 — Network Expansion is the easiest first run)
  2. Add seeds / targets — 1–5 Instagram usernames in your niche
  3. Set a cap — start small (maxCountExpansion: 100) to validate filters
  4. Add filters — minimum followers, language, contact-info type
  5. 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, Country as the mode requires → set the mode's maxCount* 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 / analyzeFollowing
Output : their followers and/or following, enriched
Mutual : pass several handles to surface profiles that follow ≥ 2 of them
Time : 2090 min depending on follower counts
Strategy : best as Round 2 — feed 510 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 + contacts
Time : 515 min for 200 prospects

🔍 Mode 3 — Network Expansion

Best for: finding hundreds of similar profiles automatically.

Input : 35 seed handles
Output : Instagram's «Suggested for You» graph expanded into a list
Time : ~5 min for 400 profiles
Strategy : 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.

Best for: entering a niche or language without seed accounts.

Input : search queries and/or hashtags
Output : authors of search-result accounts + top-post hashtag authors
Notes : two sources merged round-robin so neither is starved
Time : 25 min for 100200 candidates
Strategy : 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 IDs
Output : authors of recent + top-tagged media at the resolved place
Notes : country hint disambiguates same-named cities
Time : 37 min for 100300 candidates
Strategy : 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.

SectionWhat it controls
🎯 Mode 1–5 inputsTargets / lists / seeds / queries / location seeds + 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), 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.
  • filterCombinationAND (default) requires both keyword AND category to match; 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.

💰 Pricing

Pay-per-event. Charges only on successful extractions; failed requests don't count.

EventPriceTrigger
Profile Analyzed$0.01Each profile retrieved (API or cache) 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 profiles (Mode 3)network expansion$5.00
1 000 followers of 1 target (Mode 1)1 list + 1 000 profiles$10.10
5 000 profilesany$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

CapabilityFree planPaid plan
Profiles per run (Mode 1/2)up to 50unlimited (cap via maxCount*)
Profiles per run (Mode 3/4/5)up to 5unlimited
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 ~$4
Step 2 — offline filter pass #1 Filter: emails only → 230 results, $0.00
Step 3 — offline filter pass #2 Filter: + ER ≥ 2% → 180 results, $0.00
Step 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:

RecordPurpose
RUN_SUMMARYEnd-of-run stats (status, profiles found/analyzed, cost, free-tier limits applied). Fetch via Actor.getValue('RUN_SUMMARY').
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). 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 / keywordsProfiles via 5 discovery modes in one toolThis actor — 5-mode all-in-one
One known accountThe full list of its followers and/or followingInstagram Followers & Following Extractor
1–5 seed handlesSimilar 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, or maxCountLocation) to control costs upfront
  • Server-side filters run before the $0.01 paid event — maxFollowers, lastPostDays, profileLanguage, bio keywords, categoryFilter all 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 maxCount too 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.