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
Actor stats
0
Bookmarked
5
Total users
1
Monthly active users
17 days
Issues response
2 months 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
constDEFAULT_MAX_PROFILES=50;constDEFAULT_MAX_CONCURRENCY=2;constDEFAULT_MAX_REQUEST_RETRIES=2;constDEFAULT_MAX_REQUESTS_PER_MIN=30;constMAX_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 =newApifyClient({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.
