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.2
(9)
Developer
Andrey Afanasenko
Maintained by CommunityActor stats
64
Bookmarked
1.6K
Total users
93
Monthly active users
7.9 hours
Issues response
15 hours 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. Five 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
operationModedropdown. 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 nostartUsernamesseeds to expand from, so the run returns zero rows. All 5 mode sections stay visible regardless of your choice — fill only the section labelled with your selected mode.
Five independent discovery modes — pick what matches the input you already have:
| Mode | Input | What it returns |
|---|---|---|
| 1: Analyze Followers / Following | 1+ competitor handles | Their followers and/or following, enriched. Mutual Follow flag for warm leads (≥ 2 targets). Cost cap: maxCount. |
| 2: Analyze a Specific List | List of usernames | Full enrichment of a known list — no discovery. Cost cap: maxCountList. |
| 3: Network Expansion | 3–5 seed handles | Hundreds of similar profiles via Instagram's «Suggested for You» graph. Cost cap: maxCountExpansion. |
| 4: Keyword / Hashtag Discovery | Search queries / hashtags | Search-result authors + top-post hashtag authors, merged round-robin. Cost cap: maxCountDiscovery. |
| 5: Location Discovery | City, Country seeds | Creators tagging posts at specific places, with Tagged Location column. Cost cap: maxCountLocation. |
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), 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
- 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, or a hashtag / search query /
City, Country. - Set the mode's cap + filters —
maxCount*for budget, plus followers band / language / contact-info. - 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.
🛠 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) |
Highlight fields:
operationMode— required; selects which mode runs.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.filterCombination—AND(default) requires both keyword AND category;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.
💰 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.
| Event | Price | Trigger |
|---|---|---|
| Profile Analyzed | $0.01 | Each profile retrieved 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 |
Server-side filters (maxFollowers, minFollowers, lastPostDays, profileLanguage, bio keywords, categoryFilter) run before the $0.01 event — over-cap, off-language, or off-keyword candidates cost nothing.
🆓 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) | ❌ | ✅ |
| Resume interrupted runs | ✅ | ✅ |
Free plan includes a $5 monthly credit. Upgrade to a paid plan for unlimited cap, Reels analytics, and volume discovery via Modes 3/4/5.
🧪 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, "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}
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:
| Record | Purpose |
|---|---|
RUN_SUMMARY | End-of-run stats (status, profiles found/analyzed, cost, free-tier limits applied, plus the apiUsage summary below). Fetch via Actor.getValue('RUN_SUMMARY'). |
API_USAGE | Per-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_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). |
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
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 and caps Modes 3/4/5 at 5 profiles per run.
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.
🔗 Other Instagram scrapers (same author)
| You start with… | You want to find… | Use this actor |
|---|---|---|
| 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 |
| One known account | Track who follows / unfollows it over time (scheduled change tracking) | Instagram Follower Tracker |
| 1–5 seed handles | Similar profiles via «Suggested for You» | Instagram Related Profiles Scraper |
| An AI agent (Claude, Cursor, ChatGPT) | The same Instagram data from inside your agent — MCP tools it picks by intent | Instagram Profile MCP Server |
🛟 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.
⚖️ Is it legal to scrape Instagram?
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.