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
Actor stats
0
Bookmarked
3
Total users
0
Monthly active users
3.6 days
Issues response
16 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. It’s useful for influencer marketing agencies, brand partnership teams, and growth marketers.
✨ 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.
⚠️ 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/YOUR_ACTOR_ID/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('YOUR_ACTOR_ID').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
Private - Internal use only.