Instagram Lead Qualifier
Pricing
from $100.00 / 1,000 qualified profiles
Instagram Lead Qualifier
Qualify Instagram influencers at scale. Input a list of profiles, get lead scores (0-100), engagement rates, follower counts, business emails, and niche matching. Tiered engagement thresholds auto-adjust by influencer size. Perfect for agencies and brand partnership teams.
Pricing
from $100.00 / 1,000 qualified profiles
Rating
5.0
(1)
Developer
Fatih İlhan
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Instagram Influencer Lead Qualification Actor
A high-performance Apify Actor that scrapes and qualifies Instagram influencer profiles based on customizable engagement metrics, follower thresholds, and niche relevance.
🎯 Overview
This actor takes a list of Instagram profiles and returns qualified leads with comprehensive engagement data, lead scores, and actionable recommendations. Built for influencer marketing agencies and brand partnership teams who are tired of manually vetting profiles: it filters out fake and bought-follower accounts using a view-to-follower ratio check, then hands you a ready-made lead score and contact/review/skip recommendation for every profile that passes — no spreadsheet math required.
✨ Features
- Multi-method data extraction: Uses Instagram's internal API (
feed_user+web_profile_info), HTML parsing, and meta tag fallbacks for maximum reliability. - Reel view-count metrics: Captures
play_counton video/Reel posts and derives a median view-to-follower ratio — a strong signal for authentic reach. - Intelligent lead scoring:
0–100score based on follower fit, engagement rate, niche match, and business email presence. - Tiered engagement thresholds: Automatically adjusts engagement expectations based on influencer tier (nano → mega).
- Strict qualification gating: Only profiles passing every filter are written to the dataset by default (
onlyOutputQualified). - Multilingual support: Parses follower counts in English, Turkish, Spanish, French, Indonesian, and more.
- Configurable throughput: Tune
maxConcurrencyandmaxRequestsPerMinuteto trade speed vs. rate-limit risk. - Anti-detection: iPhone 14 Pro device emulation with fingerprint randomization.
- Rate limit handling: Automatic abort after configurable rate limit threshold.
- Debug tools: Saves HTML dumps and screenshots for failed extractions.
📥 Input
Input schema
{"profiles": ["username1", "username2", "https://instagram.com/username3"],"sessionId": "YOUR_INSTAGRAM_SESSION_ID","minFollowers": 4500,"maxFollowers": 500000,"minEngagementRate": 1.5,"minViewToFollowerRatio": 30,"requireBusinessEmail": false,"nicheKeywords": ["fitness", "health", "wellness"],"onlyOutputQualified": true,"maxProfilesPerRun": 50,"maxConcurrency": 2,"maxRequestsPerMinute": 30,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
profiles | array | ✅ | - | Instagram usernames (without @) or full profile URLs |
sessionId | string | ✅ | - | Instagram session cookie (supports URL-encoded format) |
minFollowers | integer | ❌ | 1000 | Minimum follower threshold |
maxFollowers | integer | ❌ | null | Maximum follower threshold |
minEngagementRate | number | ❌ | 1.5 | Minimum engagement rate as percentage (e.g., 1.5 = 1.5%) |
minViewToFollowerRatio | number | ❌ | 0 | Minimum median Reel view count as percentage of followers (e.g., 30 = views ≥ 30% of followers). Set to 0 to disable. |
requireBusinessEmail | boolean | ❌ | false | Only qualify profiles with an email in bio |
nicheKeywords | array | ❌ | [] | Keywords to match in profile bio |
onlyOutputQualified | boolean | ❌ | true | Only write profiles that pass all filters to the dataset. Disable to inspect every profile with its skipReason. |
maxProfilesPerRun | integer | ❌ | 50 | Maximum profiles to process per run |
maxConcurrency | integer | ❌ | 2 | Parallel profile scrapes. Raise for speed, lower if rate-limited. |
maxRequestsPerMinute | integer | ❌ | 30 | Global rate cap for Instagram page loads. |
proxyConfiguration | object | ✅ | RESIDENTIAL | Apify proxy configuration |
📤 Output
Successful profile item
{"username": "fitness_influencer","profileUrl": "https://www.instagram.com/fitness_influencer/","followers": 125000,"following": 892,"posts": 1247,"bio": "🏋️ Certified Personal Trainer | 📧 collab@fitness.com","externalUrl": "https://linktr.ee/fitness_influencer","isVerified": false,"profilePicUrl": "https://instagram.com/...","recentPosts": [{"shortcode": "ABC123xyz","likeCount": 4521,"commentCount": 89,"timestamp": "2024-01-15T10:30:00.000Z","displayUrl": "https://...","isVideo": true,"viewCount": 38420,"productType": "clips"}],"avgLikes": 4200,"medianLikes": 4100,"avgComments": 85,"engagementRate": 0.0343,"engagementRatePct": 3.43,"postingFrequency": 0.85,"postingFrequencyLabel": "0.9 posts/day","medianViewCount": 38420,"viewToFollowerRatio": 0.3074,"viewToFollowerRatioPct": 30.74,"businessEmail": "collab@fitness.com","nicheMatchScore": 0.67,"leadScore": 78.5,"recommendation": "contact","qualified": true,"skipReason": null,"score_explanation": {"avg_likes_last_12": 4200,"engagement_rate": 0.0343,"engagement_rate_pct": 3.43,"engagement_formula": "engagement_rate = (median_likes + avg_comments) / followers","follower_count": 125000,"tier": "macro","expected_engagement": 1.0,"posting_frequency_per_day": 0.85,"posting_frequency_formula": "posts_per_day = post_count / (days_between_oldest_and_newest_post)","posts_sampled": 12,"median_view_count": 38420,"view_to_follower_ratio_pct": 30.74,"reason_summary": "Engagement: 3.43% | Expected for macro: 1.0% | Followers: 125,000 | Tier: macro | Posts/day: 0.85 (from 12 recent posts) | Median views: 38,420 (30.7% of followers)"},"inputType": "profileUrl","source": "https://www.instagram.com/fitness_influencer/","success": true,"scrapedAt": "2024-01-20T14:32:00.000Z"}
Failed profile item
{"username": "private_account","profileUrl": "https://www.instagram.com/private_account/","success": false,"error": "LOGIN_REQUIRED","errorCode": "LOGIN_REQUIRED","errorMessage": "Redirected to Login.","scrapedAt": "2024-01-20T14:33:00.000Z"}
📊 Lead Scoring System
Score components (0–100)
| Component | Weight | Description |
|---|---|---|
| Follower Fit | 40% | How well follower count matches target range |
| Engagement Rate | 25% | Engagement relative to tier-adjusted threshold |
| Niche Match | 20% | Bio keyword matches / total keywords |
| Business Email | 10% | Has public email in bio |
| Verified Badge | 5% | Instagram verification status |
Recommendations
| Score range | Recommendation | Action |
|---|---|---|
70–100 | contact | High priority lead, reach out immediately |
40–69 | review | Moderate fit, manual review recommended |
0–39 | skip | Does not meet qualification criteria |
Influencer tiers & engagement thresholds
The actor automatically adjusts engagement expectations based on follower count:
| Tier | Followers | Base threshold multiplier | Example (1.5% base) |
|---|---|---|---|
| Nano | <1K | 1.0x | 1.5% |
| Micro | 1K–10K | max(base, 5%) | 5.0% |
| Mid | 10K–100K | 1.0x | 1.5% |
| Macro | 100K–1M | 0.67x | 1.0% |
| Mega | 1M+ | 0.33x | 0.5% |
🧮 How metrics are computed
All metrics are derived from the 12 most-recent posts returned by Instagram's feed_user endpoint.
| Metric | Formula | Notes |
|---|---|---|
engagementRate | (medianLikes + avgComments) / followers | Median likes are used instead of mean to reduce skew from viral outliers. |
postingFrequency | postCount / daysBetween(oldestPost, newestPost) | Expressed as posts per day. postingFrequencyLabel auto-formats as posts/day, /week, or /month based on magnitude. |
medianViewCount | median(playCount) across video/Reel posts only | Only posts where media_type === 2 (Reels/video) contribute. null if no videos in the sample. |
viewToFollowerRatio | medianViewCount / followers | Strong authenticity signal — accounts with inflated followers typically get much lower ratios. |
nicheMatchScore | matchedKeywords / totalKeywords | Bio keyword overlap. 0.5 when no keywords configured. |
View-to-follower ratio filter
Set minViewToFollowerRatio: 30 to only qualify profiles where the median Reel view count ≥ 30% of followers. This is one of the most reliable signals for filtering out bought-follower accounts.
- Profiles with no video posts in the sample will be skipped with
skipReason: "no_video_view_data"when this filter is active. - Set to
0to disable the filter entirely.
🔐 Getting Your Session ID
- Open Instagram in Chrome and log in.
- Press
F12to open DevTools. - Go to Application → Cookies →
https://www.instagram.com. - Find the
sessionidcookie and copy its value. - Paste into the
sessionIdinput field.
Note: Session IDs can be either URL-encoded (with
%3A) or decoded (with:). Both formats are supported.
Why this is required: Instagram blocks profile and Reel data requests from logged-out sessions, so a valid sessionId is the only way to fetch the engagement data this actor scores. The session is used exclusively to make read-only requests for public profile data during your run — it is never stored, logged, or reused after the run ends. As with any tool that uses a session cookie, we recommend using a secondary/dedicated Instagram account rather than your primary one.
⚠️ Error Codes
| Code | Description | Resolution |
|---|---|---|
LOGIN_REQUIRED | Redirected to Instagram login | Provide a valid sessionId |
ACCESS_DENIED | Rate limited or blocked | Reduce maxRequestsPerMinute, use residential proxies |
PARSE_ERROR | Failed to extract profile data | Check debug HTML in the Key-Value Store |
Skip reasons (present on unqualified profiles)
skipReason | Meaning |
|---|---|
below_min_followers | Follower count under minFollowers |
above_max_followers | Follower count over maxFollowers |
below_min_engagement | Engagement rate below tier-adjusted threshold |
missing_business_email | requireBusinessEmail set but no email found in bio |
no_niche_match | None of nicheKeywords match the bio |
no_video_view_data | minViewToFollowerRatio set but profile has no Reels in sample |
below_min_view_to_follower_ratio | Median Reel views are under the required % of followers |
🛠️ Configuration Defaults
const DEFAULT_MAX_PROFILES = 50;const DEFAULT_MAX_CONCURRENCY = 2;const DEFAULT_MAX_REQUEST_RETRIES = 2;const DEFAULT_MAX_REQUESTS_PER_MIN = 30;const MAX_RATE_LIMIT_HITS = 3;
All of these can be overridden via input. If you see ACCESS_DENIED failures, drop maxConcurrency to 1 and maxRequestsPerMinute to 15.
📁 Debug Outputs
When extraction fails, the actor saves debug data to the Key-Value Store:
debug-html-{username}-{timestamp}- Full page HTMLscreenshot-{username}-{label}-{timestamp}- Page screenshot
Labels include: LOGIN_REDIRECT, BLOCKED_HARD, PARSE_FAIL, PARSE_ERROR.
🚀 Usage Example
Via Apify Console
- Navigate to the Actor in Apify Console.
- Fill in the input form with your profiles and session ID.
- Click Start.
- Download results from the Dataset tab.
Via API
curl -X POST "https://api.apify.com/v2/acts/seralifatih~IGLead/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"profiles": ["therock", "cristiano", "kyliejenner"],"sessionId": "YOUR_SESSION_ID","minFollowers": 100000,"minEngagementRate": 1.0,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}'
Via JavaScript SDK
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('seralifatih/IGLead').call({profiles: ['therock', 'cristiano'],sessionId: 'YOUR_SESSION_ID',minFollowers: 100000,proxyConfiguration: {useApifyProxy: true,apifyProxyGroups: ['RESIDENTIAL']}});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
📋 Best Practices
- Use residential proxies: Required for reliable Instagram access.
- Tune concurrency carefully: Default
2is a good balance. Raise toward4only with a fresh residential session; drop to1if you see repeatedACCESS_DENIED. - Batch appropriately: Process
25–50profiles per run. - Monitor session ID: Refresh if you see
LOGIN_REQUIREDerrors. - Respect rate limits: Actor auto-aborts after
3consecutive rate limit hits. - Use view-to-follower ratio for filtering:
minViewToFollowerRatio: 30is a very effective authenticity filter — bought-follower accounts rarely hit 30%.
📄 License
Commercial use permitted. Pay-per-event pricing on Apify.